mirror of
https://github.com/postgres/postgres.git
synced 2026-05-27 20:27:28 -04:00
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> Reviewed-by: Tomas Vondra <tomas@vondra.me> Reviewed-by: SATYANARAYANA NARLAPURAM <satyanarlapuram@gmail.com> Reviewed-by: Ayush Tiwari <ayushtiwari.slg01@gmail.com> Discussion: https://postgr.es/m/9197F930-DDEB-4CAC-82A2-16FEC715CCE8@yesql.se
This commit is contained in:
parent
bf25e5571b
commit
1df361e3d8
1 changed files with 13 additions and 3 deletions
|
|
@ -848,8 +848,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;
|
||||
|
|
@ -1314,7 +1313,9 @@ DataChecksumsShmemRequest(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)
|
||||
|
|
@ -1324,6 +1325,7 @@ DatabaseExists(Oid dboid)
|
|||
SysScanDesc scan;
|
||||
bool found;
|
||||
HeapTuple tuple;
|
||||
Form_pg_database pg_database_tuple;
|
||||
|
||||
StartTransactionCommand();
|
||||
|
||||
|
|
@ -1337,6 +1339,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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue