Add assertion for duplicate buffer registrations.
authorHeikki Linnakangas <[email protected]>
Thu, 6 Nov 2014 13:24:07 +0000 (15:24 +0200)
committerHeikki Linnakangas <[email protected]>
Mon, 10 Nov 2014 19:24:36 +0000 (21:24 +0200)
src/backend/access/transam/xloginsert.c

index efc161ba9d0fb46500f2f0cf005886e19bf95065..f5e1c4fa3d82fb33b49afee7fe6572907a27a490 100644 (file)
@@ -216,6 +216,26 @@ XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
        regbuf->rdata_tail = (XLogRecData *) &regbuf->rdata_head;
        regbuf->rdata_sz = 0;
 
+       /*
+        * Check that this page, or some other page with the same block_id,
+        * hasn't already been registered.
+        */
+#ifdef USE_ASSERT_CHECKING
+       {
+               int                     i;
+
+               for (i = 0; i < num_registered_buffers; i++)
+               {
+                       registered_buffer *regbuf_old = &registered_buffers[i];
+
+                       Assert (regbuf_old->block_id != block_id);
+                       Assert (!RelFileNodeEquals(regbuf_old->rnode, regbuf->rnode) ||
+                                       regbuf_old->forkno != regbuf->forkno ||
+                                       regbuf_old->block != regbuf->block);
+               }
+       }
+#endif
+
        num_registered_buffers++;
 }
 
@@ -247,6 +267,26 @@ XLogRegisterBlock(uint8 block_id, RelFileNode *rnode, ForkNumber forknum,
        regbuf->rdata_tail = (XLogRecData *) &regbuf->rdata_head;
        regbuf->rdata_sz = 0;
 
+       /*
+        * Check that this page, or some other page with the same block_id,
+        * hasn't already been registered.
+        */
+#ifdef USE_ASSERT_CHECKING
+       {
+               int                     i;
+
+               for (i = 0; i < num_registered_buffers; i++)
+               {
+                       registered_buffer *regbuf_old = &registered_buffers[i];
+
+                       Assert (regbuf_old->block_id != block_id);
+                       Assert (!RelFileNodeEquals(regbuf_old->rnode, regbuf->rnode) ||
+                                       regbuf_old->forkno != regbuf->forkno ||
+                                       regbuf_old->block != regbuf->block);
+               }
+       }
+#endif
+
        num_registered_buffers++;
 }