From 74cb8dcca0da6030dc8b54db6548b8c5235f5995 Mon Sep 17 00:00:00 2001 From: Ashwin Agrawal Date: Mon, 7 Oct 2019 15:15:03 -0700 Subject: [PATCH] Add retry in test reader_waits_for_lock for lock checking Command in next session gets executed in parallel to current session in case "&" is used. Hence, if session 1 command is running very slow, but session 0 commands gets executed fast, can cause flaky test. To avoid the same, add retries to check for all processes for session are blocked or not. --- .../expected/reader_waits_for_lock.out | 12 ++++++---- .../isolation2/sql/reader_waits_for_lock.sql | 23 ++++++++++++++++++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/test/isolation2/expected/reader_waits_for_lock.out b/src/test/isolation2/expected/reader_waits_for_lock.out index 362894cc09..7a90f11735 100644 --- a/src/test/isolation2/expected/reader_waits_for_lock.out +++ b/src/test/isolation2/expected/reader_waits_for_lock.out @@ -2,6 +2,10 @@ -- available. There used to be a bug where reader didn't wait even if lock was -- held by some other session. +-- Helper function +CREATE or REPLACE FUNCTION check_session_processes_are_blocked (session_number int) /*in func*/ RETURNS bool AS $$ declare retries int; /* in func */ begin /* in func */ retries := 1200; /* in func */ loop /* in func */ if (SELECT count(case when waiting then 1 end) = count(*) all_waiting FROM pg_stat_activity where sess_id = session_number) then /* in func */ return true; /* in func */ end if; /* in func */ if retries <= 0 then /* in func */ return false; /* in func */ end if; /* in func */ perform pg_sleep(0.1); /* in func */ retries := retries - 1; /* in func */ end loop; /* in func */ end; /* in func */ $$ language plpgsql; +CREATE + -- setup 1: create table reader_waits_for_lock_table(a int, b int) distributed by (a); CREATE @@ -17,10 +21,10 @@ LOCK -- creates reader and writer gang 1&: SELECT t1.* FROM reader_waits_for_lock_table t1 INNER JOIN reader_waits_for_lock_table t2 ON t1.b = t2.b; -- all processes in the session 1 should be blocked -0U: SELECT count(case when waiting then 1 end) = count(*) all_waiting FROM pg_stat_activity where sess_id = (SELECT setting FROM reader_waits_for_lock_table_sessionid); - all_waiting -------------- - t +0U: select check_session_processes_are_blocked((SELECT setting FROM reader_waits_for_lock_table_sessionid)); + check_session_processes_are_blocked +------------------------------------- + t (1 row) 0U: COMMIT; COMMIT diff --git a/src/test/isolation2/sql/reader_waits_for_lock.sql b/src/test/isolation2/sql/reader_waits_for_lock.sql index f99cb573f4..d3f624a763 100644 --- a/src/test/isolation2/sql/reader_waits_for_lock.sql +++ b/src/test/isolation2/sql/reader_waits_for_lock.sql @@ -2,6 +2,27 @@ -- available. There used to be a bug where reader didn't wait even if lock was -- held by some other session. +-- Helper function +CREATE or REPLACE FUNCTION check_session_processes_are_blocked (session_number int) /*in func*/ +RETURNS bool AS +$$ +declare +retries int; /* in func */ +begin /* in func */ + retries := 1200; /* in func */ + loop /* in func */ + if (SELECT count(case when waiting then 1 end) = count(*) all_waiting FROM pg_stat_activity where sess_id = session_number) then /* in func */ + return true; /* in func */ + end if; /* in func */ + if retries <= 0 then /* in func */ + return false; /* in func */ + end if; /* in func */ + perform pg_sleep(0.1); /* in func */ + retries := retries - 1; /* in func */ + end loop; /* in func */ +end; /* in func */ +$$ language plpgsql; + -- setup 1: create table reader_waits_for_lock_table(a int, b int) distributed by (a); 1: insert into reader_waits_for_lock_table select 1, 1; @@ -12,6 +33,6 @@ -- creates reader and writer gang 1&: SELECT t1.* FROM reader_waits_for_lock_table t1 INNER JOIN reader_waits_for_lock_table t2 ON t1.b = t2.b; -- all processes in the session 1 should be blocked -0U: SELECT count(case when waiting then 1 end) = count(*) all_waiting FROM pg_stat_activity where sess_id = (SELECT setting FROM reader_waits_for_lock_table_sessionid); +0U: select check_session_processes_are_blocked((SELECT setting FROM reader_waits_for_lock_table_sessionid)); 0U: COMMIT; 1<: -- GitLab