Promote VPN pressure action to snapshot

This commit is contained in:
2026-05-16 13:39:09 +03:00
parent 0715d98c44
commit 5e4c0d596b
6 changed files with 46 additions and 80 deletions
@@ -255,6 +255,7 @@ type FabricFlowSchedulerSnapshot struct {
PressureLevel string `json:"pressure_level,omitempty"`
PressureScore int `json:"pressure_score,omitempty"`
PressureReasons []string `json:"pressure_reasons,omitempty"`
RecommendedAction string `json:"recommended_action,omitempty"`
InFlight int `json:"in_flight"`
MaxInFlight int `json:"max_in_flight"`
AdaptiveBackpressureActive bool `json:"adaptive_backpressure_active,omitempty"`
@@ -864,6 +865,7 @@ func (s *FabricFlowScheduler) Snapshot() FabricFlowSchedulerSnapshot {
}
}
snapshot.PressureLevel, snapshot.PressureScore, snapshot.PressureReasons = fabricFlowSchedulerPressure(snapshot)
snapshot.RecommendedAction = fabricFlowSchedulerRecommendedAction(snapshot)
return snapshot
}
@@ -940,6 +942,32 @@ func flowPressureRank(level string) int {
}
}
func fabricFlowSchedulerRecommendedAction(snapshot FabricFlowSchedulerSnapshot) string {
reasons := map[string]struct{}{}
for _, reason := range snapshot.PressureReasons {
reasons[strings.TrimSpace(reason)] = struct{}{}
}
if _, ok := reasons["drops"]; ok || snapshot.QualityWindowDropCount > 0 {
return "shed_or_reroute"
}
if _, ok := reasons["route_failures"]; ok || snapshot.QualityWindowFailureCount > 0 || snapshot.FailingChannelCount > 0 {
return "rebuild_or_reroute"
}
if _, ok := reasons["route_recovery"]; ok || snapshot.RouteSwitchCount > 0 {
return "observe_recovery"
}
if _, ok := reasons["slow_channels"]; ok || snapshot.SlowChannelCount > 0 || snapshot.QualityWindowSlowCount > 0 {
return "prefer_faster_route"
}
if _, ok := reasons["bulk_pressure"]; ok || snapshot.BulkPressureActive {
return "throttle_bulk"
}
if snapshot.AdaptiveBackpressureActive || snapshot.BackpressureActive {
return "reduce_parallelism"
}
return "observe"
}
func boundedFabricPressureScore(value, minValue, maxValue int) int {
if value < minValue {
return minValue
@@ -792,6 +792,9 @@ func TestFabricFlowSchedulerDropsWhenChannelQueueIsFull(t *testing.T) {
if snapshot.PressureLevel != "critical" || snapshot.PressureScore <= 0 || !containsString(snapshot.PressureReasons, "drops") {
t.Fatalf("pressure = %s score=%d reasons=%v, want critical drops", snapshot.PressureLevel, snapshot.PressureScore, snapshot.PressureReasons)
}
if snapshot.RecommendedAction != "shed_or_reroute" {
t.Fatalf("recommended action = %q, want shed_or_reroute", snapshot.RecommendedAction)
}
}
func TestFabricFlowSchedulerRoundsSubMillisecondSendDuration(t *testing.T) {
@@ -1553,6 +1556,9 @@ func TestFabricClientPacketIngressIsolatesRouteFailoverPerLogicalChannel(t *test
!containsString(snapshot.FlowScheduler.PressureReasons, "route_failures") {
t.Fatalf("route recovery pressure = %s score=%d reasons=%v", snapshot.FlowScheduler.PressureLevel, snapshot.FlowScheduler.PressureScore, snapshot.FlowScheduler.PressureReasons)
}
if snapshot.FlowScheduler.RecommendedAction != "rebuild_or_reroute" {
t.Fatalf("route recovery action = %q, want rebuild_or_reroute", snapshot.FlowScheduler.RecommendedAction)
}
if statB.LastRouteID != "route-primary" || statB.LastFailedRouteID != "" || statB.ConsecutiveFailures != 0 {
t.Fatalf("channel B stat = %+v, want primary route memory preserved", statB)
}
@@ -1923,6 +1929,9 @@ func TestFabricFlowSchedulerProtectsInteractiveWindowDuringBulkPressure(t *testi
if snapshot.PressureLevel != "warning" || snapshot.PressureScore <= 0 || !containsString(snapshot.PressureReasons, "bulk_pressure") {
t.Fatalf("pressure = %s score=%d reasons=%v, want warning bulk pressure", snapshot.PressureLevel, snapshot.PressureScore, snapshot.PressureReasons)
}
if snapshot.RecommendedAction != "throttle_bulk" {
t.Fatalf("recommended action = %q, want throttle_bulk", snapshot.RecommendedAction)
}
}
func TestFabricFlowSchedulerRollingQualityWindowForgetsOldPressure(t *testing.T) {