Skip to content

Commit e1a118e

Browse files
committed
unlock buffer before releasing in heap_insert
+unlock buffer in heap_fetch under !ItemIdIsUsed().
1 parent 13647ad commit e1a118e

File tree

1 file changed

+50
-9
lines changed

1 file changed

+50
-9
lines changed

src/backend/access/heap/heapam.c

Lines changed: 50 additions & 9 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.77 2000/07/03 23:58:32 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.78 2000/07/04 01:39:24 vadim Exp $
1212
*
1313
*
1414
* INTERFACE ROUTINES
@@ -1125,6 +1125,7 @@ heap_fetch(Relation relation,
11251125

11261126
if (!ItemIdIsUsed(lp))
11271127
{
1128+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
11281129
ReleaseBuffer(buffer);
11291130
*userbuf = InvalidBuffer;
11301131
tuple->t_datamcxt = NULL;
@@ -1331,17 +1332,17 @@ heap_insert(Relation relation, HeapTuple tup)
13311332
xlrec.mask = tup->t_data->t_infomask;
13321333

13331334
XLogRecPtr recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_INSERT,
1334-
(char*) xlrec, sizeof(xlrec),
1335-
(char*) tup->t_data + offsetof(HeapTupleHeaderData, tbits),
1336-
tup->t_len - offsetof(HeapTupleHeaderData, tbits));
1335+
(char*) xlrec, SizeOfHeapInsert,
1336+
(char*) tup->t_data + offsetof(HeapTupleHeaderData, t_bits),
1337+
tup->t_len - offsetof(HeapTupleHeaderData, t_bits));
13371338

13381339
((PageHeader) BufferGetPage(buffer))->pd_lsn = recptr;
13391340
((PageHeader) BufferGetPage(buffer))->pd_sui = ThisStartUpID;
13401341
}
13411342
#endif
13421343

1343-
WriteBuffer(buffer);
13441344
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
1345+
WriteBuffer(buffer);
13451346

13461347
if (IsSystemRelationName(RelationGetRelationName(relation)))
13471348
RelationMark4RollbackHeapTuple(relation, tup);
@@ -1440,7 +1441,7 @@ heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid)
14401441
xlrec.dtid.cid = GetCurrentCommandId();
14411442
xlrec.dtid.tid = tp.t_self;
14421443
XLogRecPtr recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_DELETE,
1443-
(char*) xlrec, sizeof(xlrec), NULL, 0);
1444+
(char*) xlrec, SizeOfHeapDelete, NULL, 0);
14441445

14451446
dp->pd_lsn = recptr;
14461447
dp->pd_sui = ThisStartUpID;
@@ -1610,9 +1611,9 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
16101611
xlrec.mask = newtup->t_data->t_infomask;
16111612

16121613
XLogRecPtr recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_UPDATE,
1613-
(char*) xlrec, sizeof(xlrec),
1614-
(char*) newtup->t_data + offsetof(HeapTupleHeaderData, tbits),
1615-
newtup->t_len - offsetof(HeapTupleHeaderData, tbits));
1614+
(char*) xlrec, SizeOfHeapUpdate,
1615+
(char*) newtup->t_data + offsetof(HeapTupleHeaderData, t_bits),
1616+
newtup->t_len - offsetof(HeapTupleHeaderData, t_bits));
16161617

16171618
if (newbuf != buffer)
16181619
{
@@ -1907,3 +1908,43 @@ heap_restrpos(HeapScanDesc scan)
19071908
(ScanKey) NULL);
19081909
}
19091910
}
1911+
1912+
#ifdef XLOG
1913+
void heap_redo(XLogRecPtr lsn, XLogRecord *record)
1914+
{
1915+
uint8 info = record->xl_info & ~XLR_INFO_MASK;
1916+
1917+
if (info == XLOG_HEAP_INSERT)
1918+
heap_xlog_insert(true, lsn, record);
1919+
else if (info == XLOG_HEAP_DELETE)
1920+
heap_xlog_delete(true, lsn, record);
1921+
else if (info == XLOG_HEAP_UPDATE)
1922+
heap_xlog_update(true, lsn, record);
1923+
else if (info == XLOG_HEAP_MOVE)
1924+
heap_xlog_move(true, lsn, record);
1925+
else
1926+
elog(STOP, "heap_redo: unknown op code %u", info);
1927+
}
1928+
1929+
void heap_undo(XLogRecPtr lsn, XLogRecord *record)
1930+
{
1931+
uint8 info = record->xl_info & ~XLR_INFO_MASK;
1932+
1933+
if (info == XLOG_HEAP_INSERT)
1934+
heap_xlog_insert(false, lsn, record);
1935+
else if (info == XLOG_HEAP_DELETE)
1936+
heap_xlog_delete(false, lsn, record);
1937+
else if (info == XLOG_HEAP_UPDATE)
1938+
heap_xlog_update(false, lsn, record);
1939+
else if (info == XLOG_HEAP_MOVE)
1940+
heap_xlog_move(false, lsn, record);
1941+
else
1942+
elog(STOP, "heap_undo: unknown op code %u", info);
1943+
}
1944+
1945+
void heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
1946+
{
1947+
xl_heap_insert xlrec = XLogRecGetData(record);
1948+
}
1949+
1950+
#endif /* XLOG */

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy