aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/sequence.c
diff options
context:
space:
mode:
authorVadim B. Mikheev <vadim4o@yahoo.com>2001-04-03 21:58:00 +0000
committerVadim B. Mikheev <vadim4o@yahoo.com>2001-04-03 21:58:00 +0000
commit1d9819d69e7498918d161df52db212857b7f503e (patch)
treed0cbbc8bdff7c8744d6348319989fbc00e7feeae /src/backend/commands/sequence.c
parent5f5db804f535724239dc427b69f58e317b24f524 (diff)
downloadpostgresql-1d9819d69e7498918d161df52db212857b7f503e.tar.gz
postgresql-1d9819d69e7498918d161df52db212857b7f503e.zip
Log sequence creation (to initialize magic number on recovery).
Diffstat (limited to 'src/backend/commands/sequence.c')
-rw-r--r--src/backend/commands/sequence.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index 85a8b740048..00a96a99a5a 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.52 2001/03/22 03:59:23 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.53 2001/04/03 21:58:00 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -181,9 +181,41 @@ DefineSequence(CreateSeqStmt *seq)
/* Now - form & insert sequence tuple */
tuple = heap_formtuple(tupDesc, value, null);
heap_insert(rel, tuple);
+ ReleaseBuffer(buf);
- if (WriteBuffer(buf) == STATUS_ERROR)
- elog(ERROR, "DefineSequence: WriteBuffer failed");
+ /*
+ * After crash REDO of heap_insert above would re-init page and
+ * our magic number would be lost. We have to log sequence creation.
+ * This means two log records instead of one -:(
+ */
+ START_CRIT_SECTION();
+ {
+ xl_seq_rec xlrec;
+ XLogRecPtr recptr;
+ XLogRecData rdata[2];
+ Form_pg_sequence newseq = (Form_pg_sequence) GETSTRUCT(tuple);
+
+ /* We do not log first nextval call, so "advance" sequence here */
+ newseq->is_called = 't';
+ newseq->log_cnt = 0;
+
+ xlrec.node = rel->rd_node;
+ rdata[0].buffer = InvalidBuffer;
+ rdata[0].data = (char *) &xlrec;
+ rdata[0].len = sizeof(xl_seq_rec);
+ rdata[0].next = &(rdata[1]);
+
+ rdata[1].buffer = InvalidBuffer;
+ rdata[1].data = (char*) tuple->t_data;
+ rdata[1].len = tuple->t_len;
+ rdata[1].next = NULL;
+
+ recptr = XLogInsert(RM_SEQ_ID, XLOG_SEQ_LOG | XLOG_NO_TRAN, rdata);
+
+ PageSetLSN(page, recptr);
+ PageSetSUI(page, ThisStartUpID);
+ }
+ END_CRIT_SECTION();
heap_close(rel, AccessExclusiveLock);
}