plugin scheduler: run iceberg and lifecycle lanes concurrently (#8821)
* plugin scheduler: run iceberg and lifecycle lanes concurrently The default lane serialises job types under a single admin lock because volume-management operations share global state. Iceberg and lifecycle lanes have no such constraint, so run each of their job types independently in separate goroutines. * Fix concurrent lane scheduler status * plugin scheduler: address review feedback - Extract collectDueJobTypes helper to deduplicate policy loading between locked and concurrent iteration paths. - Use atomic.Bool instead of sync.Mutex for hadJobs in the concurrent path. - Set lane loop state to "busy" before launching concurrent goroutines so the lane is not reported as idle while work runs. - Convert TestLaneRequiresLock to table-driven style. - Add TestRunLaneSchedulerIterationLockBehavior to verify the scheduler acquires the admin lock only for lanes that require it. - Fix flaky TestGetLaneSchedulerStatusShowsActiveConcurrentLaneWork by not starting background scheduler goroutines that race with the direct runJobTypeIteration call.
This commit is contained in:
@@ -27,6 +27,26 @@ func TestAllLanesHaveIdleSleep(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestLaneRequiresLock(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
lane SchedulerLane
|
||||
want bool
|
||||
}{
|
||||
{"Default", LaneDefault, true},
|
||||
{"Iceberg", LaneIceberg, false},
|
||||
{"Lifecycle", LaneLifecycle, false},
|
||||
{"Unknown", "unknown_lane", true},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if got := LaneRequiresLock(tt.lane); got != tt.want {
|
||||
t.Errorf("LaneRequiresLock(%q) = %v, want %v", tt.lane, got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestKnownJobTypesInMap(t *testing.T) {
|
||||
// Ensure the well-known job types are mapped. This catches drift
|
||||
// if a handler's job type string changes without updating the map.
|
||||
|
||||
Reference in New Issue
Block a user