8
8
*
9
9
*
10
10
* IDENTIFICATION
11
- * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.135 2003/03/28 20:17:13 tgl Exp $
11
+ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.136 2003/05/10 19:04:30 tgl Exp $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -68,6 +68,7 @@ static void WaitIO(BufferDesc *buf);
68
68
static void StartBufferIO (BufferDesc * buf , bool forInput );
69
69
static void TerminateBufferIO (BufferDesc * buf );
70
70
static void ContinueBufferIO (BufferDesc * buf , bool forInput );
71
+ static void buffer_write_error_callback (void * arg );
71
72
72
73
/*
73
74
* Macro : BUFFER_IS_BROKEN
@@ -699,14 +700,24 @@ BufferSync(void)
699
700
{
700
701
int i ;
701
702
BufferDesc * bufHdr ;
702
- Buffer buffer ;
703
- int status ;
704
- RelFileNode rnode ;
705
- XLogRecPtr recptr ;
706
- Relation reln = NULL ;
703
+ ErrorContextCallback errcontext ;
704
+
705
+ /* Setup error traceback support for ereport() */
706
+ errcontext .callback = buffer_write_error_callback ;
707
+ errcontext .arg = NULL ;
708
+ errcontext .previous = error_context_stack ;
709
+ error_context_stack = & errcontext ;
707
710
708
711
for (i = 0 , bufHdr = BufferDescriptors ; i < NBuffers ; i ++ , bufHdr ++ )
709
712
{
713
+ Buffer buffer ;
714
+ int status ;
715
+ RelFileNode rnode ;
716
+ XLogRecPtr recptr ;
717
+ Relation reln ;
718
+
719
+ errcontext .arg = bufHdr ;
720
+
710
721
LWLockAcquire (BufMgrLock , LW_EXCLUSIVE );
711
722
712
723
if (!(bufHdr -> flags & BM_VALID ))
@@ -834,6 +845,8 @@ BufferSync(void)
834
845
RelationDecrementReferenceCount (reln );
835
846
}
836
847
848
+ /* Pop the error context stack */
849
+ error_context_stack = errcontext .previous ;
837
850
}
838
851
839
852
/*
@@ -1011,12 +1024,19 @@ BufferReplace(BufferDesc *bufHdr)
1011
1024
Relation reln ;
1012
1025
XLogRecPtr recptr ;
1013
1026
int status ;
1027
+ ErrorContextCallback errcontext ;
1014
1028
1015
1029
/* To check if block content changed while flushing. - vadim 01/17/97 */
1016
1030
bufHdr -> flags &= ~BM_JUST_DIRTIED ;
1017
1031
1018
1032
LWLockRelease (BufMgrLock );
1019
1033
1034
+ /* Setup error traceback support for ereport() */
1035
+ errcontext .callback = buffer_write_error_callback ;
1036
+ errcontext .arg = bufHdr ;
1037
+ errcontext .previous = error_context_stack ;
1038
+ error_context_stack = & errcontext ;
1039
+
1020
1040
/*
1021
1041
* No need to lock buffer context - no one should be able to end
1022
1042
* ReadBuffer
@@ -1043,6 +1063,9 @@ BufferReplace(BufferDesc *bufHdr)
1043
1063
if (reln != (Relation ) NULL )
1044
1064
RelationDecrementReferenceCount (reln );
1045
1065
1066
+ /* Pop the error context stack */
1067
+ error_context_stack = errcontext .previous ;
1068
+
1046
1069
LWLockAcquire (BufMgrLock , LW_EXCLUSIVE );
1047
1070
1048
1071
if (status == SM_FAIL )
@@ -1380,12 +1403,20 @@ FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock)
1380
1403
BufferDesc * bufHdr ;
1381
1404
XLogRecPtr recptr ;
1382
1405
int status ;
1406
+ ErrorContextCallback errcontext ;
1407
+
1408
+ /* Setup error traceback support for ereport() */
1409
+ errcontext .callback = buffer_write_error_callback ;
1410
+ errcontext .arg = NULL ;
1411
+ errcontext .previous = error_context_stack ;
1412
+ error_context_stack = & errcontext ;
1383
1413
1384
1414
if (rel -> rd_istemp )
1385
1415
{
1386
1416
for (i = 0 ; i < NLocBuffer ; i ++ )
1387
1417
{
1388
1418
bufHdr = & LocalBufferDescriptors [i ];
1419
+ errcontext .arg = bufHdr ;
1389
1420
if (RelFileNodeEquals (bufHdr -> tag .rnode , rel -> rd_node ))
1390
1421
{
1391
1422
if (bufHdr -> flags & BM_DIRTY || bufHdr -> cntxDirty )
@@ -1395,6 +1426,7 @@ FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock)
1395
1426
(char * ) MAKE_PTR (bufHdr -> data ));
1396
1427
if (status == SM_FAIL )
1397
1428
{
1429
+ error_context_stack = errcontext .previous ;
1398
1430
elog (WARNING , "FlushRelationBuffers(%s (local), %u): block %u is dirty, could not flush it" ,
1399
1431
RelationGetRelationName (rel ), firstDelBlock ,
1400
1432
bufHdr -> tag .blockNum );
@@ -1405,6 +1437,7 @@ FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock)
1405
1437
}
1406
1438
if (LocalRefCount [i ] > 0 )
1407
1439
{
1440
+ error_context_stack = errcontext .previous ;
1408
1441
elog (WARNING , "FlushRelationBuffers(%s (local), %u): block %u is referenced (%ld)" ,
1409
1442
RelationGetRelationName (rel ), firstDelBlock ,
1410
1443
bufHdr -> tag .blockNum , LocalRefCount [i ]);
@@ -1414,6 +1447,10 @@ FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock)
1414
1447
bufHdr -> tag .rnode .relNode = InvalidOid ;
1415
1448
}
1416
1449
}
1450
+
1451
+ /* Pop the error context stack */
1452
+ error_context_stack = errcontext .previous ;
1453
+
1417
1454
return 0 ;
1418
1455
}
1419
1456
@@ -1422,6 +1459,7 @@ FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock)
1422
1459
for (i = 0 ; i < NBuffers ; i ++ )
1423
1460
{
1424
1461
bufHdr = & BufferDescriptors [i ];
1462
+ errcontext .arg = bufHdr ;
1425
1463
if (RelFileNodeEquals (bufHdr -> tag .rnode , rel -> rd_node ))
1426
1464
{
1427
1465
if (bufHdr -> flags & BM_DIRTY || bufHdr -> cntxDirty )
@@ -1483,6 +1521,7 @@ FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock)
1483
1521
if (!(bufHdr -> flags & BM_FREE ))
1484
1522
{
1485
1523
LWLockRelease (BufMgrLock );
1524
+ error_context_stack = errcontext .previous ;
1486
1525
elog (WARNING , "FlushRelationBuffers(%s, %u): block %u is referenced (private %ld, global %d)" ,
1487
1526
RelationGetRelationName (rel ), firstDelBlock ,
1488
1527
bufHdr -> tag .blockNum ,
@@ -1493,7 +1532,12 @@ FlushRelationBuffers(Relation rel, BlockNumber firstDelBlock)
1493
1532
BufTableDelete (bufHdr );
1494
1533
}
1495
1534
}
1535
+
1496
1536
LWLockRelease (BufMgrLock );
1537
+
1538
+ /* Pop the error context stack */
1539
+ error_context_stack = errcontext .previous ;
1540
+
1497
1541
return 0 ;
1498
1542
}
1499
1543
@@ -2083,3 +2127,17 @@ BufferGetFileNode(Buffer buffer)
2083
2127
2084
2128
return (bufHdr -> tag .rnode );
2085
2129
}
2130
+
2131
+ /*
2132
+ * Error context callback for errors occurring during buffer writes.
2133
+ */
2134
+ static void
2135
+ buffer_write_error_callback (void * arg )
2136
+ {
2137
+ BufferDesc * bufHdr = (BufferDesc * ) arg ;
2138
+
2139
+ if (bufHdr != NULL )
2140
+ errcontext ("writing block %u of relation %u/%u" ,
2141
+ bufHdr -> tag .blockNum ,
2142
+ bufHdr -> tag .rnode .tblNode , bufHdr -> tag .rnode .relNode );
2143
+ }
0 commit comments