aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2016-09-08 17:02:43 -0700
committerAndres Freund <andres@anarazel.de>2016-09-08 17:02:43 -0700
commit417fefaf089fc0b73607cbbe8bcd0bc9e89d08ef (patch)
tree021b48dc799c519b22b77a643ac68013c3c20dda
parent769fd9d8e06bf862334a0e04134a3d2c665e5e5b (diff)
downloadpostgresql-417fefaf089fc0b73607cbbe8bcd0bc9e89d08ef.tar.gz
postgresql-417fefaf089fc0b73607cbbe8bcd0bc9e89d08ef.zip
Faster PageIsVerified() for the all zeroes case.
That's primarily useful for testing very large relations, using sparse files. Discussion: <20140331101001.GE13135@alap3.anarazel.de> Reviewed-By: Peter Geoghegan
-rw-r--r--src/backend/storage/page/bufpage.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c
index f2a07f21116..1b70bfbe8cc 100644
--- a/src/backend/storage/page/bufpage.c
+++ b/src/backend/storage/page/bufpage.c
@@ -81,7 +81,7 @@ bool
PageIsVerified(Page page, BlockNumber blkno)
{
PageHeader p = (PageHeader) page;
- char *pagebytes;
+ size_t *pagebytes;
int i;
bool checksum_failure = false;
bool header_sane = false;
@@ -118,10 +118,17 @@ PageIsVerified(Page page, BlockNumber blkno)
return true;
}
- /* Check all-zeroes case */
+ /*
+ * Check all-zeroes case. Luckily BLCKSZ is guaranteed to always be a
+ * multiple of size_t - and it's much faster to compare memory using the
+ * native word size.
+ */
+ StaticAssertStmt(BLCKSZ == (BLCKSZ / sizeof(size_t)) * sizeof(size_t),
+ "BLCKSZ has to be a multiple of sizeof(size_t)");
+
all_zeroes = true;
- pagebytes = (char *) page;
- for (i = 0; i < BLCKSZ; i++)
+ pagebytes = (size_t *) page;
+ for (i = 0; i < (BLCKSZ / sizeof(size_t)); i++)
{
if (pagebytes[i] != 0)
{