Skip to content

Commit

Permalink
agent/app/agent.go: Reset agent state if the instance id changed
Browse files Browse the repository at this point in the history
  • Loading branch information
richardpen committed Aug 7, 2017
1 parent afed67c commit bd577e5
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 7 deletions.
2 changes: 2 additions & 0 deletions agent/app/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,8 @@ func (agent *ecsAgent) newTaskEngine(containerChangeEventStream *eventstream.Eve
log.Warnf(instanceIDMismatchErrorFormat,
previousEC2InstanceID, currentEC2InstanceID)

// Reset agent state as a new container instance
state.Reset()
// Reset taskEngine; all the other values are still default
return engine.NewTaskEngine(agent.cfg, agent.dockerClient, credentialsManager,
containerChangeEventStream, imageManager, state), currentEC2InstanceID, nil
Expand Down
1 change: 1 addition & 0 deletions agent/app/agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ func TestNewTaskEngineRestoreFromCheckpointPreviousEC2InstanceIDLoadedHappyPath(
gomock.Any(), gomock.Any(), gomock.Any()).Return(
statemanager.NewNoopStateManager(), nil),
ec2MetadataClient.EXPECT().InstanceIdentityDocument().Return(iid, nil),
state.EXPECT().Reset(),
)

ctx, cancel := context.WithCancel(context.TODO())
Expand Down
28 changes: 21 additions & 7 deletions agent/engine/dockerstate/docker_task_engine_state.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ type TaskEngineState interface {
AddImageState(imageState *image.ImageState)
// RemoveTask removes a task from the state
RemoveTask(task *api.Task)
// Reset resets all the fileds in the state
Reset()
// RemoveImageState removes an image.ImageState
RemoveImageState(imageState *image.ImageState)
json.Marshaler
Expand Down Expand Up @@ -87,13 +89,25 @@ func NewTaskEngineState() TaskEngineState {
}

func newDockerTaskEngineState() *DockerTaskEngineState {
return &DockerTaskEngineState{
tasks: make(map[string]*api.Task),
idToTask: make(map[string]string),
taskToID: make(map[string]map[string]*api.DockerContainer),
idToContainer: make(map[string]*api.DockerContainer),
imageStates: make(map[string]*image.ImageState),
}
state := &DockerTaskEngineState{}
state.initializeDockerTaskEngineState()
return state
}

func (state *DockerTaskEngineState) initializeDockerTaskEngineState() {
state.lock.Lock()
defer state.lock.Unlock()

state.tasks = make(map[string]*api.Task)
state.idToTask = make(map[string]string)
state.taskToID = make(map[string]map[string]*api.DockerContainer)
state.idToContainer = make(map[string]*api.DockerContainer)
state.imageStates = make(map[string]*image.ImageState)
}

// Reset resets all the states
func (state *DockerTaskEngineState) Reset() {
state.initializeDockerTaskEngineState()
}

// AllTasks returns all of the tasks
Expand Down
8 changes: 8 additions & 0 deletions agent/engine/dockerstate/mocks/dockerstate_mocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,14 @@ func (_mr *_MockTaskEngineStateRecorder) RemoveTask(arg0 interface{}) *gomock.Ca
return _mr.mock.ctrl.RecordCall(_mr.mock, "RemoveTask", arg0)
}

func (_m *MockTaskEngineState) Reset() {
_m.ctrl.Call(_m, "Reset")
}

func (_mr *_MockTaskEngineStateRecorder) Reset() *gomock.Call {
return _mr.mock.ctrl.RecordCall(_mr.mock, "Reset")
}

func (_m *MockTaskEngineState) TaskByArn(_param0 string) (*api.Task, bool) {
ret := _m.ctrl.Call(_m, "TaskByArn", _param0)
ret0, _ := ret[0].(*api.Task)
Expand Down

0 comments on commit bd577e5

Please sign in to comment.