This is an automated email from the ASF dual-hosted git repository. maxyang pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 1527760d7c8eefa47ae8216775a16185705aa557 Author: chaotian <[email protected]> AuthorDate: Tue Apr 9 16:19:13 2024 +0800 Fix inject_fault suspend cannot be canceled (#17279) Check Interrupt by CHECK_FOR_INTERRUPTS() as FaultInjectorTypeSuspend is sleeping in while() loop. Authored-by: chaotian <[email protected]> fix cancel_query --- src/backend/utils/misc/faultinjector.c | 1 + src/test/isolation2/expected/cancel_query.out | 32 +++++++++++++++++++++++++++ src/test/isolation2/sql/cancel_query.sql | 12 ++++++++++ 3 files changed, 45 insertions(+) diff --git a/src/backend/utils/misc/faultinjector.c b/src/backend/utils/misc/faultinjector.c index df456b3bb0..548ea66370 100644 --- a/src/backend/utils/misc/faultinjector.c +++ b/src/backend/utils/misc/faultinjector.c @@ -476,6 +476,7 @@ FaultInjector_InjectFaultIfSet_out_of_line( while ((entry = FaultInjector_LookupHashEntry(entryLocal->faultName)) != NULL && entry->faultInjectorType != FaultInjectorTypeResume) { + CHECK_FOR_INTERRUPTS(); pg_usleep(1000000L); // 1 sec } diff --git a/src/test/isolation2/expected/cancel_query.out b/src/test/isolation2/expected/cancel_query.out index 4835593cab..38bda39fe4 100644 --- a/src/test/isolation2/expected/cancel_query.out +++ b/src/test/isolation2/expected/cancel_query.out @@ -49,3 +49,35 @@ SELECT gp_inject_fault('zlib_decompress_after_decompress_fn', 'reset', dbid) FRO Success: Success: (8 rows) + +CREATE TABLE a_suspend_blocking(a int, b int, c int); +CREATE +INSERT INTO a_suspend_blocking select i,i,i from generate_series(1, 100) i; +INSERT 100 + +0: SELECT gp_inject_fault_infinite('exec_mpp_query_start', 'suspend', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content >= 0; + gp_inject_fault_infinite +-------------------------- + Success: + Success: + Success: +(3 rows) +0&: SELECT * FROM a_suspend_blocking; <waiting ...> + +1: SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query LIKE 'SELECT * FROM a_suspend_blocking%'; + pg_cancel_backend +------------------- + t +(1 row) +0<: <... completed> +ERROR: canceling statement due to user request + +SELECT gp_inject_fault_infinite('exec_mpp_query_start', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content >= 0; + gp_inject_fault_infinite +-------------------------- + Success: + Success: + Success: +(3 rows) +DROP TABLE a_suspend_blocking; +DROP diff --git a/src/test/isolation2/sql/cancel_query.sql b/src/test/isolation2/sql/cancel_query.sql index b53597ded3..8a4860d6eb 100644 --- a/src/test/isolation2/sql/cancel_query.sql +++ b/src/test/isolation2/sql/cancel_query.sql @@ -39,3 +39,15 @@ PARTITION BY RANGE(a_date) 1<: SELECT gp_inject_fault('zlib_decompress_after_decompress_fn', 'reset', dbid) FROM gp_segment_configuration; + +CREATE TABLE a_suspend_blocking(a int, b int, c int); +INSERT INTO a_suspend_blocking select i,i,i from generate_series(1, 100) i; + +0: SELECT gp_inject_fault_infinite('exec_mpp_query_start', 'suspend', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content >= 0; +0&: SELECT * FROM a_suspend_blocking; + +1: SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE query LIKE 'SELECT * FROM a_suspend_blocking%'; +0<: + +SELECT gp_inject_fault_infinite('exec_mpp_query_start', 'reset', dbid) FROM gp_segment_configuration WHERE role = 'p' AND content >= 0; +DROP TABLE a_suspend_blocking; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
