aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Geoghegan <pg@bowt.ie>2020-07-19 09:46:44 -0700
committerPeter Geoghegan <pg@bowt.ie>2020-07-19 09:46:44 -0700
commit46ef520b9566d9eccb095ceafa53e5c305cf80b9 (patch)
tree66fef2009f90c6bf7ad09b70d05798d37afa607e
parent72eab84a565cbc0677bf8907cd4bfaddf064bd64 (diff)
downloadpostgresql-46ef520b9566d9eccb095ceafa53e5c305cf80b9.tar.gz
postgresql-46ef520b9566d9eccb095ceafa53e5c305cf80b9.zip
Mark buffers as defined to Valgrind consistently.
Make PinBuffer() mark buffers as defined to Valgrind unconditionally, including when the buffer header spinlock must be acquired. Failure to handle that case could lead to false positive reports from Valgrind. This theoretically creates a risk that we'll mark buffers defined even when external callers don't end up with a buffer pin. That seems perfectly acceptable, though, since in general we make no guarantees about buffers that are unsafe to access being reliably marked as unsafe. Oversight in commit 1e0dfd16, which added valgrind buffer access instrumentation.
-rw-r--r--src/backend/storage/buffer/bufmgr.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 8ef073b3821..83d91b14fb1 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -1636,11 +1636,13 @@ PinBuffer(BufferDesc *buf, BufferAccessStrategy strategy)
result = (buf_state & BM_VALID) != 0;
/*
- * If we successfully acquired our first pin on this buffer
- * within this backend, mark buffer contents defined
+ * Assume that we acquired a buffer pin for the purposes of
+ * Valgrind buffer client checks (even in !result case) to
+ * keep things simple. Buffers that are unsafe to access are
+ * not generally guaranteed to be marked undefined in any
+ * case.
*/
- if (result)
- VALGRIND_MAKE_MEM_DEFINED(BufHdrGetBlock(buf), BLCKSZ);
+ VALGRIND_MAKE_MEM_DEFINED(BufHdrGetBlock(buf), BLCKSZ);
break;
}
}