Update failureCount scenario and test cases.

Signed-off-by: Dong Chen <dongluo.chen@docker.com>
This commit is contained in:
Dong Chen 2016-01-06 10:33:51 -08:00
parent 6a1b49cf4e
commit 58a0e1719d
2 changed files with 28 additions and 9 deletions

View File

@ -208,15 +208,11 @@ func (e *Engine) IsHealthy() bool {
return e.state == stateHealthy return e.state == stateHealthy
} }
// setState sets engine healthy state // setState sets engine state
func (e *Engine) setState(state engineState) { func (e *Engine) setState(state engineState) {
e.Lock() e.Lock()
defer e.Unlock() defer e.Unlock()
e.state = state e.state = state
// if engine is healthy, clear failureCount
if state == stateHealthy {
e.failureCount = 0
}
} }
// TimeToValidate returns true if a pending node is up for validation // TimeToValidate returns true if a pending node is up for validation
@ -292,10 +288,17 @@ func (e *Engine) UpdatedAt() time.Time {
return e.updatedAt return e.updatedAt
} }
func (e *Engine) resetFailureCount() {
e.Lock()
defer e.Unlock()
e.failureCount = 0
}
// CheckConnectionErr checks error from client response and adjusts engine healthy indicators // CheckConnectionErr checks error from client response and adjusts engine healthy indicators
func (e *Engine) CheckConnectionErr(err error) { func (e *Engine) CheckConnectionErr(err error) {
if err == nil { if err == nil {
e.setErrMsg("") e.setErrMsg("")
e.resetFailureCount()
// If current state is unhealthy, change it to healthy // If current state is unhealthy, change it to healthy
if e.state == stateUnhealthy { if e.state == stateUnhealthy {
log.WithFields(log.Fields{"name": e.Name, "id": e.ID}).Infof("Engine came back to life after %d retries. Hooray!", e.failureCount) log.WithFields(log.Fields{"name": e.Name, "id": e.ID}).Infof("Engine came back to life after %d retries. Hooray!", e.failureCount)
@ -322,7 +325,7 @@ func (e *Engine) CheckConnectionErr(err error) {
e.incFailureCount() e.incFailureCount()
return return
} }
// other errors may be ambiguous. let refresh loop decide healthy or not. // other errors may be ambiguous.
} }
// Gather engine specs (CPU, memory, constraints, ...). // Gather engine specs (CPU, memory, constraints, ...).

View File

@ -43,11 +43,8 @@ func TestSetEngineState(t *testing.T) {
assert.True(t, engine.state == statePending) assert.True(t, engine.state == statePending)
engine.setState(stateUnhealthy) engine.setState(stateUnhealthy)
assert.True(t, engine.state == stateUnhealthy) assert.True(t, engine.state == stateUnhealthy)
engine.incFailureCount()
assert.True(t, engine.failureCount == 1)
engine.setState(stateHealthy) engine.setState(stateHealthy)
assert.True(t, engine.state == stateHealthy) assert.True(t, engine.state == stateHealthy)
assert.True(t, engine.failureCount == 0)
} }
func TestErrMsg(t *testing.T) { func TestErrMsg(t *testing.T) {
@ -58,6 +55,22 @@ func TestErrMsg(t *testing.T) {
assert.True(t, engine.ErrMsg() == message) assert.True(t, engine.ErrMsg() == message)
} }
func TestCheckConnectionErr(t *testing.T) {
engine := NewEngine("test", 0, engOpts)
engine.setState(stateHealthy)
assert.True(t, engine.failureCount == 0)
err := dockerclient.ErrConnectionRefused
engine.CheckConnectionErr(err)
assert.True(t, len(engine.ErrMsg()) > 0)
assert.True(t, engine.failureCount == 1)
engine.CheckConnectionErr(err)
assert.True(t, engine.failureCount == 2)
err = nil
engine.CheckConnectionErr(err)
assert.True(t, engine.failureCount == 0)
assert.True(t, len(engine.ErrMsg()) == 0)
}
func TestEngineFailureCount(t *testing.T) { func TestEngineFailureCount(t *testing.T) {
engine := NewEngine("test", 0, engOpts) engine := NewEngine("test", 0, engOpts)
engine.setState(stateHealthy) engine.setState(stateHealthy)
@ -66,6 +79,9 @@ func TestEngineFailureCount(t *testing.T) {
engine.incFailureCount() engine.incFailureCount()
} }
assert.False(t, engine.IsHealthy()) assert.False(t, engine.IsHealthy())
assert.True(t, engine.failureCount == engine.opts.FailureRetry)
engine.resetFailureCount()
assert.True(t, engine.failureCount == 0)
} }
func TestEngineConnectionFailure(t *testing.T) { func TestEngineConnectionFailure(t *testing.T) {