Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit65b362f

Browse files
committed
Disable elog(ERROR|FATAL) in signal handlers in
critical sections of code.
1 parent5e3bc5e commit65b362f

File tree

12 files changed

+94
-29
lines changed

12 files changed

+94
-29
lines changed

‎src/backend/access/heap/heapam.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.98 2000/11/30 18:38:45 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.99 2000/12/03 10:27:25 vadim Exp $
1212
*
1313
*
1414
* INTERFACE ROUTINES
@@ -1358,6 +1358,7 @@ heap_insert(Relation relation, HeapTuple tup)
13581358
buffer=RelationGetBufferForTuple(relation,tup->t_len);
13591359

13601360
/* NO ELOG(ERROR) from here till changes are logged */
1361+
START_CRIT_CODE;
13611362
RelationPutHeapTuple(relation,buffer,tup);
13621363

13631364
/* XLOG stuff */
@@ -1381,6 +1382,7 @@ heap_insert(Relation relation, HeapTuple tup)
13811382
PageSetLSN(BufferGetPage(buffer),recptr);
13821383
PageSetSUI(BufferGetPage(buffer),ThisStartUpID);
13831384
}
1385+
END_CRIT_CODE;
13841386

13851387
LockBuffer(buffer,BUFFER_LOCK_UNLOCK);
13861388
WriteBuffer(buffer);
@@ -1474,6 +1476,7 @@ heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid)
14741476
}
14751477

14761478
/* XLOG stuff */
1479+
START_CRIT_CODE;
14771480
{
14781481
xl_heap_deletexlrec;
14791482
XLogRecPtrrecptr;
@@ -1493,6 +1496,7 @@ heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid)
14931496
tp.t_data->t_cmax=GetCurrentCommandId();
14941497
tp.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED |
14951498
HEAP_XMAX_INVALID |HEAP_MARKED_FOR_UPDATE);
1499+
END_CRIT_CODE;
14961500

14971501
#ifdefTUPLE_TOASTER_ACTIVE
14981502
/* ----------
@@ -1648,10 +1652,9 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
16481652
}
16491653

16501654
/* NO ELOG(ERROR) from here till changes are logged */
1655+
START_CRIT_CODE;
16511656

1652-
/* insert new tuple */
1653-
RelationPutHeapTuple(relation,newbuf,newtup);
1654-
1657+
RelationPutHeapTuple(relation,newbuf,newtup);/* insert new tuple */
16551658
if (buffer==newbuf)
16561659
{
16571660
TransactionIdStore(GetCurrentTransactionId(),&(oldtup.t_data->t_xmax));
@@ -1681,6 +1684,7 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
16811684
PageSetLSN(BufferGetPage(buffer),recptr);
16821685
PageSetSUI(BufferGetPage(buffer),ThisStartUpID);
16831686
}
1687+
END_CRIT_CODE;
16841688

16851689
if (newbuf!=buffer)
16861690
{

‎src/backend/access/nbtree/nbtinsert.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.69 2000/11/30 08:46:21 vadim Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.70 2000/12/03 10:27:26 vadim Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -772,6 +772,7 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
772772
* NO ELOG(ERROR) till right sibling is updated.
773773
*
774774
*/
775+
START_CRIT_CODE;
775776
{
776777
charxlbuf[sizeof(xl_btree_split)+
777778
sizeof(CommandId)+sizeof(RelFileNode)+BLCKSZ];
@@ -870,6 +871,7 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright,
870871
/* write and release the old right sibling */
871872
_bt_wrtbuf(rel,sbuf);
872873
}
874+
END_CRIT_CODE;
873875

874876
/* split's done */
875877
returnrbuf;
@@ -1162,6 +1164,7 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
11621164
metabuf=_bt_getbuf(rel,BTREE_METAPAGE,BT_WRITE);
11631165

11641166
/* NO ELOG(ERROR) from here till newroot op is logged */
1167+
START_CRIT_CODE;
11651168

11661169
/* set btree special data */
11671170
rootopaque= (BTPageOpaque)PageGetSpecialPointer(rootpage);
@@ -1248,6 +1251,7 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
12481251

12491252
_bt_wrtbuf(rel,metabuf);
12501253
}
1254+
END_CRIT_CODE;
12511255

12521256
/* write and let go of the new root buffer */
12531257
_bt_wrtbuf(rel,rootbuf);

‎src/backend/access/nbtree/nbtpage.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.42 2000/11/30 08:46:21 vadim Exp $
12+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtpage.c,v 1.43 2000/12/03 10:27:26 vadim Exp $
1313
*
1414
*NOTES
1515
* Postgres btree pages look like ordinary relation pages.The opaque
@@ -165,6 +165,7 @@ _bt_getroot(Relation rel, int access)
165165
rootpage=BufferGetPage(rootbuf);
166166

167167
/* NO ELOG(ERROR) till meta is updated */
168+
START_CRIT_CODE;
168169

169170
_bt_pageinit(rootpage,BufferGetPageSize(rootbuf));
170171
rootopaque= (BTPageOpaque)PageGetSpecialPointer(rootpage);
@@ -186,6 +187,7 @@ _bt_getroot(Relation rel, int access)
186187
PageSetLSN(metapg,recptr);
187188
PageSetSUI(metapg,ThisStartUpID);
188189
}
190+
END_CRIT_CODE;
189191

190192
metad->btm_root=rootblkno;
191193
metad->btm_level=1;
@@ -402,6 +404,7 @@ _bt_pagedel(Relation rel, ItemPointer tid)
402404
page=BufferGetPage(buf);
403405

404406
/* XLOG stuff */
407+
START_CRIT_CODE;
405408
{
406409
xl_btree_deletexlrec;
407410
XLogRecPtrrecptr;
@@ -416,6 +419,7 @@ _bt_pagedel(Relation rel, ItemPointer tid)
416419
}
417420

418421
PageIndexTupleDelete(page,offno);
422+
END_CRIT_CODE;
419423

420424
/* write the buffer and release the lock */
421425
_bt_wrtbuf(rel,buf);

‎src/backend/access/transam/xact.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.86 2000/11/30 08:46:22 vadim Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.87 2000/12/03 10:27:26 vadim Exp $
1212
*
1313
* NOTES
1414
*Transaction aborts can now occur two ways:
@@ -672,6 +672,7 @@ RecordTransactionCommit()
672672
BufmgrCommit();
673673

674674
xlrec.xtime=time(NULL);
675+
START_CRIT_CODE;
675676
/*
676677
* SHOULD SAVE ARRAY OF RELFILENODE-s TO DROP
677678
*/
@@ -691,6 +692,7 @@ RecordTransactionCommit()
691692
TransactionIdCommit(xid);
692693

693694
MyProc->logRec.xrecoff=0;
695+
END_CRIT_CODE;
694696
}
695697

696698
if (leak)
@@ -787,11 +789,13 @@ RecordTransactionAbort(void)
787789
XLogRecPtrrecptr;
788790

789791
xlrec.xtime=time(NULL);
792+
START_CRIT_CODE;
790793
recptr=XLogInsert(RM_XACT_ID,XLOG_XACT_ABORT,
791794
(char*)&xlrec,SizeOfXactAbort,NULL,0);
792795

793796
TransactionIdAbort(xid);
794797
MyProc->logRec.xrecoff=0;
798+
END_CRIT_CODE;
795799
}
796800

797801
/*

‎src/backend/access/transam/xlog.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.38 2000/11/30 08:46:22 vadim Exp $
9+
* $Header: /cvsroot/pgsql/src/backend/access/transam/xlog.c,v 1.39 2000/12/03 10:27:26 vadim Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -40,7 +40,7 @@
4040

4141
intXLOGbuffers=8;
4242
XLogRecPtrMyLastRecPtr= {0,0};
43-
boolStopIfError=false;
43+
uint32StopIfError=0;
4444
boolInRecovery= false;
4545
StartUpIDThisStartUpID=0;
4646

@@ -270,6 +270,8 @@ XLogInsert(RmgrId rmid, uint8 info, char *hdr, uint32 hdrlen, char *buf, uint32
270270
return (RecPtr);
271271
}
272272

273+
START_CRIT_CODE;
274+
273275
/* obtain xlog insert lock */
274276
if (TAS(&(XLogCtl->insert_lck)))/* busy */
275277
{
@@ -496,6 +498,7 @@ XLogInsert(RmgrId rmid, uint8 info, char *hdr, uint32 hdrlen, char *buf, uint32
496498
}
497499
}
498500

501+
END_CRIT_CODE;
499502
return (RecPtr);
500503
}
501504

@@ -523,6 +526,9 @@ XLogFlush(XLogRecPtr record)
523526
return;
524527
if (XLByteLE(record,LgwrResult.Flush))
525528
return;
529+
530+
START_CRIT_CODE;
531+
526532
WriteRqst=LgwrRqst.Write;
527533
for (;;)
528534
{
@@ -533,6 +539,7 @@ XLogFlush(XLogRecPtr record)
533539
if (XLByteLE(record,LgwrResult.Flush))
534540
{
535541
S_UNLOCK(&(XLogCtl->info_lck));
542+
END_CRIT_CODE;
536543
return;
537544
}
538545
if (XLByteLT(XLogCtl->LgwrRqst.Flush,record))
@@ -578,6 +585,7 @@ XLogFlush(XLogRecPtr record)
578585
if (XLByteLE(record,LgwrResult.Flush))
579586
{
580587
S_UNLOCK(&(XLogCtl->lgwr_lck));
588+
END_CRIT_CODE;
581589
return;
582590
}
583591
if (XLByteLT(LgwrResult.Write,WriteRqst))
@@ -587,6 +595,7 @@ XLogFlush(XLogRecPtr record)
587595
S_UNLOCK(&(XLogCtl->lgwr_lck));
588596
if (XLByteLT(LgwrResult.Flush,record))
589597
elog(STOP,"XLogFlush: request is not satisfied");
598+
END_CRIT_CODE;
590599
return;
591600
}
592601
break;
@@ -632,6 +641,8 @@ XLogFlush(XLogRecPtr record)
632641
XLogCtl->Write.LgwrResult=LgwrResult;
633642

634643
S_UNLOCK(&(XLogCtl->lgwr_lck));
644+
645+
END_CRIT_CODE;
635646
return;
636647

637648
}
@@ -1519,9 +1530,9 @@ StartupXLOG()
15191530
LastRec;
15201531
XLogRecord*record;
15211532
charbuffer[MAXLOGRECSZ+SizeOfXLogRecord];
1522-
boolsie_saved= false;
15231533

15241534
elog(LOG,"starting up");
1535+
StopIfError++;
15251536

15261537
XLogCtl->xlblocks= (XLogRecPtr*) (((char*)XLogCtl)+sizeof(XLogCtlData));
15271538
XLogCtl->pages= ((char*)XLogCtl->xlblocks+sizeof(XLogRecPtr)*XLOGbuffers);
@@ -1628,9 +1639,6 @@ StartupXLOG()
16281639
ControlFile->time=time(NULL);
16291640
UpdateControlFile();
16301641

1631-
sie_saved=StopIfError;
1632-
StopIfError= true;
1633-
16341642
XLogOpenLogRelation();/* open pg_log */
16351643
XLogInitRelationCache();
16361644

@@ -1729,7 +1737,6 @@ StartupXLOG()
17291737
if (InRecovery)
17301738
{
17311739
CreateCheckPoint(true);
1732-
StopIfError=sie_saved;
17331740
XLogCloseRelationCache();
17341741
}
17351742
InRecovery= false;
@@ -1742,6 +1749,7 @@ StartupXLOG()
17421749
XLogCtl->ThisStartUpID=ThisStartUpID;
17431750

17441751
elog(LOG,"database system is in production state");
1752+
StopIfError--;
17451753

17461754
return;
17471755
}
@@ -1764,8 +1772,10 @@ ShutdownXLOG()
17641772
{
17651773
elog(LOG,"shutting down");
17661774

1775+
StopIfError++;
17671776
CreateDummyCaches();
17681777
CreateCheckPoint(true);
1778+
StopIfError--;
17691779

17701780
elog(LOG,"database system is shut down");
17711781
}
@@ -1787,6 +1797,7 @@ CreateCheckPoint(bool shutdown)
17871797
if (MyLastRecPtr.xrecoff!=0)
17881798
elog(ERROR,"CreateCheckPoint: cannot be called inside transaction block");
17891799

1800+
START_CRIT_CODE;
17901801
while (TAS(&(XLogCtl->chkp_lck)))
17911802
{
17921803
structtimevaldelay= {2,0};
@@ -1917,6 +1928,7 @@ CreateCheckPoint(bool shutdown)
19171928
S_UNLOCK(&(XLogCtl->chkp_lck));
19181929

19191930
MyLastRecPtr.xrecoff=0;/* to avoid commit record */
1931+
END_CRIT_CODE;
19201932

19211933
return;
19221934
}

‎src/backend/commands/sequence.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ nextval(PG_FUNCTION_ARGS)
295295
elm->last=result;/* last returned number */
296296
elm->cached=last;/* last fetched number */
297297

298+
START_CRIT_CODE;
298299
if (logit)
299300
{
300301
xl_seq_recxlrec;
@@ -318,6 +319,7 @@ nextval(PG_FUNCTION_ARGS)
318319
Assert(log >=0);
319320
seq->log_cnt=log;/* how much is logged */
320321
seq->is_called='t';
322+
END_CRIT_CODE;
321323

322324
LockBuffer(buf,BUFFER_LOCK_UNLOCK);
323325

@@ -386,6 +388,7 @@ do_setval(char *seqname, int32 next, bool iscalled)
386388
elm->cached=next;/* last cached number */
387389

388390
/* save info in sequence relation */
391+
START_CRIT_CODE;
389392
seq->last_value=next;/* last fetched number */
390393
seq->is_called=iscalled ?'t' :'f';
391394
seq->log_cnt= (iscalled) ?0 :1;
@@ -403,6 +406,7 @@ do_setval(char *seqname, int32 next, bool iscalled)
403406
PageSetLSN(BufferGetPage(buf),recptr);
404407
PageSetSUI(BufferGetPage(buf),ThisStartUpID);
405408
}
409+
END_CRIT_CODE;
406410

407411
LockBuffer(buf,BUFFER_LOCK_UNLOCK);
408412

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp