As transam's README documents, the general order of actions recommended
when WAL-logging a buffer is to unlock and unpin buffers after leaving a
critical section. This pattern was not being followed by some code
paths of GIN and GiST, adjusted in this commit, where buffers were
either unlocked or unpinned inside a critical section. Based on my
analysis of each code path updated here, there is no reason to not
follow the recommended unlocking/unpin pattern done outside of a
critical section.
These inconsistencies are rather old, coming mainly from
ecaa4708e5dd
and
ff301d6e690b. The guidelines in the README predate these commits,
being introduced in
6d61cdec0761.
Author: Kirill Reshke <reshkekirill@gmail.com>
Discussion: https://postgr.es/m/CALdSSPgBPnpNNzxv0Y+_GNFzW6PmzRZYh+_hpf06Y1N2zLhZaQ@mail.gmail.com
PageSetLSN(page, recptr);
}
- UnlockReleaseBuffer(buffer);
-
END_CRIT_SECTION();
+ UnlockReleaseBuffer(buffer);
+
/* During index build, count the newly-added data page */
if (buildStats)
buildStats->nDataPages++;
/* get free space before releasing buffer */
freesize = PageGetExactFreeSpace(page);
- UnlockReleaseBuffer(buffer);
-
END_CRIT_SECTION();
+ UnlockReleaseBuffer(buffer);
+
return freesize;
}
if (metadata->nPendingPages * GIN_PAGE_FREESIZE > cleanupSize * (Size) 1024)
needCleanup = true;
- UnlockReleaseBuffer(metabuffer);
-
END_CRIT_SECTION();
+ UnlockReleaseBuffer(metabuffer);
+
/*
* Since it could contend with concurrent cleanup process we cleanup
* pending list not forcibly.
}
}
+ END_CRIT_SECTION();
+
for (i = 0; i < data.ndeleted; i++)
UnlockReleaseBuffer(buffers[i]);
- END_CRIT_SECTION();
-
for (i = 0; fill_fsm && i < data.ndeleted; i++)
RecordFreeIndexPage(index, freespace[i]);
PageSetLSN(metapage, recptr);
}
- UnlockReleaseBuffer(metabuffer);
-
END_CRIT_SECTION();
+
+ UnlockReleaseBuffer(metabuffer);
}
/*
PageSetLSN(BufferGetPage(lBuffer), recptr);
}
+ END_CRIT_SECTION();
+
ReleaseBuffer(pBuffer);
ReleaseBuffer(lBuffer);
ReleaseBuffer(dBuffer);
- END_CRIT_SECTION();
-
gvs->result->pages_newly_deleted++;
gvs->result->pages_deleted++;
}
PageRestoreTempPage(resPage, page);
MarkBufferDirty(buffer);
xlogVacuumPage(gvs.index, buffer);
- UnlockReleaseBuffer(buffer);
END_CRIT_SECTION();
+ UnlockReleaseBuffer(buffer);
}
else
{
recptr = XLogInsert(RM_XLOG_ID, XLOG_FPI);
for (i = 0; i < nbufs; i++)
- {
PageSetLSN(BufferGetPage(bufpack[i]), recptr);
- UnlockReleaseBuffer(bufpack[i]);
- }
+
END_CRIT_SECTION();
+
+ for (i = 0; i < nbufs; i++)
+ UnlockReleaseBuffer(bufpack[i]);
}
}