Skip to content

Commit 19ef5ec

Browse files
melihmutlukpan2034
authored andcommitted
Fix flaky CAgg isolation tests (timescale#10076)
cagg_concurrent_register and cagg_refresh_cleanup_register tests were flaky due to different completion order of steps on some environments. Fix them by adding annotations.
1 parent 3eec487 commit 19ef5ec

4 files changed

Lines changed: 29 additions & 46 deletions

File tree

tsl/test/isolation/expected/cagg_concurrent_register.out

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ step s5_show_running_jobs:
3535
to_timestamp(r.end_range / 1000000) AT TIME ZONE 'UTC' AS end_ts_utc
3636
FROM _timescaledb_catalog.continuous_aggs_jobs_refresh_ranges r
3737
JOIN _timescaledb_catalog.continuous_agg ca ON r.materialization_id = ca.mat_hypertable_id
38-
ORDER BY ca.user_view_name;
38+
ORDER BY ca.user_view_name, start_range;
3939

4040
cagg_name| start_range| end_range|start_ts_utc |end_ts_utc
4141
---------+----------------+----------------+------------------------+------------------------
@@ -44,13 +44,14 @@ cagg_2 |1578153600000000|1578182400000000|Sat Jan 04 16:00:00 2020|Sun Jan 05
4444

4545
step s4_release_before_process_cagg_invalidations:
4646
SELECT debug_waitpoint_release('before_process_cagg_invalidations_for_refresh_lock');
47-
47+
<waiting ...>
48+
step s1_run_cagg1_refresh: <... completed>
49+
step s2_run_cagg2_overlap_refresh: <... completed>
50+
step s4_release_before_process_cagg_invalidations: <... completed>
4851
debug_waitpoint_release
4952
-----------------------
5053

5154

52-
step s1_run_cagg1_refresh: <... completed>
53-
step s2_run_cagg2_overlap_refresh: <... completed>
5455

5556
starting permutation: s2_insert_new_data_2020 s3_lock_before_register s1_run_cagg2_overlap_refresh s2_run_cagg2_overlap_refresh s4_enable_before_process_cagg_invalidations s3_release_after_register s5_show_running_jobs s4_release_before_process_cagg_invalidations
5657
step s2_insert_new_data_2020:
@@ -87,23 +88,24 @@ step s5_show_running_jobs:
8788
to_timestamp(r.end_range / 1000000) AT TIME ZONE 'UTC' AS end_ts_utc
8889
FROM _timescaledb_catalog.continuous_aggs_jobs_refresh_ranges r
8990
JOIN _timescaledb_catalog.continuous_agg ca ON r.materialization_id = ca.mat_hypertable_id
90-
ORDER BY ca.user_view_name;
91+
ORDER BY ca.user_view_name, start_range;
9192

9293
cagg_name| start_range| end_range|start_ts_utc |end_ts_utc
9394
---------+----------------+----------------+------------------------+------------------------
94-
cagg_2 |1578268800000000|1578355200000000|Mon Jan 06 00:00:00 2020|Tue Jan 07 00:00:00 2020
9595
cagg_2 |1578153600000000|1578182400000000|Sat Jan 04 16:00:00 2020|Sun Jan 05 00:00:00 2020
96+
cagg_2 |1578268800000000|1578355200000000|Mon Jan 06 00:00:00 2020|Tue Jan 07 00:00:00 2020
9697

9798
step s4_release_before_process_cagg_invalidations:
9899
SELECT debug_waitpoint_release('before_process_cagg_invalidations_for_refresh_lock');
99-
100+
<waiting ...>
101+
step s1_run_cagg2_overlap_refresh: <... completed>
102+
ERROR: could not refresh continuous aggregate "cagg_2" due to a concurrent refresh
103+
step s2_run_cagg2_overlap_refresh: <... completed>
104+
step s4_release_before_process_cagg_invalidations: <... completed>
100105
debug_waitpoint_release
101106
-----------------------
102107

103108

104-
step s1_run_cagg2_overlap_refresh: <... completed>
105-
ERROR: could not refresh continuous aggregate "cagg_2" due to a concurrent refresh
106-
step s2_run_cagg2_overlap_refresh: <... completed>
107109

108110
starting permutation: s2_insert_new_data_2020 s3_lock_before_register s1_run_cagg2_nonoverlap_refresh s2_run_cagg2_overlap_refresh s4_enable_before_process_cagg_invalidations s3_release_after_register s5_show_running_jobs s4_release_before_process_cagg_invalidations
109111
step s2_insert_new_data_2020:
@@ -140,7 +142,7 @@ step s5_show_running_jobs:
140142
to_timestamp(r.end_range / 1000000) AT TIME ZONE 'UTC' AS end_ts_utc
141143
FROM _timescaledb_catalog.continuous_aggs_jobs_refresh_ranges r
142144
JOIN _timescaledb_catalog.continuous_agg ca ON r.materialization_id = ca.mat_hypertable_id
143-
ORDER BY ca.user_view_name;
145+
ORDER BY ca.user_view_name, start_range;
144146

145147
cagg_name| start_range| end_range|start_ts_utc |end_ts_utc
146148
---------+----------------+----------------+------------------------+------------------------
@@ -149,10 +151,11 @@ cagg_2 |1578153600000000|1578182400000000|Sat Jan 04 16:00:00 2020|Sun Jan 05
149151

150152
step s4_release_before_process_cagg_invalidations:
151153
SELECT debug_waitpoint_release('before_process_cagg_invalidations_for_refresh_lock');
152-
154+
<waiting ...>
155+
step s1_run_cagg2_nonoverlap_refresh: <... completed>
156+
step s2_run_cagg2_overlap_refresh: <... completed>
157+
step s4_release_before_process_cagg_invalidations: <... completed>
153158
debug_waitpoint_release
154159
-----------------------
155160

156161

157-
step s1_run_cagg2_nonoverlap_refresh: <... completed>
158-
step s2_run_cagg2_overlap_refresh: <... completed>

tsl/test/isolation/expected/cagg_refresh_cleanup_register.out

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Parsed test spec with 9 sessions
22

3-
starting permutation: WP_mat_enable R2_refresh L1_lock WP_mat_disable WP_enable_after_refresh R3_refresh R4_refresh check_locks check_jobs L1_unlock WP_disable_after_refresh check_locks check_jobs
3+
starting permutation: WP_mat_enable R2_refresh L1_lock WP_mat_disable R3_refresh R4_refresh check_locks check_jobs L1_unlock check_locks check_jobs
44
step WP_mat_enable: SELECT debug_waitpoint_enable('after_process_cagg_materializations');
55
debug_waitpoint_enable
66
----------------------
@@ -19,11 +19,6 @@ debug_waitpoint_release
1919
-----------------------
2020

2121

22-
step WP_enable_after_refresh: SELECT debug_waitpoint_enable('after_cagg_refresh_window');
23-
debug_waitpoint_enable
24-
----------------------
25-
26-
2722
step R3_refresh:
2823
CALL refresh_continuous_aggregate('cond_daily', '2026-02-15', '2026-03-15');
2924
<waiting ...>
@@ -59,15 +54,11 @@ cond_daily |Sun Feb 08 16:00:00 2026 PST|Sat Feb 14 16:00:00 2026 PST
5954

6055
step L1_unlock:
6156
COMMIT;
62-
63-
step WP_disable_after_refresh: SELECT debug_waitpoint_release('after_cagg_refresh_window');
64-
debug_waitpoint_release
65-
-----------------------
66-
67-
57+
<waiting ...>
6858
step R2_refresh: <... completed>
6959
step R3_refresh: <... completed>
7060
step R4_refresh: <... completed>
61+
step L1_unlock: <... completed>
7162
step check_locks:
7263
SELECT l.mode, l.granted
7364
FROM pg_locks l
@@ -91,7 +82,7 @@ user_view_name|start_time|end_time
9182
--------------+----------+--------
9283

9384

94-
starting permutation: WP_mat_enable R2_refresh L1_lock WP_mat_disable WP_after_register_enable R3_refresh R4_overlapping_refresh check_locks check_jobs L1_unlock WP_after_register_disable check_locks check_jobs
85+
starting permutation: WP_mat_enable R2_refresh L1_lock WP_mat_disable R3_refresh R4_overlapping_refresh check_locks check_jobs L1_unlock check_locks check_jobs
9586
step WP_mat_enable: SELECT debug_waitpoint_enable('after_process_cagg_materializations');
9687
debug_waitpoint_enable
9788
----------------------
@@ -110,11 +101,6 @@ debug_waitpoint_release
110101
-----------------------
111102

112103

113-
step WP_after_register_enable: SELECT debug_waitpoint_enable('cagg_refresh_after_register');
114-
debug_waitpoint_enable
115-
----------------------
116-
117-
118104
step R3_refresh:
119105
CALL refresh_continuous_aggregate('cond_daily', '2026-02-15', '2026-03-15');
120106
<waiting ...>
@@ -150,16 +136,12 @@ cond_daily |Sun Feb 08 16:00:00 2026 PST|Sat Feb 14 16:00:00 2026 PST
150136

151137
step L1_unlock:
152138
COMMIT;
153-
154-
step WP_after_register_disable: SELECT debug_waitpoint_release('cagg_refresh_after_register');
155-
debug_waitpoint_release
156-
-----------------------
157-
158-
139+
<waiting ...>
159140
step R2_refresh: <... completed>
160141
step R3_refresh: <... completed>
161142
step R4_overlapping_refresh: <... completed>
162143
ERROR: could not refresh continuous aggregate "cond_daily" due to a concurrent refresh
144+
step L1_unlock: <... completed>
163145
step check_locks:
164146
SELECT l.mode, l.granted
165147
FROM pg_locks l

tsl/test/isolation/specs/cagg_concurrent_register.spec

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,18 @@ step "s5_show_running_jobs" {
114114
to_timestamp(r.end_range / 1000000) AT TIME ZONE 'UTC' AS end_ts_utc
115115
FROM _timescaledb_catalog.continuous_aggs_jobs_refresh_ranges r
116116
JOIN _timescaledb_catalog.continuous_agg ca ON r.materialization_id = ca.mat_hypertable_id
117-
ORDER BY ca.user_view_name;
117+
ORDER BY ca.user_view_name, start_range;
118118
}
119119

120120
# TEST: when 2 concurrent refresh processes on cagg1 and cagg2 start, 1 will wait for the other one to finish registration
121121
## block the processes before they register, then block again before they finish cagg invalidation processing
122122
## so that we can see the active ranges before the refresh processes exit.
123-
permutation "s2_insert_new_data_2020" "s3_lock_before_register" "s1_run_cagg1_refresh" "s2_run_cagg2_overlap_refresh" "s4_enable_before_process_cagg_invalidations" "s3_release_after_register" "s5_show_running_jobs" "s4_release_before_process_cagg_invalidations"
123+
permutation "s2_insert_new_data_2020" "s3_lock_before_register" "s1_run_cagg1_refresh" "s2_run_cagg2_overlap_refresh"("s1_run_cagg1_refresh") "s4_enable_before_process_cagg_invalidations" "s3_release_after_register" "s5_show_running_jobs" "s4_release_before_process_cagg_invalidations"("s2_run_cagg2_overlap_refresh")
124124

125125
# TEST: Check that two overlapping refresh on cagg2 will not run concurrently. overlap refresh job will fail.
126126
## so we will see only 1 running job.
127-
permutation "s2_insert_new_data_2020" "s3_lock_before_register" "s1_run_cagg2_overlap_refresh" "s2_run_cagg2_overlap_refresh" "s4_enable_before_process_cagg_invalidations" "s3_release_after_register" "s5_show_running_jobs" "s4_release_before_process_cagg_invalidations"
127+
permutation "s2_insert_new_data_2020" "s3_lock_before_register" "s1_run_cagg2_overlap_refresh" "s2_run_cagg2_overlap_refresh"("s1_run_cagg2_overlap_refresh") "s4_enable_before_process_cagg_invalidations" "s3_release_after_register" "s5_show_running_jobs" "s4_release_before_process_cagg_invalidations"("s2_run_cagg2_overlap_refresh")
128128

129129
# TEST: Check that two non-overlapping refresh on cagg2 will run concurrently
130130
## we should see both jobs
131-
permutation "s2_insert_new_data_2020" "s3_lock_before_register" "s1_run_cagg2_nonoverlap_refresh" "s2_run_cagg2_overlap_refresh"(s1_run_cagg2_nonoverlap_refresh) "s4_enable_before_process_cagg_invalidations" "s3_release_after_register" "s5_show_running_jobs" "s4_release_before_process_cagg_invalidations"
131+
permutation "s2_insert_new_data_2020" "s3_lock_before_register" "s1_run_cagg2_nonoverlap_refresh" "s2_run_cagg2_overlap_refresh"("s1_run_cagg2_nonoverlap_refresh") "s4_enable_before_process_cagg_invalidations" "s3_release_after_register" "s5_show_running_jobs" "s4_release_before_process_cagg_invalidations"("s2_run_cagg2_overlap_refresh")

tsl/test/isolation/specs/cagg_refresh_cleanup_register.spec

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,6 @@ step "WP_before_txn2_start_enable" { SELECT debug_waitpoint_enable('cagg_refres
7474
step "WP_before_txn2_start_disable" { SELECT debug_waitpoint_release('cagg_refresh_after_register'); }
7575
step "WP_after_register_enable" { SELECT debug_waitpoint_enable('cagg_refresh_after_register'); }
7676
step "WP_after_register_disable" { SELECT debug_waitpoint_release('cagg_refresh_after_register'); }
77-
step "WP_enable_after_refresh" { SELECT debug_waitpoint_enable('after_cagg_refresh_window'); }
78-
step "WP_disable_after_refresh" { SELECT debug_waitpoint_release('after_cagg_refresh_window'); }
7977
8078
# Session K1: terminate R1's backend so its PID becomes dead in the
8179
# registration table, then wait until the process is gone.
@@ -222,11 +220,11 @@ step "P1_run_policy" {
222220

223221
# Two refreshes wait for registration, one waits for cleanup before exiting. All blocked on an AccessExclusiveLock on continuous_aggs_jobs_refresh_ranges.
224222
# None of those refreshes overlaps, so all should succeed.
225-
permutation "WP_mat_enable" "R2_refresh" "L1_lock" "WP_mat_disable" "WP_enable_after_refresh" "R3_refresh"("R2_refresh") "R4_refresh"("R3_refresh") "check_locks" "check_jobs" "L1_unlock" "WP_disable_after_refresh" "check_locks" "check_jobs"
223+
permutation "WP_mat_enable" "R2_refresh" "L1_lock" "WP_mat_disable" "R3_refresh"("R2_refresh") "R4_refresh"("R3_refresh") "check_locks" "check_jobs" "L1_unlock"("R4_refresh") "check_locks" "check_jobs"
226224

227225
# Two refreshes wait for registration, one waits for cleanup before exiting. All blocked on an AccessExclusiveLock on continuous_aggs_jobs_refresh_ranges.
228226
# Refreshes waiting for registration overlap with each other, so one should fail.
229-
permutation "WP_mat_enable" "R2_refresh" "L1_lock" "WP_mat_disable" "WP_after_register_enable" "R3_refresh"("R2_refresh") "R4_overlapping_refresh"("R3_refresh") "check_locks" "check_jobs" "L1_unlock" "WP_after_register_disable" "check_locks" "check_jobs"
227+
permutation "WP_mat_enable" "R2_refresh" "L1_lock" "WP_mat_disable" "R3_refresh"("R2_refresh") "R4_overlapping_refresh"("R3_refresh") "check_locks" "check_jobs" "L1_unlock"("R4_overlapping_refresh") "check_locks" "check_jobs"
230228

231229
## Refresh registers . But fails in txn2. Gets into catch block. Cleanup should succeed
232230
permutation "WP_before_txn2_start_enable" "R3_refresh" "check_jobs" "A1_revoke_perm" "WP_before_txn2_start_disable"("A1_revoke_perm") "check_jobs"

0 commit comments

Comments
 (0)