You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by ma...@apache.org on 2025/02/06 06:20:38 UTC

(cloudberry) 02/12: Fix inject_fault suspend cannot be canceled (#17279)

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 <10...@users.noreply.github.com>
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 <ch...@vmware.com>
    
    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: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org