when maglevd rehashes its config:
- when a backend gets newly added or restarted, an event should fire; perhaps transition to 'unknown' - when a backend gets removed, an event should fire; perhaps transition to 'removed' - when a backend is in 'unknown' state, fast-interval is appropriate
This commit is contained in:
@@ -169,9 +169,13 @@ func TestNextInterval(t *testing.T) {
|
||||
|
||||
b := New("test", net.ParseIP("10.0.0.1"), 2, 3) // max=4
|
||||
|
||||
// Unknown (no probes yet): always use interval, never downInterval.
|
||||
if got := b.NextInterval(interval, fast, down); got != interval {
|
||||
t.Errorf("StateUnknown: got %v, want %v (interval)", got, interval)
|
||||
// Unknown: use fast-interval to establish state quickly.
|
||||
if got := b.NextInterval(interval, fast, down); got != fast {
|
||||
t.Errorf("StateUnknown with fast: got %v, want %v (fast)", got, fast)
|
||||
}
|
||||
// Unknown, no fast-interval configured: fall back to interval.
|
||||
if got := b.NextInterval(interval, 0, down); got != interval {
|
||||
t.Errorf("StateUnknown without fast: got %v, want %v (interval)", got, interval)
|
||||
}
|
||||
|
||||
// After first fail: counter=0, state=Down → downInterval.
|
||||
@@ -291,6 +295,40 @@ func TestTransitionTimestamp(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestStartRemove(t *testing.T) {
|
||||
b := newBackend()
|
||||
|
||||
// Start records an unknown→unknown transition.
|
||||
tr := b.Start(5)
|
||||
if tr.From != StateUnknown || tr.To != StateUnknown {
|
||||
t.Errorf("Start transition: got %s→%s, want unknown→unknown", tr.From, tr.To)
|
||||
}
|
||||
if len(b.Transitions) != 1 {
|
||||
t.Errorf("transitions after Start: got %d, want 1", len(b.Transitions))
|
||||
}
|
||||
if b.State != StateUnknown {
|
||||
t.Errorf("state after Start: got %s, want unknown", b.State)
|
||||
}
|
||||
|
||||
// Remove transitions to StateRemoved.
|
||||
b.State = StateUp
|
||||
tr = b.Remove(5)
|
||||
if tr.From != StateUp || tr.To != StateRemoved {
|
||||
t.Errorf("Remove transition: got %s→%s, want up→removed", tr.From, tr.To)
|
||||
}
|
||||
if b.State != StateRemoved {
|
||||
t.Errorf("state after Remove: got %s, want removed", b.State)
|
||||
}
|
||||
|
||||
// Record is a no-op once removed.
|
||||
if b.Record(pass(), 5) {
|
||||
t.Error("Record should not transition a removed backend")
|
||||
}
|
||||
if b.State != StateRemoved {
|
||||
t.Errorf("state changed after Record on removed backend: %s", b.State)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStateString(t *testing.T) {
|
||||
cases := []struct {
|
||||
s State
|
||||
@@ -300,6 +338,7 @@ func TestStateString(t *testing.T) {
|
||||
{StateUp, "up"},
|
||||
{StateDown, "down"},
|
||||
{StatePaused, "paused"},
|
||||
{StateRemoved, "removed"},
|
||||
}
|
||||
for _, c := range cases {
|
||||
if c.s.String() != c.want {
|
||||
|
||||
Reference in New Issue
Block a user