diff options
author | Alexander Korotkov <akorotkov@postgresql.org> | 2018-12-13 22:32:05 +0300 |
---|---|---|
committer | Alexander Korotkov <akorotkov@postgresql.org> | 2018-12-13 22:32:05 +0300 |
commit | bf0e5a73be20b1f010b000c37c9980ac02809fb5 (patch) | |
tree | 557853bee777bef91da6dd37bf70618b35a06c94 | |
parent | 1cf175c74f103e9f0905c41d761940282c3d21f1 (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.c | 10 |
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); } |