Lock around saving state
Prevent interleaving state syncs as it could conceivably lead to empty state files as per #1367
This commit is contained in:
parent
e7dd443447
commit
6cb6d9cdf1
|
@ -66,6 +66,9 @@ type AllocRunner struct {
|
|||
destroyCh chan struct{}
|
||||
destroyLock sync.Mutex
|
||||
waitCh chan struct{}
|
||||
|
||||
// serialize saveAllocRunnerState calls
|
||||
persistLock sync.Mutex
|
||||
}
|
||||
|
||||
// allocRunnerState is used to snapshot the state of the alloc runner
|
||||
|
@ -179,8 +182,12 @@ func (r *AllocRunner) SaveState() error {
|
|||
}
|
||||
|
||||
func (r *AllocRunner) saveAllocRunnerState() error {
|
||||
r.persistLock.Lock()
|
||||
defer r.persistLock.Unlock()
|
||||
|
||||
// Create the snapshot.
|
||||
alloc := r.Alloc()
|
||||
|
||||
r.allocLock.Lock()
|
||||
states := alloc.TaskStates
|
||||
allocClientStatus := r.allocClientStatus
|
||||
|
|
|
@ -69,6 +69,9 @@ type TaskRunner struct {
|
|||
destroyLock sync.Mutex
|
||||
destroyEvent *structs.TaskEvent
|
||||
waitCh chan struct{}
|
||||
|
||||
// serialize SaveState calls
|
||||
persistLock sync.Mutex
|
||||
}
|
||||
|
||||
// taskRunnerState is used to snapshot the state of the task runner
|
||||
|
@ -186,6 +189,9 @@ func (r *TaskRunner) RestoreState() error {
|
|||
|
||||
// SaveState is used to snapshot our state
|
||||
func (r *TaskRunner) SaveState() error {
|
||||
r.persistLock.Lock()
|
||||
defer r.persistLock.Unlock()
|
||||
|
||||
snap := taskRunnerState{
|
||||
Task: r.task,
|
||||
Version: r.config.Version,
|
||||
|
|
Loading…
Reference in New Issue