diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fa24b00e7d4..672ea66cb0a 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -4858,6 +4858,10 @@ SetDataChecksumsOn(void) SpinLockRelease(&XLogCtl->info_lck); INJECTION_POINT("datachecksums-enable-checksums-delay", NULL); + ereport(LOG, (errmsg("BDTTESTHACK: launcher holding at inprogress-on for 60s"))); + pg_usleep(60 * 1000000L); + ereport(LOG, (errmsg("BDTTESTHACK: launcher releasing, about to write XLOG2_CHECKSUMS(on) and flip"))); + START_CRIT_SECTION(); MyProc->delayChkptFlags |= DELAY_CHKPT_START; @@ -4874,6 +4878,10 @@ SetDataChecksumsOn(void) INJECTION_POINT("datachecksums-on-before-checkpoint", NULL); + ereport(LOG, (errmsg("BDTTESTHACK: launcher holding at inprogress-on for 60s"))); + pg_usleep(60 * 1000000L); + ereport(LOG, (errmsg("BDTTESTHACK: launcher releasing, about to write XLOG2_CHECKSUMS(on) and flip"))); + RequestCheckpoint(CHECKPOINT_FORCE | CHECKPOINT_WAIT | CHECKPOINT_FAST); INJECTION_POINT("datachecksums-on-after-checkpoint", NULL); @@ -7795,6 +7803,22 @@ CreateCheckPoint(int flags) */ WALInsertLockRelease(); + if (!shutdown && checkPoint.dataChecksumState == PG_DATA_CHECKSUM_INPROGRESS_ON) + { + int i; + ereport(LOG, (errmsg("BDTTESTHACK: checkpoint sampled dataChecksumState=inprogress-on, waiting for flip to on"))); + for (i = 0; i < 600; i++) /* up to ~60s, then give up */ + { + uint32 v; + SpinLockAcquire(&XLogCtl->info_lck); + v = XLogCtl->data_checksum_version; + SpinLockRelease(&XLogCtl->info_lck); + if (v == PG_DATA_CHECKSUM_VERSION) /* "on" */ + break; + pg_usleep(100 * 1000L); /* 100ms */ + } + ereport(LOG, (errmsg("TESTHACK: checkpoint resuming after %d iterations; will sample redo_rec and write XLOG_CHECKPOINT_REDO", i))); + } /* * If this is an online checkpoint, we have not yet determined the redo * point. We do so now by inserting the special XLOG_CHECKPOINT_REDO