1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Fix for lack of syncromization in daemon/update.go

Signed-off-by: dmytro.iakovliev <dmytro.iakovliev@zodiacsystems.com>
This commit is contained in:
dmytro.iakovliev 2021-02-08 12:57:00 +02:00
parent 791640417b
commit 58825ffc32

View file

@ -42,20 +42,25 @@ func (daemon *Daemon) update(name string, hostConfig *container.HostConfig) erro
restoreConfig := false restoreConfig := false
backupHostConfig := *ctr.HostConfig backupHostConfig := *ctr.HostConfig
defer func() { defer func() {
if restoreConfig { if restoreConfig {
ctr.Lock() ctr.Lock()
ctr.HostConfig = &backupHostConfig if !ctr.RemovalInProgress && !ctr.Dead {
ctr.CheckpointTo(daemon.containersReplica) ctr.HostConfig = &backupHostConfig
ctr.CheckpointTo(daemon.containersReplica)
}
ctr.Unlock() ctr.Unlock()
} }
}() }()
ctr.Lock()
if ctr.RemovalInProgress || ctr.Dead { if ctr.RemovalInProgress || ctr.Dead {
ctr.Unlock()
return errCannotUpdate(ctr.ID, fmt.Errorf("container is marked for removal and cannot be \"update\"")) return errCannotUpdate(ctr.ID, fmt.Errorf("container is marked for removal and cannot be \"update\""))
} }
ctr.Lock()
if err := ctr.UpdateContainer(hostConfig); err != nil { if err := ctr.UpdateContainer(hostConfig); err != nil {
restoreConfig = true restoreConfig = true
ctr.Unlock() ctr.Unlock()
@ -66,6 +71,7 @@ func (daemon *Daemon) update(name string, hostConfig *container.HostConfig) erro
ctr.Unlock() ctr.Unlock()
return errCannotUpdate(ctr.ID, err) return errCannotUpdate(ctr.ID, err)
} }
ctr.Unlock() ctr.Unlock()
// if Restart Policy changed, we need to update container monitor // if Restart Policy changed, we need to update container monitor