Skip to content

Commit 2514a45

Browse files
committed
test: renew scheduler leases held across slow contract setup
Four contracts hold one 30-second lease across many store transactions. On a slow runner the lease expired before the call under test and the contract failed Fenced. A background renewal, as a running scheduler does, keeps the epoch; LEASE_TTL_SECONDS is unchanged.
1 parent 2c90584 commit 2514a45

5 files changed

Lines changed: 33 additions & 3 deletions

File tree

‎crates/sqlbuild-orchestration/tests/scheduler/helpers.rs‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,36 @@ pub(crate) use crate::scheduler::main::_acquire_lease::acquire_lease;
44
pub(crate) use crate::scheduler::main::_evaluate_trigger::evaluate_trigger;
55
pub(crate) use crate::scheduler::main::_scheduler_cycle::scheduler_cycle;
66
use crate::scheduler::main::renew_lease::renew_lease;
7+
use crate::scheduler::models::SchedulerLease;
78
use crate::store::errors::ControlError;
89
use crate::store::main::migrate_store::migrate_store;
10+
use crate::store::models::ControlStore;
11+
use futures_util::{StreamExt, stream};
912
use uuid::Uuid;
1013

1114
use crate::store::tests::lease_helpers::expire_lease;
1215
use crate::store::tests::replica_helpers::second_store;
1316
use crate::store::tests::store_helpers::{close_store, close_test_store, open_test_store};
1417
use crate::store::tests::store_test_types::Backend;
1518

19+
/// Renew `lease` every five seconds, as a running scheduler does, until a renewal fails.
20+
pub(crate) fn hold_lease(
21+
store: &ControlStore,
22+
lease: &SchedulerLease,
23+
) -> tokio::task::JoinHandle<()> {
24+
let store = store.clone();
25+
let renewals = stream::try_unfold(lease.clone(), move |lease| {
26+
let store = store.clone();
27+
async move {
28+
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
29+
renew_lease(&store, &lease)
30+
.await
31+
.map(|renewed| Some(((), renewed)))
32+
}
33+
});
34+
tokio::spawn(renewals.for_each(|_| async {}))
35+
}
36+
1637
pub(crate) async fn leadership_contract(backend: Backend) -> Option<i64> {
1738
let test_store = open_test_store(backend).await?;
1839
let store = &test_store.store;

‎crates/sqlbuild-orchestration/tests/scheduler/ticks/test_retention.rs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::scheduler::main::{
1414
_acquire_lease::acquire_lease, _evaluate_trigger::evaluate_trigger, list_ticks::list_ticks,
1515
};
1616
use crate::scheduler::models::TickOutcome;
17+
use crate::scheduler::tests::contracts::helpers::hold_lease;
1718
use crate::scheduler::tests::contracts::ticks::helpers::{
1819
append_covered_tick, calendar_time, shift_schedule, snapshot,
1920
};
@@ -67,6 +68,7 @@ fn given_expired_covered_ticks_when_pruned_and_cursor_reset_then_run_linked_and_
6768
.await
6869
.expect("election")
6970
.expect("lease");
71+
let holder = hold_lease(store, &lease);
7072
evaluate_trigger(store, &lease, trigger_id)
7173
.await
7274
.expect("catch up");
@@ -176,6 +178,7 @@ fn given_expired_covered_ticks_when_pruned_and_cursor_reset_then_run_linked_and_
176178
Some("2030-01-01T00:00:00Z".parse().expect("future"))
177179
);
178180
assert!(ticks.iter().all(|tick| tick.scheduled_for < Utc::now()));
181+
holder.abort();
179182
close_test_store(fixture).await;
180183
});
181184
}

‎crates/sqlbuild-orchestration/tests/sensors/test_nodes.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::runs::main::{
1717
use crate::runs::models::{
1818
JobRunRequest, NodeOutcome, RunAuthority, RunChange, RunChangeRequest, RunOutcome,
1919
};
20-
use crate::scheduler::tests::contracts::helpers::acquire_lease;
20+
use crate::scheduler::tests::contracts::helpers::{acquire_lease, hold_lease};
2121
use crate::sensors::main::{
2222
begin_sensor_evaluation::begin_sensor_evaluation,
2323
complete_builtin_sensor::complete_builtin_sensor,
@@ -89,6 +89,7 @@ fn given_any_run_rebuilds_when_consuming_then_only_genuine_scoped_successes_queu
8989
.await
9090
.expect("elect")
9191
.expect("leader");
92+
let holder = hold_lease(store, &lease);
9293
let trigger = list_triggers(store, location, "development")
9394
.await
9495
.expect("triggers")
@@ -368,6 +369,7 @@ fn given_any_run_rebuilds_when_consuming_then_only_genuine_scoped_successes_queu
368369
.count(),
369370
test_case.expected_runs
370371
);
372+
holder.abort();
371373
close_store(replica).await;
372374
close_test_store(fixture).await;
373375
});

‎crates/sqlbuild-orchestration/tests/sensors/test_runs.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::declarations::models::TriggerChange;
1313
use crate::runs::main::list_runs::list_runs;
1414
use crate::runs::main::request_rerun::request_rerun;
1515
use crate::runs::models::{NodeOutcome, RerunRequest, RunOutcome};
16-
use crate::scheduler::tests::contracts::helpers::acquire_lease;
16+
use crate::scheduler::tests::contracts::helpers::{acquire_lease, hold_lease};
1717
use crate::sensors::main::{
1818
begin_sensor_evaluation::begin_sensor_evaluation,
1919
complete_builtin_sensor::complete_builtin_sensor,
@@ -109,6 +109,7 @@ fn given_terminal_jobs_and_groups_when_selectors_retry_then_outcomes_scope_and_r
109109
.await
110110
.expect("elect")
111111
.expect("leader");
112+
let holder = hold_lease(store, &lease);
112113
let mut expected: BTreeMap<String, BTreeSet<String>> = BTreeMap::new();
113114
let outcomes = [
114115
(
@@ -504,6 +505,7 @@ fn given_terminal_jobs_and_groups_when_selectors_retry_then_outcomes_scope_and_r
504505
"sensor never changes source state"
505506
);
506507
}
508+
holder.abort();
507509
close_store(replica).await;
508510
close_test_store(fixture).await;
509511
});

‎crates/sqlbuild-orchestration/tests/sensors/test_transitions.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::declarations::main::list_triggers::list_triggers;
1010
use crate::declarations::models::TriggerChange;
1111
use crate::runs::main::list_runs::list_runs;
1212
use crate::runs::models::{NodeOutcome, RunOutcome};
13-
use crate::scheduler::tests::contracts::helpers::acquire_lease;
13+
use crate::scheduler::tests::contracts::helpers::{acquire_lease, hold_lease};
1414
use crate::sensors::main::{
1515
begin_sensor_evaluation::begin_sensor_evaluation,
1616
complete_builtin_sensor::complete_builtin_sensor,
@@ -82,6 +82,7 @@ fn given_independent_check_failures_when_nondecisive_results_arrive_then_only_ex
8282
.await
8383
.expect("elect")
8484
.expect("leader");
85+
let holder = hold_lease(store, &lease);
8586
let fixture_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
8687
.join("../../benchmarks/duckshop/edge_cases/orchestration/check_transitions.json");
8788
let transitions: Vec<serde_json::Value> = serde_json::from_str(
@@ -178,6 +179,7 @@ fn given_independent_check_failures_when_nondecisive_results_arrive_then_only_ex
178179
.count(),
179180
test_case.expected_runs
180181
);
182+
holder.abort();
181183
close_test_store(fixture).await;
182184
});
183185
}

0 commit comments

Comments
 (0)