Skip to content

Commit eb7b9f8

Browse files
committed
only increment silences version if a silence is added
Signed-off-by: Ethan Hunter <[email protected]>
1 parent 3b4f154 commit eb7b9f8

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

silence/silence.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,8 @@ func (s *Silences) setSilence(msil *pb.MeshSilence, now time.Time) error {
580580
if err != nil {
581581
return err
582582
}
583-
if s.st.merge(msil, now) {
583+
_, added := s.st.merge(msil, now)
584+
if added {
584585
s.version++
585586
}
586587
s.broadcast(b)
@@ -927,8 +928,11 @@ func (s *Silences) Merge(b []byte) error {
927928
now := s.nowUTC()
928929

929930
for _, e := range st {
930-
if merged := s.st.merge(e, now); merged {
931-
s.version++
931+
merged, added := s.st.merge(e, now)
932+
if merged {
933+
if added {
934+
s.version++
935+
}
932936
if !cluster.OversizedMessage(b) {
933937
// If this is the first we've seen the message and it's
934938
// not oversized, gossip it to other nodes. We don't
@@ -953,10 +957,13 @@ func (s *Silences) SetBroadcast(f func([]byte)) {
953957

954958
type state map[string]*pb.MeshSilence
955959

956-
func (s state) merge(e *pb.MeshSilence, now time.Time) bool {
960+
// merge returns two bools: the first is true when merge caused a state change. The second
961+
// is true if that state change added a new silence. In other words, the second return is
962+
// true whenever a silence with a new ID has been added to the state as a result of merge.
963+
func (s state) merge(e *pb.MeshSilence, now time.Time) (bool, bool) {
957964
id := e.Silence.Id
958965
if e.ExpiresAt.Before(now) {
959-
return false
966+
return false, false
960967
}
961968
// Comments list was moved to a single comment. Apply upgrade
962969
// on silences received from peers.
@@ -969,9 +976,9 @@ func (s state) merge(e *pb.MeshSilence, now time.Time) bool {
969976
prev, ok := s[id]
970977
if !ok || prev.Silence.UpdatedAt.Before(e.Silence.UpdatedAt) {
971978
s[id] = e
972-
return true
979+
return true, !ok
973980
}
974-
return false
981+
return false, false
975982
}
976983

977984
func (s state) MarshalBinary() ([]byte, error) {

silence/silence_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,8 +428,10 @@ func TestSilenceSet(t *testing.T) {
428428
StartsAt: start1.Add(2 * time.Minute),
429429
EndsAt: start1.Add(5 * time.Minute),
430430
}
431+
versionBeforeOp := s.Version()
431432
require.NoError(t, s.Set(sil1))
432433
require.NotEqual(t, "", sil1.Id)
434+
require.NotEqual(t, versionBeforeOp, s.Version())
433435

434436
want := state{
435437
sil1.Id: &pb.MeshSilence{
@@ -453,8 +455,10 @@ func TestSilenceSet(t *testing.T) {
453455
Matchers: []*pb.Matcher{{Name: "a", Pattern: "b"}},
454456
EndsAt: start2.Add(1 * time.Minute),
455457
}
458+
versionBeforeOp = s.Version()
456459
require.NoError(t, s.Set(sil2))
457460
require.NotEqual(t, "", sil2.Id)
461+
require.NotEqual(t, versionBeforeOp, s.Version())
458462

459463
want = state{
460464
sil1.Id: want[sil1.Id],
@@ -474,22 +478,27 @@ func TestSilenceSet(t *testing.T) {
474478
// Should be able to update silence without modifications. It is expected to
475479
// keep the same ID.
476480
sil3 := cloneSilence(sil2)
481+
versionBeforeOp = s.Version()
477482
require.NoError(t, s.Set(sil3))
478483
require.Equal(t, sil2.Id, sil3.Id)
484+
require.Equal(t, versionBeforeOp, s.Version())
479485

480486
// Should be able to update silence with comment. It is also expected to
481487
// keep the same ID.
482488
sil4 := cloneSilence(sil3)
483489
sil4.Comment = "c"
490+
versionBeforeOp = s.Version()
484491
require.NoError(t, s.Set(sil4))
485492
require.Equal(t, sil3.Id, sil4.Id)
493+
require.Equal(t, versionBeforeOp, s.Version())
486494

487495
// Extend sil4 to expire at a later time. This should not expire the
488496
// existing silence, and so should also keep the same ID.
489497
clock.Add(time.Minute)
490498
start5 := s.nowUTC()
491499
sil5 := cloneSilence(sil4)
492500
sil5.EndsAt = start5.Add(100 * time.Minute)
501+
versionBeforeOp = s.Version()
493502
require.NoError(t, s.Set(sil5))
494503
require.Equal(t, sil4.Id, sil5.Id)
495504
want = state{
@@ -507,6 +516,7 @@ func TestSilenceSet(t *testing.T) {
507516
},
508517
}
509518
require.Equal(t, want, s.st, "unexpected state after silence creation")
519+
require.Equal(t, versionBeforeOp, s.Version())
510520

511521
// Replace the silence sil5 with another silence with different matchers.
512522
// Unlike previous updates, changing the matchers for an existing silence
@@ -518,6 +528,7 @@ func TestSilenceSet(t *testing.T) {
518528

519529
sil6 := cloneSilence(sil5)
520530
sil6.Matchers = []*pb.Matcher{{Name: "a", Pattern: "c"}}
531+
versionBeforeOp = s.Version()
521532
require.NoError(t, s.Set(sil6))
522533
require.NotEqual(t, sil5.Id, sil6.Id)
523534
want = state{
@@ -546,6 +557,7 @@ func TestSilenceSet(t *testing.T) {
546557
},
547558
}
548559
require.Equal(t, want, s.st, "unexpected state after silence creation")
560+
require.NotEqual(t, versionBeforeOp, s.Version())
549561

550562
// Re-create the silence that we just replaced. Changing the start time,
551563
// just like changing the matchers, creates a new silence with a different
@@ -555,6 +567,7 @@ func TestSilenceSet(t *testing.T) {
555567
sil7 := cloneSilence(sil5)
556568
sil7.StartsAt = start1
557569
sil7.EndsAt = start1.Add(5 * time.Minute)
570+
versionBeforeOp = s.Version()
558571
require.NoError(t, s.Set(sil7))
559572
require.NotEqual(t, sil2.Id, sil7.Id)
560573
want = state{
@@ -574,19 +587,22 @@ func TestSilenceSet(t *testing.T) {
574587
},
575588
}
576589
require.Equal(t, want, s.st, "unexpected state after silence creation")
590+
require.NotEqual(t, versionBeforeOp, s.Version())
577591

578592
// Updating an existing silence with an invalid silence should not expire
579593
// the original silence.
580594
clock.Add(time.Millisecond)
581595
sil8 := cloneSilence(sil7)
582596
sil8.EndsAt = time.Time{}
597+
versionBeforeOp = s.Version()
583598
require.EqualError(t, s.Set(sil8), "invalid silence: invalid zero end timestamp")
584599

585600
// sil7 should not be expired because the update failed.
586601
clock.Add(time.Millisecond)
587602
sil7, err = s.QueryOne(QIDs(sil7.Id))
588603
require.NoError(t, err)
589604
require.Equal(t, types.SilenceStateActive, getState(sil7, s.nowUTC()))
605+
require.Equal(t, versionBeforeOp, s.Version())
590606
}
591607

592608
func TestSilenceLimits(t *testing.T) {

0 commit comments

Comments
 (0)