Skip to content

Commit

Permalink
Merge pull request #1235 from wuub/master
Browse files Browse the repository at this point in the history
fix conflict between handleReload and antiEntropy critical sections
  • Loading branch information
slackpad committed Sep 17, 2015
2 parents 1282a6f + c4537ed commit 0b05dbe
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 3 deletions.
9 changes: 6 additions & 3 deletions command/agent/local.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,18 +109,21 @@ func (l *localState) ConsulServerUp() {
// Pause is used to pause state synchronization, this can be
// used to make batch changes
func (l *localState) Pause() {
atomic.StoreInt32(&l.paused, 1)
atomic.AddInt32(&l.paused, 1)
}

// Resume is used to resume state synchronization
func (l *localState) Resume() {
atomic.StoreInt32(&l.paused, 0)
paused := atomic.AddInt32(&l.paused, -1)
if paused < 0 {
panic("unbalanced localState.Resume() detected")
}
l.changeMade()
}

// isPaused is used to check if we are paused
func (l *localState) isPaused() bool {
return atomic.LoadInt32(&l.paused) == 1
return atomic.LoadInt32(&l.paused) > 0
}

// ServiceToken returns the configured ACL token for the given
Expand Down
32 changes: 32 additions & 0 deletions command/agent/local_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -760,6 +760,38 @@ func TestAgent_checkTokens(t *testing.T) {
}
}

func TestAgent_nestedPauseResume(t *testing.T) {
l := new(localState)
if l.isPaused() != false {
t.Fatal("localState should be unPaused after init")
}
l.Pause()
if l.isPaused() != true {
t.Fatal("localState should be Paused after first call to Pause()")
}
l.Pause()
if l.isPaused() != true {
t.Fatal("localState should STILL be Paused after second call to Pause()")
}
l.Resume()
if l.isPaused() != true {
t.Fatal("localState should STILL be Paused after FIRST call to Resume()")
}
l.Resume()
if l.isPaused() != false {
t.Fatal("localState should NOT be Paused after SECOND call to Resume()")
}

defer func() {
err := recover()
if err == nil {
t.Fatal("unbalanced Resume() should cause a panic()")
}
}()
l.Resume()

}

var testRegisterRules = `
service "api" {
policy = "write"
Expand Down

0 comments on commit 0b05dbe

Please sign in to comment.