diff --git a/src/backend/access/transam/test/xlog_test.c b/src/backend/access/transam/test/xlog_test.c index b02e5133cb5f6d5c98c56a3e36240e68aeda2f35..224a8e17801690dce7346bddba89c5dd9bf148d8 100644 --- a/src/backend/access/transam/test/xlog_test.c +++ b/src/backend/access/transam/test/xlog_test.c @@ -8,13 +8,6 @@ static void KeepLogSeg_wrapper(XLogRecPtr recptr, XLogSegNo *logSegNo) { -#ifdef FAULT_INJECTOR - expect_value(FaultInjector_InjectFaultIfSet, faultName, "keep_log_seg"); - expect_value(FaultInjector_InjectFaultIfSet, ddlStatement, DDLNotSpecified); - expect_value(FaultInjector_InjectFaultIfSet, databaseName, ""); - expect_value(FaultInjector_InjectFaultIfSet, tableName, ""); - will_be_called(FaultInjector_InjectFaultIfSet); -#endif KeepLogSeg(recptr, logSegNo); } diff --git a/src/backend/utils/misc/faultinjector.c b/src/backend/utils/misc/faultinjector.c index f1c19eae48957718b2b27aba759de81895ffa425..814a5476619223809db4cdb122699561ed213e46 100644 --- a/src/backend/utils/misc/faultinjector.c +++ b/src/backend/utils/misc/faultinjector.c @@ -61,6 +61,14 @@ bool am_faulthandler = false; static FaultInjectorShmem_s *faultInjectorShmem = NULL; +/* + * faultInjectorSlots_ptr points to this until shmem is initialized. Just to + * keep any FaultInjector_InjectFaultIfSet calls from crashing. + */ +static int dummyslots = 0; + +int *faultInjectorSlots_ptr = &dummyslots; + static void FiLockAcquire(void); static void FiLockRelease(void); @@ -199,6 +207,8 @@ FaultInjector_ShmemInit(void) (errcode(ERRCODE_OUT_OF_MEMORY), (errmsg("not enough shared memory for fault injector")))); } + + faultInjectorSlots_ptr = &faultInjectorShmem->faultInjectorSlots; if (! foundPtr) { @@ -230,7 +240,7 @@ FaultInjector_ShmemInit(void) } FaultInjectorType_e -FaultInjector_InjectFaultIfSet( +FaultInjector_InjectFaultIfSet_out_of_line( const char* faultName, DDLStatement_e ddlStatement, const char* databaseName, diff --git a/src/backend/utils/mmgr/test/runaway_cleaner_test.c b/src/backend/utils/mmgr/test/runaway_cleaner_test.c index c5f0b6fd2cc3b028b3be59216ffddaef36837ed7..4cb391d7b836fdf2253db4c7865d3ef7de23e019 100755 --- a/src/backend/utils/mmgr/test/runaway_cleaner_test.c +++ b/src/backend/utils/mmgr/test/runaway_cleaner_test.c @@ -149,14 +149,6 @@ test__RunawayCleaner_StartCleanup__StartsPrimaryCleanupIfPossible(void **state) gp_command_count = 1; will_return(IsTransactionState, true); -#ifdef FAULT_INJECTOR - expect_value(FaultInjector_InjectFaultIfSet, faultName, "runaway_cleanup"); - expect_value(FaultInjector_InjectFaultIfSet, ddlStatement, DDLNotSpecified); - expect_value(FaultInjector_InjectFaultIfSet, databaseName, ""); - expect_value(FaultInjector_InjectFaultIfSet, tableName, ""); - will_be_called(FaultInjector_InjectFaultIfSet); -#endif - EXPECT_EREPORT(ERROR); PG_TRY(); @@ -216,14 +208,6 @@ test__RunawayCleaner_StartCleanup__StartsSecondaryCleanupIfPossible(void **state will_return(superuser, false); will_return(IsTransactionState, true); -#ifdef FAULT_INJECTOR - expect_value(FaultInjector_InjectFaultIfSet, faultName, "runaway_cleanup"); - expect_value(FaultInjector_InjectFaultIfSet, ddlStatement, DDLNotSpecified); - expect_value(FaultInjector_InjectFaultIfSet, databaseName, ""); - expect_value(FaultInjector_InjectFaultIfSet, tableName, ""); - will_be_called(FaultInjector_InjectFaultIfSet); -#endif - EXPECT_EREPORT(ERROR); PG_TRY(); diff --git a/src/include/utils/faultinjector.h b/src/include/utils/faultinjector.h index df5e93f1415ff08bdd76d575902a71d609f83a71..04d848f292a61274ffeb4233ee958b35089eb5c0 100644 --- a/src/include/utils/faultinjector.h +++ b/src/include/utils/faultinjector.h @@ -85,12 +85,25 @@ extern Size FaultInjector_ShmemSize(void); extern void FaultInjector_ShmemInit(void); -extern FaultInjectorType_e FaultInjector_InjectFaultIfSet( +/* + * To check if a fault has been injected, use FaultInjector_InjectFaultIfSet(). + * It is designed to fall through as quickly as possible, when no faults are + * activated. + */ +extern FaultInjectorType_e FaultInjector_InjectFaultIfSet_out_of_line( const char* faultName, DDLStatement_e ddlStatement, const char* databaseName, const char* tableName); +#define FaultInjector_InjectFaultIfSet(faultName, ddlStatement, databaseName, tableName) \ + (((*faultInjectorSlots_ptr) > 0) ? \ + FaultInjector_InjectFaultIfSet_out_of_line(faultName, ddlStatement, databaseName, tableName) : \ + FaultInjectorTypeNotSpecified) + +extern int *faultInjectorSlots_ptr; + + extern char *InjectFault( char *faultName, char *type, char *ddlStatement, char *databaseName, char *tableName, int startOccurrence, int endOccurrence, int extraArg);