mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -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 |  * 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 */ | 	/* Now - form & insert sequence tuple */ | ||||||
| 	tuple = heap_formtuple(tupDesc, value, null); | 	tuple = heap_formtuple(tupDesc, value, null); | ||||||
| 	heap_insert(rel, tuple); | 	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); | 	heap_close(rel, AccessExclusiveLock); | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user