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]

Reply via email to