From 6b7b66f48423044265552d97e288455c8bfa3e7d Mon Sep 17 00:00:00 2001 From: "Vadim B. Mikheev" Date: Tue, 3 Apr 2001 21:58:00 +0000 Subject: [PATCH] Log sequence creation (to initialize magic number on recovery). --- src/backend/commands/sequence.c | 36 +++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 8f10c4a13a..6c7c7a7a3b 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -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); } -- 2.39.5