mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-30 00:04:49 -04:00 
			
		
		
		
	Log sequence creation (to initialize magic number on recovery).
This commit is contained in:
		
							parent
							
								
									5f5db804f5
								
							
						
					
					
						commit
						1d9819d69e
					
				| @ -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); | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user