Skip to content

Commit 4f700bc

Browse files
committed
Reorganize our CRC source files again.
Now that we use CRC-32C in WAL and the control file, the "traditional" and "legacy" CRC-32 variants are not used in any frontend programs anymore. Move the code for those back from src/common to src/backend/utils/hash. Also move the slicing-by-8 implementation (back) to src/port. This is in preparation for next patch that will add another implementation that uses Intel SSE 4.2 instructions to calculate CRC-32C, where available.
1 parent d577bb8 commit 4f700bc

File tree

25 files changed

+211
-181
lines changed

25 files changed

+211
-181
lines changed

contrib/hstore/hstore_gist.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "access/gist.h"
77
#include "access/skey.h"
88
#include "catalog/pg_type.h"
9-
#include "common/pg_crc.h"
9+
#include "utils/pg_crc.h"
1010

1111
#include "hstore.h"
1212

contrib/ltree/crc32.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#define TOLOWER(x) (x)
2121
#endif
2222

23-
#include "common/pg_crc.h"
23+
#include "utils/pg_crc.h"
2424
#include "crc32.h"
2525

2626
unsigned int

contrib/pg_trgm/trgm_op.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "catalog/pg_type.h"
1111
#include "tsearch/ts_locale.h"
1212
#include "utils/memutils.h"
13+
#include "utils/pg_crc.h"
1314

1415
PG_MODULE_MAGIC;
1516

src/backend/access/transam/twophase.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,8 +1023,8 @@ EndPrepare(GlobalTransaction gxact)
10231023
TwoPhaseFileHeader *hdr;
10241024
char path[MAXPGPATH];
10251025
StateFileChunk *record;
1026-
pg_crc32 statefile_crc;
1027-
pg_crc32 bogus_crc;
1026+
pg_crc32c statefile_crc;
1027+
pg_crc32c bogus_crc;
10281028
int fd;
10291029

10301030
/* Add the end sentinel to the list of 2PC records */
@@ -1034,7 +1034,7 @@ EndPrepare(GlobalTransaction gxact)
10341034
/* Go back and fill in total_len in the file header record */
10351035
hdr = (TwoPhaseFileHeader *) records.head->data;
10361036
Assert(hdr->magic == TWOPHASE_MAGIC);
1037-
hdr->total_len = records.total_len + sizeof(pg_crc32);
1037+
hdr->total_len = records.total_len + sizeof(pg_crc32c);
10381038

10391039
/*
10401040
* If the file size exceeds MaxAllocSize, we won't be able to read it in
@@ -1082,7 +1082,7 @@ EndPrepare(GlobalTransaction gxact)
10821082
*/
10831083
bogus_crc = ~statefile_crc;
10841084

1085-
if ((write(fd, &bogus_crc, sizeof(pg_crc32))) != sizeof(pg_crc32))
1085+
if ((write(fd, &bogus_crc, sizeof(pg_crc32c))) != sizeof(pg_crc32c))
10861086
{
10871087
CloseTransientFile(fd);
10881088
ereport(ERROR,
@@ -1091,7 +1091,7 @@ EndPrepare(GlobalTransaction gxact)
10911091
}
10921092

10931093
/* Back up to prepare for rewriting the CRC */
1094-
if (lseek(fd, -((off_t) sizeof(pg_crc32)), SEEK_CUR) < 0)
1094+
if (lseek(fd, -((off_t) sizeof(pg_crc32c)), SEEK_CUR) < 0)
10951095
{
10961096
CloseTransientFile(fd);
10971097
ereport(ERROR,
@@ -1135,7 +1135,7 @@ EndPrepare(GlobalTransaction gxact)
11351135
/* If we crash now, we have prepared: WAL replay will fix things */
11361136

11371137
/* write correct CRC and close file */
1138-
if ((write(fd, &statefile_crc, sizeof(pg_crc32))) != sizeof(pg_crc32))
1138+
if ((write(fd, &statefile_crc, sizeof(pg_crc32c))) != sizeof(pg_crc32c))
11391139
{
11401140
CloseTransientFile(fd);
11411141
ereport(ERROR,
@@ -1223,7 +1223,7 @@ ReadTwoPhaseFile(TransactionId xid, bool give_warnings)
12231223
int fd;
12241224
struct stat stat;
12251225
uint32 crc_offset;
1226-
pg_crc32 calc_crc,
1226+
pg_crc32c calc_crc,
12271227
file_crc;
12281228

12291229
TwoPhaseFilePath(path, xid);
@@ -1258,14 +1258,14 @@ ReadTwoPhaseFile(TransactionId xid, bool give_warnings)
12581258

12591259
if (stat.st_size < (MAXALIGN(sizeof(TwoPhaseFileHeader)) +
12601260
MAXALIGN(sizeof(TwoPhaseRecordOnDisk)) +
1261-
sizeof(pg_crc32)) ||
1261+
sizeof(pg_crc32c)) ||
12621262
stat.st_size > MaxAllocSize)
12631263
{
12641264
CloseTransientFile(fd);
12651265
return NULL;
12661266
}
12671267

1268-
crc_offset = stat.st_size - sizeof(pg_crc32);
1268+
crc_offset = stat.st_size - sizeof(pg_crc32c);
12691269
if (crc_offset != MAXALIGN(crc_offset))
12701270
{
12711271
CloseTransientFile(fd);
@@ -1302,7 +1302,7 @@ ReadTwoPhaseFile(TransactionId xid, bool give_warnings)
13021302
COMP_CRC32C(calc_crc, buf, crc_offset);
13031303
FIN_CRC32C(calc_crc);
13041304

1305-
file_crc = *((pg_crc32 *) (buf + crc_offset));
1305+
file_crc = *((pg_crc32c *) (buf + crc_offset));
13061306

13071307
if (!EQ_CRC32C(calc_crc, file_crc))
13081308
{
@@ -1545,7 +1545,7 @@ void
15451545
RecreateTwoPhaseFile(TransactionId xid, void *content, int len)
15461546
{
15471547
char path[MAXPGPATH];
1548-
pg_crc32 statefile_crc;
1548+
pg_crc32c statefile_crc;
15491549
int fd;
15501550

15511551
/* Recompute CRC */
@@ -1572,7 +1572,7 @@ RecreateTwoPhaseFile(TransactionId xid, void *content, int len)
15721572
(errcode_for_file_access(),
15731573
errmsg("could not write two-phase state file: %m")));
15741574
}
1575-
if (write(fd, &statefile_crc, sizeof(pg_crc32)) != sizeof(pg_crc32))
1575+
if (write(fd, &statefile_crc, sizeof(pg_crc32c)) != sizeof(pg_crc32c))
15761576
{
15771577
CloseTransientFile(fd);
15781578
ereport(ERROR,

src/backend/access/transam/xlog.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -862,7 +862,7 @@ XLogRecPtr
862862
XLogInsertRecord(XLogRecData *rdata, XLogRecPtr fpw_lsn)
863863
{
864864
XLogCtlInsert *Insert = &XLogCtl->Insert;
865-
pg_crc32 rdata_crc;
865+
pg_crc32c rdata_crc;
866866
bool inserted;
867867
XLogRecord *rechdr = (XLogRecord *) rdata->data;
868868
bool isLogSwitch = (rechdr->xl_rmid == RM_XLOG_ID &&
@@ -4179,7 +4179,7 @@ WriteControlFile(void)
41794179
static void
41804180
ReadControlFile(void)
41814181
{
4182-
pg_crc32 crc;
4182+
pg_crc32c crc;
41834183
int fd;
41844184

41854185
/*
@@ -4681,7 +4681,7 @@ BootStrapXLOG(void)
46814681
bool use_existent;
46824682
uint64 sysidentifier;
46834683
struct timeval tv;
4684-
pg_crc32 crc;
4684+
pg_crc32c crc;
46854685

46864686
/*
46874687
* Select a hopefully-unique system identifier code for this installation.

src/backend/access/transam/xloginsert.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ XLogRecordAssemble(RmgrId rmid, uint8 info,
459459
XLogRecData *rdt;
460460
uint32 total_len = 0;
461461
int block_id;
462-
pg_crc32 rdata_crc;
462+
pg_crc32c rdata_crc;
463463
registered_buffer *prev_regbuf = NULL;
464464
XLogRecData *rdt_datas_last;
465465
XLogRecord *rechdr;

src/backend/access/transam/xlogreader.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,7 @@ ValidXLogRecordHeader(XLogReaderState *state, XLogRecPtr RecPtr,
665665
static bool
666666
ValidXLogRecord(XLogReaderState *state, XLogRecord *record, XLogRecPtr recptr)
667667
{
668-
pg_crc32 crc;
668+
pg_crc32c crc;
669669

670670
/* Calculate the CRC */
671671
INIT_CRC32C(crc);

src/backend/replication/logical/snapbuild.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,7 +1391,7 @@ typedef struct SnapBuildOnDisk
13911391

13921392
/* data not covered by checksum */
13931393
uint32 magic;
1394-
pg_crc32 checksum;
1394+
pg_crc32c checksum;
13951395

13961396
/* data covered by checksum */
13971397

@@ -1634,7 +1634,7 @@ SnapBuildRestore(SnapBuild *builder, XLogRecPtr lsn)
16341634
char path[MAXPGPATH];
16351635
Size sz;
16361636
int readBytes;
1637-
pg_crc32 checksum;
1637+
pg_crc32c checksum;
16381638

16391639
/* no point in loading a snapshot if we're already there */
16401640
if (builder->state == SNAPBUILD_CONSISTENT)

src/backend/replication/slot.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ typedef struct ReplicationSlotOnDisk
5656

5757
/* data not covered by checksum */
5858
uint32 magic;
59-
pg_crc32 checksum;
59+
pg_crc32c checksum;
6060

6161
/* data covered by checksum */
6262
uint32 version;
@@ -1075,7 +1075,7 @@ RestoreSlotFromDisk(const char *name)
10751075
int fd;
10761076
bool restored = false;
10771077
int readBytes;
1078-
pg_crc32 checksum;
1078+
pg_crc32c checksum;
10791079

10801080
/* no need to lock here, no concurrent access allowed yet */
10811081

src/backend/utils/adt/tsgistidx.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "access/gist.h"
1818
#include "access/tuptoaster.h"
1919
#include "tsearch/ts_utils.h"
20+
#include "utils/pg_crc.h"
2021

2122

2223
#define SIGLENINT 31 /* >121 => key will toast, so it will not work

src/backend/utils/adt/tsquery.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414

1515
#include "postgres.h"
1616

17-
#include "common/pg_crc.h"
1817
#include "libpq/pqformat.h"
1918
#include "miscadmin.h"
2019
#include "tsearch/ts_locale.h"
2120
#include "tsearch/ts_utils.h"
2221
#include "utils/builtins.h"
2322
#include "utils/memutils.h"
23+
#include "utils/pg_crc.h"
2424

2525

2626
struct TSQueryParserStateData

src/backend/utils/cache/relmapper.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ typedef struct RelMapFile
8686
int32 magic; /* always RELMAPPER_FILEMAGIC */
8787
int32 num_mappings; /* number of valid RelMapping entries */
8888
RelMapping mappings[MAX_MAPPINGS];
89-
pg_crc32 crc; /* CRC of all above */
89+
pg_crc32c crc; /* CRC of all above */
9090
int32 pad; /* to make the struct size be 512 exactly */
9191
} RelMapFile;
9292

@@ -626,7 +626,7 @@ load_relmap_file(bool shared)
626626
{
627627
RelMapFile *map;
628628
char mapfilename[MAXPGPATH];
629-
pg_crc32 crc;
629+
pg_crc32c crc;
630630
int fd;
631631

632632
if (shared)

src/backend/utils/hash/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ subdir = src/backend/utils/hash
1212
top_builddir = ../../../..
1313
include $(top_builddir)/src/Makefile.global
1414

15-
OBJS = dynahash.o hashfn.o
15+
OBJS = dynahash.o hashfn.o pg_crc.o
1616

1717
include $(top_srcdir)/src/backend/common.mk

src/backend/utils/hash/pg_crc.c

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*-------------------------------------------------------------------------
2+
*
3+
* pg_crc.c
4+
* PostgreSQL CRC support
5+
*
6+
* See Ross Williams' excellent introduction
7+
* A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS, available from
8+
* http://www.ross.net/crc/download/crc_v3.txt or several other net sites.
9+
*
10+
* Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group
11+
* Portions Copyright (c) 1994, Regents of the University of California
12+
*
13+
*
14+
* IDENTIFICATION
15+
* src/backend/utils/hash/pg_crc.c
16+
*
17+
*-------------------------------------------------------------------------
18+
*/
19+
20+
#include "c.h"
21+
22+
#include "utils/pg_crc.h"
23+
24+
/*
25+
* Lookup table for calculating CRC-32 using Sarwate's algorithm.
26+
*
27+
* This table is based on the polynomial
28+
* x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
29+
* (This is the same polynomial used in Ethernet checksums, for instance.)
30+
* Using Williams' terms, this is the "normal", not "reflected" version.
31+
*/
32+
const uint32 pg_crc32_table[256] = {
33+
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
34+
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
35+
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
36+
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
37+
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
38+
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
39+
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
40+
0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
41+
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
42+
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
43+
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
44+
0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
45+
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
46+
0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
47+
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
48+
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
49+
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
50+
0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
51+
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
52+
0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
53+
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
54+
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
55+
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
56+
0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
57+
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
58+
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
59+
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
60+
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
61+
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
62+
0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
63+
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
64+
0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
65+
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
66+
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
67+
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
68+
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
69+
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
70+
0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
71+
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
72+
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
73+
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
74+
0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
75+
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
76+
0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
77+
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
78+
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
79+
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
80+
0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
81+
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
82+
0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
83+
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
84+
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
85+
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
86+
0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
87+
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
88+
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
89+
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
90+
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
91+
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
92+
0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
93+
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
94+
0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
95+
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
96+
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
97+
};

src/bin/pg_controldata/pg_controldata.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ main(int argc, char *argv[])
9292
int fd;
9393
char ControlFilePath[MAXPGPATH];
9494
char *DataDir = NULL;
95-
pg_crc32 crc;
95+
pg_crc32c crc;
9696
time_t time_tmp;
9797
char pgctime_str[128];
9898
char ckpttime_str[128];

src/bin/pg_resetxlog/pg_resetxlog.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ ReadControlFile(void)
465465
int fd;
466466
int len;
467467
char *buffer;
468-
pg_crc32 crc;
468+
pg_crc32c crc;
469469

470470
if ((fd = open(XLOG_CONTROL_FILE, O_RDONLY | PG_BINARY, 0)) < 0)
471471
{
@@ -1062,7 +1062,7 @@ WriteEmptyXLOG(void)
10621062
XLogPageHeader page;
10631063
XLogLongPageHeader longpage;
10641064
XLogRecord *record;
1065-
pg_crc32 crc;
1065+
pg_crc32c crc;
10661066
char path[MAXPGPATH];
10671067
int fd;
10681068
int nbytes;

src/bin/pg_rewind/pg_rewind.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ createBackupLabel(XLogRecPtr startpoint, TimeLineID starttli, XLogRecPtr checkpo
508508
static void
509509
checkControlFile(ControlFileData *ControlFile)
510510
{
511-
pg_crc32 crc;
511+
pg_crc32c crc;
512512

513513
/* Calculate CRC */
514514
INIT_CRC32C(crc);

src/common/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ include $(top_builddir)/src/Makefile.global
2323
override CPPFLAGS := -DFRONTEND $(CPPFLAGS)
2424
LIBS += $(PTHREAD_LIBS)
2525

26-
OBJS_COMMON = exec.o pg_crc.o pg_lzcompress.o pgfnames.o psprintf.o relpath.o \
26+
OBJS_COMMON = exec.o pg_lzcompress.o pgfnames.o psprintf.o relpath.o \
2727
rmtree.o string.o username.o wait_error.o
2828

2929
OBJS_FRONTEND = $(OBJS_COMMON) fe_memutils.o restricted_token.o

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy