summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Korotkov <akorotkov@postgresql.org>2018-12-13 22:32:05 +0300
committerAlexander Korotkov <akorotkov@postgresql.org>2018-12-13 22:32:05 +0300
commitbf0e5a73be20b1f010b000c37c9980ac02809fb5 (patch)
tree557853bee777bef91da6dd37bf70618b35a06c94
parent1cf175c74f103e9f0905c41d761940282c3d21f1 (diff)
Fix wrong backpatching of ginRedoDeletePage() deadlock fix
19cf52e6cc changes lock order in ginRedoDeletePage(). But did it in a wrong way due to oversight during backpatching. This commit fixes that. Reported-by: Bruce Momjian Discussion: https://postgr.es/m/20181213153232.GA10664%40momjian.us
-rw-r--r--src/backend/access/gin/ginxlog.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c
index 091268175e5..76dabf19736 100644
--- a/src/backend/access/gin/ginxlog.c
+++ b/src/backend/access/gin/ginxlog.c
@@ -690,7 +690,7 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
ginxlogDeletePage *data = (ginxlogDeletePage *) XLogRecGetData(record);
Buffer dbuffer;
Buffer pbuffer;
- Buffer lbuffer;
+ Buffer lbuffer = InvalidBlockNumber;
Page page;
/*
@@ -698,7 +698,7 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
* ginStepRight().
*/
if (record->xl_info & XLR_BKP_BLOCK(2))
- (void) RestoreBackupBlock(lsn, record, 2, false, false);
+ lbuffer = RestoreBackupBlock(lsn, record, 2, false, true);
else if (data->leftBlkno != InvalidBlockNumber)
{
lbuffer = XLogReadBuffer(data->node, data->leftBlkno, false);
@@ -712,7 +712,6 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
PageSetLSN(page, lsn);
MarkBufferDirty(lbuffer);
}
- UnlockReleaseBuffer(lbuffer);
}
}
@@ -735,7 +734,7 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
}
if (record->xl_info & XLR_BKP_BLOCK(1))
- pbuffer = RestoreBackupBlock(lsn, record, 1, false, true);
+ (void) RestoreBackupBlock(lsn, record, 1, false, false);
else
{
pbuffer = XLogReadBuffer(data->node, data->parentBlkno, false);
@@ -750,13 +749,12 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
PageSetLSN(page, lsn);
MarkBufferDirty(pbuffer);
}
+ UnlockReleaseBuffer(pbuffer);
}
}
if (BufferIsValid(lbuffer))
UnlockReleaseBuffer(lbuffer);
- if (BufferIsValid(pbuffer))
- UnlockReleaseBuffer(pbuffer);
if (BufferIsValid(dbuffer))
UnlockReleaseBuffer(dbuffer);
}