Skip to content

Commit 680057c

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

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
@@ -322,8 +322,10 @@ func TestSilenceSet(t *testing.T) {
322322
StartsAt: start1.Add(2 * time.Minute),
323323
EndsAt: start1.Add(5 * time.Minute),
324324
}
325+
versionBeforeOp := s.Version()
325326
require.NoError(t, s.Set(sil1))
326327
require.NotEqual(t, "", sil1.Id)
328+
require.NotEqual(t, versionBeforeOp, s.Version())
327329

328330
want := state{
329331
sil1.Id: &pb.MeshSilence{
@@ -347,8 +349,10 @@ func TestSilenceSet(t *testing.T) {
347349
Matchers: []*pb.Matcher{{Name: "a", Pattern: "b"}},
348350
EndsAt: start2.Add(1 * time.Minute),
349351
}
352+
versionBeforeOp = s.Version()
350353
require.NoError(t, s.Set(sil2))
351354
require.NotEqual(t, "", sil2.Id)
355+
require.NotEqual(t, versionBeforeOp, s.Version())
352356

353357
want = state{
354358
sil1.Id: want[sil1.Id],
@@ -368,22 +372,27 @@ func TestSilenceSet(t *testing.T) {
368372
// Should be able to update silence without modifications. It is expected to
369373
// keep the same ID.
370374
sil3 := cloneSilence(sil2)
375+
versionBeforeOp = s.Version()
371376
require.NoError(t, s.Set(sil3))
372377
require.Equal(t, sil2.Id, sil3.Id)
378+
require.Equal(t, versionBeforeOp, s.Version())
373379

374380
// Should be able to update silence with comment. It is also expected to
375381
// keep the same ID.
376382
sil4 := cloneSilence(sil3)
377383
sil4.Comment = "c"
384+
versionBeforeOp = s.Version()
378385
require.NoError(t, s.Set(sil4))
379386
require.Equal(t, sil3.Id, sil4.Id)
387+
require.Equal(t, versionBeforeOp, s.Version())
380388

381389
// Extend sil4 to expire at a later time. This should not expire the
382390
// existing silence, and so should also keep the same ID.
383391
clock.Add(time.Minute)
384392
start5 := s.nowUTC()
385393
sil5 := cloneSilence(sil4)
386394
sil5.EndsAt = start5.Add(100 * time.Minute)
395+
versionBeforeOp = s.Version()
387396
require.NoError(t, s.Set(sil5))
388397
require.Equal(t, sil4.Id, sil5.Id)
389398
want = state{
@@ -401,6 +410,7 @@ func TestSilenceSet(t *testing.T) {
401410
},
402411
}
403412
require.Equal(t, want, s.st, "unexpected state after silence creation")
413+
require.Equal(t, versionBeforeOp, s.Version())
404414

405415
// Replace the silence sil5 with another silence with different matchers.
406416
// Unlike previous updates, changing the matchers for an existing silence
@@ -412,6 +422,7 @@ func TestSilenceSet(t *testing.T) {
412422

413423
sil6 := cloneSilence(sil5)
414424
sil6.Matchers = []*pb.Matcher{{Name: "a", Pattern: "c"}}
425+
versionBeforeOp = s.Version()
415426
require.NoError(t, s.Set(sil6))
416427
require.NotEqual(t, sil5.Id, sil6.Id)
417428
want = state{
@@ -440,6 +451,7 @@ func TestSilenceSet(t *testing.T) {
440451
},
441452
}
442453
require.Equal(t, want, s.st, "unexpected state after silence creation")
454+
require.NotEqual(t, versionBeforeOp, s.Version())
443455

444456
// Re-create the silence that we just replaced. Changing the start time,
445457
// just like changing the matchers, creates a new silence with a different
@@ -449,6 +461,7 @@ func TestSilenceSet(t *testing.T) {
449461
sil7 := cloneSilence(sil5)
450462
sil7.StartsAt = start1
451463
sil7.EndsAt = start1.Add(5 * time.Minute)
464+
versionBeforeOp = s.Version()
452465
require.NoError(t, s.Set(sil7))
453466
require.NotEqual(t, sil2.Id, sil7.Id)
454467
want = state{
@@ -468,19 +481,22 @@ func TestSilenceSet(t *testing.T) {
468481
},
469482
}
470483
require.Equal(t, want, s.st, "unexpected state after silence creation")
484+
require.NotEqual(t, versionBeforeOp, s.Version())
471485

472486
// Updating an existing silence with an invalid silence should not expire
473487
// the original silence.
474488
clock.Add(time.Millisecond)
475489
sil8 := cloneSilence(sil7)
476490
sil8.EndsAt = time.Time{}
491+
versionBeforeOp = s.Version()
477492
require.EqualError(t, s.Set(sil8), "invalid silence: invalid zero end timestamp")
478493

479494
// sil7 should not be expired because the update failed.
480495
clock.Add(time.Millisecond)
481496
sil7, err = s.QueryOne(QIDs(sil7.Id))
482497
require.NoError(t, err)
483498
require.Equal(t, types.SilenceStateActive, getState(sil7, s.nowUTC()))
499+
require.Equal(t, versionBeforeOp, s.Version())
484500
}
485501

486502
func TestSilenceLimits(t *testing.T) {

0 commit comments

Comments
 (0)