v2-0007-Improve-database-detection-logic-in-datachecksums.patch
application/octet-stream
Filename: v2-0007-Improve-database-detection-logic-in-datachecksums.patch
Type: application/octet-stream
Part: 6
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: format-patch
Series: patch v2-0007
Subject: Improve database detection logic in datachecksumsworker
| File | + | − |
|---|---|---|
| src/backend/postmaster/datachecksum_state.c | 13 | 3 |
From 20e1c46fb33300954e102b37f13753d71180a185 Mon Sep 17 00:00:00 2001
From: Daniel Gustafsson <dgustafsson@postgresql.org>
Date: Tue, 28 Apr 2026 23:50:01 +0200
Subject: [PATCH v2 7/8] Improve database detection logic in
datachecksumsworker
The worker need to know whether a database which failed checksum
processing still exists, or has been dropped. This improves the
detection logic by checking for being partially dropped.
Author: Daniel Gustafsson <daniel@yesql.se>
Discussion: https://postgr.es/m/xxx
---
src/backend/postmaster/datachecksum_state.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/backend/postmaster/datachecksum_state.c b/src/backend/postmaster/datachecksum_state.c
index be1b0a2d926..352a0f6139e 100644
--- a/src/backend/postmaster/datachecksum_state.c
+++ b/src/backend/postmaster/datachecksum_state.c
@@ -854,8 +854,7 @@ ProcessDatabase(DataChecksumsWorkerDatabase *db)
/*
* Heuristic to see if the database was dropped, and if it was we can
- * treat it as not an error, else treat as fatal and error out. TODO:
- * this could probably be improved with a tighter check.
+ * treat it as not an error, else treat as fatal and error out.
*/
if (DatabaseExists(db->dboid))
return DATACHECKSUMSWORKER_FAILED;
@@ -1340,7 +1339,9 @@ DataChecksumsShmemInit(void *arg)
* DatabaseExists
*
* Scans the system catalog to check if a database with the given Oid exists
- * and returns true if it is found, else false.
+ * and returns true if it is found and valid, else false. Note, we cannot use
+ * database_is_invalid_oid here as it will ERROR out, and we want to gracefully
+ * handle errors.
*/
static bool
DatabaseExists(Oid dboid)
@@ -1350,6 +1351,7 @@ DatabaseExists(Oid dboid)
SysScanDesc scan;
bool found;
HeapTuple tuple;
+ Form_pg_database pg_database_tuple;
StartTransactionCommand();
@@ -1363,6 +1365,14 @@ DatabaseExists(Oid dboid)
tuple = systable_getnext(scan);
found = HeapTupleIsValid(tuple);
+ /* If the Oid exists, ensure that it's not partially dropped */
+ if (found)
+ {
+ pg_database_tuple = (Form_pg_database) GETSTRUCT(tuple);
+ if (database_is_invalid_form(pg_database_tuple))
+ found = false;
+ }
+
systable_endscan(scan);
table_close(rel, AccessShareLock);
--
2.39.3 (Apple Git-146)