Switch to CRC-32C in WAL and other places.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 4 Nov 2014 09:35:15 +0000 (11:35 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 4 Nov 2014 09:39:48 +0000 (11:39 +0200)
commit5028f22f6eb0579890689655285a4778b4ffc460
treeed3a4cd635306b18cb0e2851281920db6770a826
parent404bc51cde9dce1c674abe4695635612f08fe27e
Switch to CRC-32C in WAL and other places.

The old algorithm was found to not be the usual CRC-32 algorithm, used by
Ethernet et al. We were using a non-reflected lookup table with code meant
for a reflected lookup table. That's a strange combination that AFAICS does
not correspond to any bit-wise CRC calculation, which makes it difficult to
reason about its properties. Although it has worked well in practice, seems
safer to use a well-known algorithm.

Since we're changing the algorithm anyway, we might as well choose a
different polynomial. The Castagnoli polynomial has better error-correcting
properties than the traditional CRC-32 polynomial, even if we had
implemented it correctly. Another reason for picking that is that some new
CPUs have hardware support for calculating CRC-32C, but not CRC-32, let
alone our strange variant of it. This patch doesn't add any support for such
hardware, but a future patch could now do that.

The old algorithm is kept around for tsquery and pg_trgm, which use the
values in indexes that need to remain compatible so that pg_upgrade works.
While we're at it, share the old lookup table for CRC-32 calculation
between hstore, ltree and core. They all use the same table, so might as
well.
20 files changed:
contrib/hstore/Makefile
contrib/hstore/crc32.c [deleted file]
contrib/hstore/crc32.h [deleted file]
contrib/hstore/hstore_gist.c
contrib/ltree/crc32.c
contrib/pg_trgm/trgm_op.c
src/backend/access/transam/twophase.c
src/backend/access/transam/xlog.c
src/backend/access/transam/xlogreader.c
src/backend/replication/logical/snapbuild.c
src/backend/replication/slot.c
src/backend/utils/adt/tsgistidx.c
src/backend/utils/adt/tsquery.c
src/backend/utils/cache/relmapper.c
src/bin/pg_controldata/pg_controldata.c
src/bin/pg_resetxlog/pg_resetxlog.c
src/include/access/xlog_internal.h
src/include/catalog/catversion.h
src/include/utils/pg_crc.h
src/include/utils/pg_crc_tables.h