mirror of
https://github.com/kemko/nomad.git
synced 2026-01-06 18:35:44 +03:00
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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user