diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2021-03-03 09:16:19 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-03 09:16:19 -0500 |
commit | 5fd8a849491e12de3747a16c238236e23fb44593 (patch) | |
tree | 52c2097fc2831bf049e9f3d2e31eae3fe41fdc91 /libpod/in_memory_state.go | |
parent | aed632cb8ca4be2a57e8159041ef31829b3d2b2c (diff) | |
parent | 43e899c2ec2a874b9cb16f42bfd1e676981353b1 (diff) | |
download | podman-5fd8a849491e12de3747a16c238236e23fb44593.tar.gz podman-5fd8a849491e12de3747a16c238236e23fb44593.tar.bz2 podman-5fd8a849491e12de3747a16c238236e23fb44593.zip |
Merge pull request #9575 from mheon/rewrite_rename
Rewrite Rename backend in a more atomic fashion
Diffstat (limited to 'libpod/in_memory_state.go')
-rw-r--r-- | libpod/in_memory_state.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/libpod/in_memory_state.go b/libpod/in_memory_state.go index 26f15d9c8..3875878ed 100644 --- a/libpod/in_memory_state.go +++ b/libpod/in_memory_state.go @@ -822,6 +822,46 @@ func (s *InMemoryState) RewriteContainerConfig(ctr *Container, newCfg *Container return nil } +// SafeRewriteContainerConfig rewrites a container's configuration. +// It's safer than RewriteContainerConfig, but still has limitations. Please +// read the comment in state.go before using. +func (s *InMemoryState) SafeRewriteContainerConfig(ctr *Container, oldName, newName string, newCfg *ContainerConfig) error { + if !ctr.valid { + return define.ErrCtrRemoved + } + + if _, err := s.nameIndex.Get(newName); err == nil { + return errors.Wrapf(define.ErrCtrExists, "name %s is in use", newName) + } + + // If the container does not exist, return error + stateCtr, ok := s.containers[ctr.ID()] + if !ok { + ctr.valid = false + return errors.Wrapf(define.ErrNoSuchCtr, "container with ID %s not found in state", ctr.ID()) + } + + // Change name in registry. + if s.namespace != "" { + nsIndex, ok := s.namespaceIndexes[s.namespace] + if !ok { + return define.ErrInternal + } + nsIndex.nameIndex.Release(oldName) + if err := nsIndex.nameIndex.Reserve(newName, ctr.ID()); err != nil { + return errors.Wrapf(err, "error registering name %s", newName) + } + } + s.nameIndex.Release(oldName) + if err := s.nameIndex.Reserve(newName, ctr.ID()); err != nil { + return errors.Wrapf(err, "error registering name %s", newName) + } + + stateCtr.config = newCfg + + return nil +} + // RewritePodConfig rewrites a pod's configuration. // This function is DANGEROUS, even with in-memory state. // Please read the full comment on it in state.go before using it. |