Skip to content

Commit fef0c83

Browse files
author
Neil Conway
committed
I posted some bufmgr cleanup a few weeks ago, but it conflicted with
some concurrent changes Jan was making to the bufmgr. Here's an updated version of the patch -- it should apply cleanly to CVS HEAD and passes the regression tests. This patch makes the following changes: - remove the UnlockAndReleaseBuffer() and UnlockAndWriteBuffer() macros, and replace uses of them with calls to the appropriate functions. - remove a bunch of #ifdef BMTRACE code: it is ugly & broken (i.e. it doesn't compile) - make BufferReplace() return a bool, not an int - cleanup some logic in bufmgr.c; should be functionality equivalent to the previous code, just cleaner now - remove the BM_PRIVATE flag as it is unused - improve a few comments, etc.
1 parent 81e9455 commit fef0c83

File tree

10 files changed

+133
-322
lines changed

10 files changed

+133
-322
lines changed

src/backend/access/heap/heapam.c

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.158 2003/11/29 19:51:40 pgsql Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/heap/heapam.c,v 1.159 2003/12/14 00:34:47 neilc Exp $
1212
*
1313
*
1414
* INTERFACE ROUTINES
@@ -2110,7 +2110,8 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
21102110

21112111
if (XLByteLE(lsn, PageGetLSN(page)))
21122112
{
2113-
UnlockAndReleaseBuffer(buffer);
2113+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
2114+
ReleaseBuffer(buffer);
21142115
return;
21152116
}
21162117

@@ -2135,7 +2136,8 @@ heap_xlog_clean(bool redo, XLogRecPtr lsn, XLogRecord *record)
21352136

21362137
PageSetLSN(page, lsn);
21372138
PageSetSUI(page, ThisStartUpID); /* prev sui */
2138-
UnlockAndWriteBuffer(buffer);
2139+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
2140+
WriteBuffer(buffer);
21392141
}
21402142

21412143
static void
@@ -2170,7 +2172,8 @@ heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
21702172
{
21712173
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
21722174
{
2173-
UnlockAndReleaseBuffer(buffer);
2175+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
2176+
ReleaseBuffer(buffer);
21742177
return;
21752178
}
21762179
}
@@ -2199,7 +2202,8 @@ heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
21992202
htup->t_ctid = xlrec->target.tid;
22002203
PageSetLSN(page, lsn);
22012204
PageSetSUI(page, ThisStartUpID);
2202-
UnlockAndWriteBuffer(buffer);
2205+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
2206+
WriteBuffer(buffer);
22032207
return;
22042208
}
22052209

@@ -2249,7 +2253,8 @@ heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
22492253

22502254
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
22512255
{
2252-
UnlockAndReleaseBuffer(buffer);
2256+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
2257+
ReleaseBuffer(buffer);
22532258
return;
22542259
}
22552260

@@ -2282,7 +2287,8 @@ heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
22822287
elog(PANIC, "heap_insert_redo: failed to add tuple");
22832288
PageSetLSN(page, lsn);
22842289
PageSetSUI(page, ThisStartUpID); /* prev sui */
2285-
UnlockAndWriteBuffer(buffer);
2290+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
2291+
WriteBuffer(buffer);
22862292
return;
22872293
}
22882294

@@ -2332,7 +2338,8 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move)
23322338
{
23332339
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
23342340
{
2335-
UnlockAndReleaseBuffer(buffer);
2341+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
2342+
ReleaseBuffer(buffer);
23362343
if (samepage)
23372344
return;
23382345
goto newt;
@@ -2378,7 +2385,8 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move)
23782385
goto newsame;
23792386
PageSetLSN(page, lsn);
23802387
PageSetSUI(page, ThisStartUpID);
2381-
UnlockAndWriteBuffer(buffer);
2388+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
2389+
WriteBuffer(buffer);
23822390
goto newt;
23832391
}
23842392

@@ -2421,7 +2429,8 @@ newsame:;
24212429

24222430
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
24232431
{
2424-
UnlockAndReleaseBuffer(buffer);
2432+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
2433+
ReleaseBuffer(buffer);
24252434
return;
24262435
}
24272436

@@ -2474,7 +2483,8 @@ newsame:;
24742483
elog(PANIC, "heap_update_redo: failed to add tuple");
24752484
PageSetLSN(page, lsn);
24762485
PageSetSUI(page, ThisStartUpID); /* prev sui */
2477-
UnlockAndWriteBuffer(buffer);
2486+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
2487+
WriteBuffer(buffer);
24782488
return;
24792489
}
24802490

@@ -2523,7 +2533,8 @@ _heap_unlock_tuple(void *data)
25232533
elog(PANIC, "_heap_unlock_tuple: invalid xmax in rollback");
25242534
htup->t_infomask &= ~HEAP_XMAX_UNLOGGED;
25252535
htup->t_infomask |= HEAP_XMAX_INVALID;
2526-
UnlockAndWriteBuffer(buffer);
2536+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
2537+
WriteBuffer(buffer);
25272538
return;
25282539
}
25292540

src/backend/access/nbtree/nbtxlog.c

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.8 2003/11/29 19:51:40 pgsql Exp $
11+
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.9 2003/12/14 00:34:47 neilc Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -69,7 +69,8 @@ forget_matching_split(Relation reln, RelFileNode node,
6969
btitem = (BTItem) PageGetItem(page, PageGetItemId(page, offnum));
7070
rightblk = ItemPointerGetBlockNumber(&(btitem->bti_itup.t_tid));
7171
Assert(ItemPointerGetOffsetNumber(&(btitem->bti_itup.t_tid)) == P_HIKEY);
72-
UnlockAndReleaseBuffer(buffer);
72+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
73+
ReleaseBuffer(buffer);
7374

7475
foreach(l, incomplete_splits)
7576
{
@@ -137,7 +138,8 @@ _bt_restore_meta(Relation reln, XLogRecPtr lsn,
137138

138139
PageSetLSN(metapg, lsn);
139140
PageSetSUI(metapg, ThisStartUpID);
140-
UnlockAndWriteBuffer(metabuf);
141+
LockBuffer(metabuf, BUFFER_LOCK_UNLOCK);
142+
WriteBuffer(metabuf);
141143
}
142144

143145
static void
@@ -184,7 +186,10 @@ btree_xlog_insert(bool redo, bool isleaf, bool ismeta,
184186
if (redo)
185187
{
186188
if (XLByteLE(lsn, PageGetLSN(page)))
187-
UnlockAndReleaseBuffer(buffer);
189+
{
190+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
191+
ReleaseBuffer(buffer);
192+
}
188193
else
189194
{
190195
if (PageAddItem(page, (Item) datapos, datalen,
@@ -194,7 +199,8 @@ btree_xlog_insert(bool redo, bool isleaf, bool ismeta,
194199

195200
PageSetLSN(page, lsn);
196201
PageSetSUI(page, ThisStartUpID);
197-
UnlockAndWriteBuffer(buffer);
202+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
203+
WriteBuffer(buffer);
198204
}
199205
}
200206
else
@@ -203,7 +209,10 @@ btree_xlog_insert(bool redo, bool isleaf, bool ismeta,
203209
elog(PANIC, "btree_insert_undo: bad page LSN");
204210

205211
if (!P_ISLEAF(pageop))
206-
UnlockAndReleaseBuffer(buffer);
212+
{
213+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
214+
ReleaseBuffer(buffer);
215+
}
207216
else
208217
elog(PANIC, "btree_insert_undo: unimplemented");
209218
}
@@ -275,7 +284,8 @@ btree_xlog_split(bool redo, bool onleft, bool isroot,
275284

276285
PageSetLSN(page, lsn);
277286
PageSetSUI(page, ThisStartUpID);
278-
UnlockAndWriteBuffer(buffer);
287+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
288+
WriteBuffer(buffer);
279289
}
280290
else
281291
{
@@ -310,7 +320,8 @@ btree_xlog_split(bool redo, bool onleft, bool isroot,
310320

311321
PageSetLSN(page, lsn);
312322
PageSetSUI(page, ThisStartUpID);
313-
UnlockAndWriteBuffer(buffer);
323+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
324+
WriteBuffer(buffer);
314325
}
315326
else
316327
{
@@ -334,15 +345,19 @@ btree_xlog_split(bool redo, bool onleft, bool isroot,
334345
elog(PANIC, "btree_split_redo: uninitialized next right page");
335346

336347
if (XLByteLE(lsn, PageGetLSN(page)))
337-
UnlockAndReleaseBuffer(buffer);
348+
{
349+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
350+
ReleaseBuffer(buffer);
351+
}
338352
else
339353
{
340354
pageop = (BTPageOpaque) PageGetSpecialPointer(page);
341355
pageop->btpo_prev = rightsib;
342356

343357
PageSetLSN(page, lsn);
344358
PageSetSUI(page, ThisStartUpID);
345-
UnlockAndWriteBuffer(buffer);
359+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
360+
WriteBuffer(buffer);
346361
}
347362
}
348363
}
@@ -385,7 +400,8 @@ btree_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
385400

386401
if (XLByteLE(lsn, PageGetLSN(page)))
387402
{
388-
UnlockAndReleaseBuffer(buffer);
403+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
404+
ReleaseBuffer(buffer);
389405
return;
390406
}
391407

@@ -407,7 +423,8 @@ btree_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
407423

408424
PageSetLSN(page, lsn);
409425
PageSetSUI(page, ThisStartUpID);
410-
UnlockAndWriteBuffer(buffer);
426+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
427+
WriteBuffer(buffer);
411428
}
412429

413430
static void
@@ -445,7 +462,10 @@ btree_xlog_delete_page(bool redo, bool ismeta,
445462
if (PageIsNew((PageHeader) page))
446463
elog(PANIC, "btree_delete_page_redo: uninitialized parent page");
447464
if (XLByteLE(lsn, PageGetLSN(page)))
448-
UnlockAndReleaseBuffer(buffer);
465+
{
466+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
467+
ReleaseBuffer(buffer);
468+
}
449469
else
450470
{
451471
OffsetNumber poffset;
@@ -472,7 +492,8 @@ btree_xlog_delete_page(bool redo, bool ismeta,
472492

473493
PageSetLSN(page, lsn);
474494
PageSetSUI(page, ThisStartUpID);
475-
UnlockAndWriteBuffer(buffer);
495+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
496+
WriteBuffer(buffer);
476497
}
477498
}
478499

@@ -486,15 +507,19 @@ btree_xlog_delete_page(bool redo, bool ismeta,
486507
if (PageIsNew((PageHeader) page))
487508
elog(PANIC, "btree_delete_page_redo: uninitialized right sibling");
488509
if (XLByteLE(lsn, PageGetLSN(page)))
489-
UnlockAndReleaseBuffer(buffer);
510+
{
511+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
512+
ReleaseBuffer(buffer);
513+
}
490514
else
491515
{
492516
pageop = (BTPageOpaque) PageGetSpecialPointer(page);
493517
pageop->btpo_prev = leftsib;
494518

495519
PageSetLSN(page, lsn);
496520
PageSetSUI(page, ThisStartUpID);
497-
UnlockAndWriteBuffer(buffer);
521+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
522+
WriteBuffer(buffer);
498523
}
499524
}
500525

@@ -510,15 +535,19 @@ btree_xlog_delete_page(bool redo, bool ismeta,
510535
if (PageIsNew((PageHeader) page))
511536
elog(PANIC, "btree_delete_page_redo: uninitialized left sibling");
512537
if (XLByteLE(lsn, PageGetLSN(page)))
513-
UnlockAndReleaseBuffer(buffer);
538+
{
539+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
540+
ReleaseBuffer(buffer);
541+
}
514542
else
515543
{
516544
pageop = (BTPageOpaque) PageGetSpecialPointer(page);
517545
pageop->btpo_next = rightsib;
518546

519547
PageSetLSN(page, lsn);
520548
PageSetSUI(page, ThisStartUpID);
521-
UnlockAndWriteBuffer(buffer);
549+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
550+
WriteBuffer(buffer);
522551
}
523552
}
524553
}
@@ -543,7 +572,8 @@ btree_xlog_delete_page(bool redo, bool ismeta,
543572

544573
PageSetLSN(page, lsn);
545574
PageSetSUI(page, ThisStartUpID);
546-
UnlockAndWriteBuffer(buffer);
575+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
576+
WriteBuffer(buffer);
547577
}
548578
else
549579
{
@@ -606,7 +636,8 @@ btree_xlog_newroot(bool redo, XLogRecPtr lsn, XLogRecord *record)
606636

607637
PageSetLSN(page, lsn);
608638
PageSetSUI(page, ThisStartUpID);
609-
UnlockAndWriteBuffer(buffer);
639+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
640+
WriteBuffer(buffer);
610641

611642
_bt_restore_meta(reln, lsn,
612643
xlrec->rootblk, xlrec->level,
@@ -668,7 +699,8 @@ btree_xlog_newpage(bool redo, XLogRecPtr lsn, XLogRecord *record)
668699

669700
PageSetLSN(page, lsn);
670701
PageSetSUI(page, ThisStartUpID);
671-
UnlockAndWriteBuffer(buffer);
702+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
703+
WriteBuffer(buffer);
672704
}
673705

674706

src/backend/access/transam/xlog.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.127 2003/12/12 18:45:08 petere Exp $
10+
* $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.128 2003/12/14 00:34:47 neilc Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -1712,7 +1712,8 @@ RestoreBkpBlocks(XLogRecord *record, XLogRecPtr lsn)
17121712
memcpy((char *) page, blk, BLCKSZ);
17131713
PageSetLSN(page, lsn);
17141714
PageSetSUI(page, ThisStartUpID);
1715-
UnlockAndWriteBuffer(buffer);
1715+
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
1716+
WriteBuffer(buffer);
17161717
}
17171718
}
17181719

0 commit comments

Comments
 (0)