]> granicus.if.org Git - postgresql/blobdiff - src/backend/storage/smgr/smgr.c
Prevent re-use of a deleted relation's relfilenode until after the next
[postgresql] / src / backend / storage / smgr / smgr.c
index 22ac13146c8fb1b00d2fd1ea53873d01f2b04200..6b13483a6d5c9321f5e8530b1eb0caf0d6fe4b98 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/storage/smgr/smgr.c,v 1.106 2007/09/05 18:10:48 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/storage/smgr/smgr.c,v 1.107 2007/11/15 20:36:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -55,9 +55,11 @@ typedef struct f_smgr
        void            (*smgr_truncate) (SMgrRelation reln, BlockNumber nblocks,
                                                                  bool isTemp);
        void            (*smgr_immedsync) (SMgrRelation reln);
-       void            (*smgr_commit) (void);  /* may be NULL */
-       void            (*smgr_abort) (void);   /* may be NULL */
-       void            (*smgr_sync) (void);    /* may be NULL */
+       void            (*smgr_commit) (void);          /* may be NULL */
+       void            (*smgr_abort) (void);           /* may be NULL */
+       void            (*smgr_pre_ckpt) (void);        /* may be NULL */
+       void            (*smgr_sync) (void);            /* may be NULL */
+       void            (*smgr_post_ckpt) (void);       /* may be NULL */
 } f_smgr;
 
 
@@ -65,7 +67,7 @@ static const f_smgr smgrsw[] = {
        /* magnetic disk */
        {mdinit, NULL, mdclose, mdcreate, mdunlink, mdextend,
                mdread, mdwrite, mdnblocks, mdtruncate, mdimmedsync,
-               NULL, NULL, mdsync
+               NULL, NULL, mdpreckpt, mdsync, mdpostckpt
        }
 };
 
@@ -778,7 +780,22 @@ smgrabort(void)
 }
 
 /*
- *     smgrsync() -- Sync files to disk at checkpoint time.
+ *     smgrpreckpt() -- Prepare for checkpoint.
+ */
+void
+smgrpreckpt(void)
+{
+       int                     i;
+
+       for (i = 0; i < NSmgr; i++)
+       {
+               if (smgrsw[i].smgr_pre_ckpt)
+                       (*(smgrsw[i].smgr_pre_ckpt)) ();
+       }
+}
+
+/*
+ *     smgrsync() -- Sync files to disk during checkpoint.
  */
 void
 smgrsync(void)
@@ -792,6 +809,21 @@ smgrsync(void)
        }
 }
 
+/*
+ *     smgrpostckpt() -- Post-checkpoint cleanup.
+ */
+void
+smgrpostckpt(void)
+{
+       int                     i;
+
+       for (i = 0; i < NSmgr; i++)
+       {
+               if (smgrsw[i].smgr_post_ckpt)
+                       (*(smgrsw[i].smgr_post_ckpt)) ();
+       }
+}
+
 
 void
 smgr_redo(XLogRecPtr lsn, XLogRecord *record)