AtProcExit_Buffers-v2.patch
application/octet-stream
Filename: AtProcExit_Buffers-v2.patch
Type: application/octet-stream
Part: 0
Message:
Re: profiling connection overhead
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch v2
| File | + | − |
|---|---|---|
| src/backend/storage/buffer/bufmgr.c | 8 | 13 |
| src/backend/storage/buffer/localbuf.c | 16 | 3 |
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 54c7109..edc4977 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -1659,31 +1659,26 @@ InitBufferPoolBackend(void)
}
/*
- * Ensure we have released all shared-buffer locks and pins during backend exit
+ * During backend exit, ensure that we released all shared-buffer locks and
+ * assert that we have no remaining pins.
*/
static void
AtProcExit_Buffers(int code, Datum arg)
{
- int i;
-
AbortBufferIO();
UnlockBuffers();
- for (i = 0; i < NBuffers; i++)
+#ifdef USE_ASSERT_CHECKING
+ if (assert_enabled)
{
- if (PrivateRefCount[i] != 0)
- {
- volatile BufferDesc *buf = &(BufferDescriptors[i]);
+ int i;
- /*
- * We don't worry about updating ResourceOwner; if we even got
- * here, it suggests that ResourceOwners are messed up.
- */
- PrivateRefCount[i] = 1; /* make sure we release shared pin */
- UnpinBuffer(buf, false);
+ for (i = 0; i < NBuffers; i++)
+ {
Assert(PrivateRefCount[i] == 0);
}
}
+#endif
/* localbuf.c needs a chance too */
AtProcExit_LocalBuffers();
diff --git a/src/backend/storage/buffer/localbuf.c b/src/backend/storage/buffer/localbuf.c
index 46fddde..efaeca4 100644
--- a/src/backend/storage/buffer/localbuf.c
+++ b/src/backend/storage/buffer/localbuf.c
@@ -468,9 +468,10 @@ AtEOXact_LocalBuffers(bool isCommit)
/*
* AtProcExit_LocalBuffers - ensure we have dropped pins during backend exit.
*
- * This is just like AtProcExit_Buffers, but for local buffers. We have
- * to drop pins to ensure that any attempt to drop temp files doesn't
- * fail in DropRelFileNodeBuffers.
+ * This is just like AtProcExit_Buffers, but for local buffers. We shouldn't
+ * be holding any remaining pins; if we are, and assertions aren't enabled,
+ * we'll fail later in DropRelFileNodeBuffers while trying to drop the temp
+ * rels.
*/
void
AtProcExit_LocalBuffers(void)
@@ -478,4 +479,16 @@ AtProcExit_LocalBuffers(void)
/* just zero the refcounts ... */
if (LocalRefCount)
MemSet(LocalRefCount, 0, NLocBuffer * sizeof(*LocalRefCount));
+
+#ifdef USE_ASSERT_CHECKING
+ if (assert_enabled && LocalRefCount)
+ {
+ int i;
+
+ for (i = 0; i < NLocBuffer; i++)
+ {
+ Assert(LocalRefCount[i] == 0);
+ }
+ }
+#endif
}