提交 02e644ae 编写于 作者: J Jacob Champion 提交者: Jacob Champion

Move to BufferGetLSNAtomic where spinlock is needed

Certain callers of PageGetLSN weren't correctly holding the buffer
spinlock; it is needed whenever the buffer content lock is not held in
exclusive mode.

For heapam.c, also ensure that we don't access the LSN after releasing
the lock.
Signed-off-by: NAsim R P <apraveen@pivotal.io>
上级 6f73417b
......@@ -562,7 +562,7 @@ gistfindleaf(GISTInsertState *state, GISTSTATE *giststate)
state->stack->page = (Page) BufferGetPage(state->stack->buffer);
opaque = GistPageGetOpaque(state->stack->page);
state->stack->lsn = PageGetLSN(state->stack->page);
state->stack->lsn = BufferGetLSNAtomic(state->stack->buffer);
Assert(state->r->rd_istemp || !XLogRecPtrIsInvalid(state->stack->lsn));
if (state->stack->blkno != GIST_ROOT_BLKNO &&
......@@ -699,7 +699,7 @@ gistFindPath(Relation r, BlockNumber child)
break;
}
top->lsn = PageGetLSN(page);
top->lsn = BufferGetLSNAtomic(buffer);
if (top->parent && XLByteLT(top->parent->lsn, GistPageGetOpaque(page)->nsn) &&
GistPageGetOpaque(page)->rightlink != InvalidBlockNumber /* sanity check */ )
......
......@@ -43,7 +43,7 @@ killtuple(Relation r, GISTScanOpaque so, ItemPointer iptr)
gistcheckpage(r, so->curbuf);
p = (Page) BufferGetPage(so->curbuf);
if (XLByteEQ(so->stack->lsn, PageGetLSN(p)))
if (XLByteEQ(so->stack->lsn, BufferGetLSNAtomic(so->curbuf)))
{
/* page unchanged, so all is simple */
offset = ItemPointerGetOffsetNumber(iptr);
......@@ -240,7 +240,7 @@ gistnext(IndexScanDesc scan, ScanDirection dir, ItemPointer tids,
opaque = GistPageGetOpaque(p);
/* remember lsn to identify page changed for tuple's killing */
so->stack->lsn = PageGetLSN(p);
so->stack->lsn = BufferGetLSNAtomic(so->curbuf);
/* check page split, occured from last visit or visit to parent */
if (!XLogRecPtrIsInvalid(so->stack->parentlsn) &&
......
......@@ -5241,11 +5241,6 @@ heap_xlog_delete(XLogRecPtr lsn, XLogRecord *record)
if (XLByteLE(lsn, PageGetLSN(page))) /* changes are applied */
{
UnlockReleaseBuffer(buffer);
MIRROREDLOCK_BUFMGR_UNLOCK;
// -------- MirroredLock ----------
if (Debug_print_qd_mirroring)
{
elog(LOG, "delete already appplied: lsn (%X,%X), page (%X,%X)",
......@@ -5254,6 +5249,12 @@ heap_xlog_delete(XLogRecPtr lsn, XLogRecord *record)
PageGetLSN(page).xlogid,
PageGetLSN(page).xrecoff);
}
UnlockReleaseBuffer(buffer);
MIRROREDLOCK_BUFMGR_UNLOCK;
// -------- MirroredLock ----------
return;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册