Skip to content

Commit bf0e5a7

Browse files
committed
Fix wrong backpatching of ginRedoDeletePage() deadlock fix
19cf52e 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
1 parent 1cf175c commit bf0e5a7

File tree

1 file changed

+4
-6
lines changed

1 file changed

+4
-6
lines changed

src/backend/access/gin/ginxlog.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -690,15 +690,15 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
690690
ginxlogDeletePage *data = (ginxlogDeletePage *) XLogRecGetData(record);
691691
Buffer dbuffer;
692692
Buffer pbuffer;
693-
Buffer lbuffer;
693+
Buffer lbuffer = InvalidBlockNumber;
694694
Page page;
695695

696696
/*
697697
* Lock left page first in order to prevent possible deadlock with
698698
* ginStepRight().
699699
*/
700700
if (record->xl_info & XLR_BKP_BLOCK(2))
701-
(void) RestoreBackupBlock(lsn, record, 2, false, false);
701+
lbuffer = RestoreBackupBlock(lsn, record, 2, false, true);
702702
else if (data->leftBlkno != InvalidBlockNumber)
703703
{
704704
lbuffer = XLogReadBuffer(data->node, data->leftBlkno, false);
@@ -712,7 +712,6 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
712712
PageSetLSN(page, lsn);
713713
MarkBufferDirty(lbuffer);
714714
}
715-
UnlockReleaseBuffer(lbuffer);
716715
}
717716
}
718717

@@ -735,7 +734,7 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
735734
}
736735

737736
if (record->xl_info & XLR_BKP_BLOCK(1))
738-
pbuffer = RestoreBackupBlock(lsn, record, 1, false, true);
737+
(void) RestoreBackupBlock(lsn, record, 1, false, false);
739738
else
740739
{
741740
pbuffer = XLogReadBuffer(data->node, data->parentBlkno, false);
@@ -750,13 +749,12 @@ ginRedoDeletePage(XLogRecPtr lsn, XLogRecord *record)
750749
PageSetLSN(page, lsn);
751750
MarkBufferDirty(pbuffer);
752751
}
752+
UnlockReleaseBuffer(pbuffer);
753753
}
754754
}
755755

756756
if (BufferIsValid(lbuffer))
757757
UnlockReleaseBuffer(lbuffer);
758-
if (BufferIsValid(pbuffer))
759-
UnlockReleaseBuffer(pbuffer);
760758
if (BufferIsValid(dbuffer))
761759
UnlockReleaseBuffer(dbuffer);
762760
}

0 commit comments

Comments
 (0)