| -- Test crash recovery when the coordinator panics right before |
| -- removing the database's tuple from pg_database. |
| -- |
| -- The fault injection point 'after_dbdrop_tuple_update_tuple' is |
| -- reached in dropdb() after all the preconditions have been checked |
| -- (permissions, active backends, etc.) and after the DROP has been |
| -- dispatched to the segments, but *before* the pg_database tuple is |
| -- deleted on the coordinator. If the coordinator panics here, the |
| -- transaction aborts and the tuple must remain, so the database |
| -- should still be present in pg_database after recovery. |
| |
| -- start_matchsubs |
| -- m/PANIC: fault triggered, fault name:'after_dbdrop_tuple_update_tuple' fault type:'panic'\n/ |
| -- s/PANIC: fault triggered, fault name:'after_dbdrop_tuple_update_tuple' fault type:'panic'\n// |
| -- end_matchsubs |
| |
| -- Create the extension that provides the fault injector functions. |
| 1:CREATE EXTENSION IF NOT EXISTS gp_inject_fault; |
| |
| -- Create a database to be dropped. |
| 1:DROP DATABASE IF EXISTS dropdb_crash_test; |
| 1:CREATE DATABASE dropdb_crash_test; |
| |
| -- Inject a panic fault on the coordinator (content = -1, role = p), |
| -- at the point right before the pg_database tuple is removed. |
| 1:SELECT gp_inject_fault('after_dbdrop_tuple_update_tuple', 'panic', dbid) |
| FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; |
| |
| -- DROP DATABASE will panic right before removing the tuple. |
| 1:DROP DATABASE dropdb_crash_test; |
| |
| -- Wait for the coordinator to come back up after crash recovery. |
| 2:SELECT 1; |
| |
| -- The database tuple should still be in pg_database because the |
| -- transaction that removes it was aborted by the panic. |
| 2:SELECT datconnlimit, datname FROM pg_database WHERE datname = 'dropdb_crash_test'; |
| |
| -- Reset any leftover faults as a safety net in case the panic did |
| -- not fire for some reason. |
| 2:SELECT gp_inject_fault('after_dbdrop_tuple_update_tuple', 'reset', dbid) |
| FROM gp_segment_configuration WHERE content = -1 AND role = 'p'; |
| |
| -- Now drop the database for real, to clean up. |
| 2:DROP DATABASE dropdb_crash_test; |
| |
| -- Verify it's gone. |
| 2:SELECT datname FROM pg_database WHERE datname = 'dropdb_crash_test'; |