diff --git a/gpMgmt/bin/gppylib/programs/clsInjectFault.py b/gpMgmt/bin/gppylib/programs/clsInjectFault.py index 36abe8b1c76e47a8e1b950bf9b0fa41b443bedc0..18bd13f9fcc4aa031bde5bb64d02463ebc88d8f2 100644 --- a/gpMgmt/bin/gppylib/programs/clsInjectFault.py +++ b/gpMgmt/bin/gppylib/programs/clsInjectFault.py @@ -424,6 +424,7 @@ class GpInjectFaultProgram: "cursor_qe_reader_after_snapshot (inject fault after QE READER has populated snashot for cursor)" \ "fsync_counter (inject fault to count buffers fsync'ed by checkpoint process), " \ "bg_buffer_sync_default_logic (inject fault to 'skip' in order to flush all buffers in BgBufferSync()), " \ + "finish_prepared_after_record_commit_prepared (inject fault in FinishPreparedTransaction() after recording the commit prepared record), " \ "all (affects all faults injected, used for 'status' and 'reset'), ") addTo.add_option("-c", "--ddl_statement", dest="ddlStatement", type="string", metavar="ddlStatement", diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index a07c049592f4e340bbcbfd290d3a80544967d619..82143857c6d4890ebeed5a837434eae102f267c7 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -1646,6 +1646,8 @@ FinishPreparedTransaction(const char *gid, bool isCommit, bool raiseErrorIfNotFo END_CRIT_SECTION(); + SIMPLE_FAULT_INJECTOR(FinishPreparedAfterRecordCommitPrepared); + /* Need to figure out the memory allocation and deallocationfor "buffer". For now, just let it leak. */ return true; diff --git a/src/backend/utils/misc/faultinjector.c b/src/backend/utils/misc/faultinjector.c index 1ac56f0344c5b019b1230659340be69f5b0d09db..9dbfda551e84c79ce4f732d45e207030329a39cf 100644 --- a/src/backend/utils/misc/faultinjector.c +++ b/src/backend/utils/misc/faultinjector.c @@ -331,6 +331,8 @@ FaultInjectorIdentifierEnumToString[] = { /* inject fault to 'skip' in order to flush all buffers in BgBufferSync() */ _("bg_buffer_sync_default_logic"), /* inject fault to count buffers fsync'ed by checkpoint process */ + _("finish_prepared_after_record_commit_prepared"), + /* inject fault in FinishPreparedTransaction() after recording the commit prepared record */ _("not recognized"), }; diff --git a/src/include/utils/faultinjector.h b/src/include/utils/faultinjector.h index 1613cc15b241cdd5152d0fed79a0dada8004580d..35257021ba639864b30ee971cc2c0898bff21617 100644 --- a/src/include/utils/faultinjector.h +++ b/src/include/utils/faultinjector.h @@ -221,6 +221,7 @@ typedef enum FaultInjectorIdentifier_e { FsyncCounter, BgBufferSyncDefaultLogic, + FinishPreparedAfterRecordCommitPrepared, /* INSERT has to be done before that line */ FaultInjectorIdMax, diff --git a/src/test/tinc/Makefile b/src/test/tinc/Makefile index fc7cbb2379df4ace8e7f14699efc79d2e5a4353e..f2d2d436ac45cf28d8133a6c2f06ae97d0c09723 100644 --- a/src/test/tinc/Makefile +++ b/src/test/tinc/Makefile @@ -65,7 +65,7 @@ non_discover_targets: aoco_compression filerep_end_to_end fts # stages for configuration requirements. storage: storage_vacuum_xidlimits aocoalter_catalog_loaders \ - storage_queryfinish_and_transactionmanagement \ + storage_uao_and_transactionmanagement \ storage_persistent_accessmethods_and_vacuum \ storage_filerep diff --git a/src/test/tinc/tincrepo/mpp/gpdb/tests/storage/transaction_management/mpp23395/test_mpp23395.py b/src/test/tinc/tincrepo/mpp/gpdb/tests/storage/transaction_management/mpp23395/test_mpp23395.py index c9314badf99665912d3f3848794e8aa503280299..55130677446f667877096b56f1d36cdafbb1722a 100644 --- a/src/test/tinc/tincrepo/mpp/gpdb/tests/storage/transaction_management/mpp23395/test_mpp23395.py +++ b/src/test/tinc/tincrepo/mpp/gpdb/tests/storage/transaction_management/mpp23395/test_mpp23395.py @@ -181,19 +181,17 @@ class mpp23395(MPPTestCase): SET debug_dtm_action = "fail_begin_command"; CREATE TABLE mpp23395(a int); ''' - self.run_sequence(sql, 'twophase_transaction_commit_prepared', 'error', 2, False); + self.run_sequence(sql, 'finish_prepared_after_record_commit_prepared', 'error', 2, False); - # QE panics after writing prepare xlog record. This should cause - # master to broadcast abort but QEs handle the abort in + # Scenario 8: QE panics after writing prepare xlog record. This should + # cause master to broadcast abort but QEs handle the abort in # DTX_CONTEXT_LOCAL_ONLY context. sql = ''' DROP TABLE IF EXISTS mpp23395; CREATE TABLE mpp23395(a int); INSERT INTO mpp23395 VALUES(1), (2), (3); - BEGIN; SET debug_abort_after_segment_prepared = true; DELETE FROM mpp23395; - COMMIT; ''' # No prepared transactions should remain lingering