diff options
author | Matthew Heon <matthew.heon@pm.me> | 2021-03-02 11:58:32 -0500 |
---|---|---|
committer | Matthew Heon <matthew.heon@pm.me> | 2021-03-02 13:30:28 -0500 |
commit | 43e899c2ec2a874b9cb16f42bfd1e676981353b1 (patch) | |
tree | c8a42515aae42c0f50767323ed849ccbc8c2b2d5 /test | |
parent | 426178a49991106ffe222f12cc42409ae78dd257 (diff) | |
download | podman-43e899c2ec2a874b9cb16f42bfd1e676981353b1.tar.gz podman-43e899c2ec2a874b9cb16f42bfd1e676981353b1.tar.bz2 podman-43e899c2ec2a874b9cb16f42bfd1e676981353b1.zip |
Rewrite Rename backend in a more atomic fashion
Move the core of renaming logic into the DB. This guarantees a
lot more atomicity than we have right now (our current solution,
removing the container from the DB and re-creating it, is *VERY*
not atomic and prone to leaving a corrupted state behind if
things go wrong. Moving things into the DB allows us to remove
most, but not all, of this - there's still a potential scenario
where the c/storage rename fails but the Podman rename succeeds,
and we end up with a mismatched state.
Signed-off-by: Matthew Heon <matthew.heon@pm.me>
Diffstat (limited to 'test')
-rw-r--r-- | test/e2e/rename_test.go | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/test/e2e/rename_test.go b/test/e2e/rename_test.go index f19413221..14696c0f6 100644 --- a/test/e2e/rename_test.go +++ b/test/e2e/rename_test.go @@ -89,4 +89,25 @@ var _ = Describe("podman rename", func() { Expect(ps.ExitCode()).To(Equal(0)) Expect(ps.OutputToString()).To(ContainSubstring(newName)) }) + + It("Rename a running container with exec sessions", func() { + ctrName := "testCtr" + ctr := podmanTest.Podman([]string{"run", "-d", "--name", ctrName, ALPINE, "top"}) + ctr.WaitWithDefaultTimeout() + Expect(ctr.ExitCode()).To(Equal(0)) + + exec := podmanTest.Podman([]string{"exec", "-d", ctrName, "top"}) + exec.WaitWithDefaultTimeout() + Expect(exec.ExitCode()).To(Equal(0)) + + newName := "aNewName" + rename := podmanTest.Podman([]string{"rename", ctrName, newName}) + rename.WaitWithDefaultTimeout() + Expect(rename.ExitCode()).To(Equal(0)) + + ps := podmanTest.Podman([]string{"ps", "-aq", "--filter", fmt.Sprintf("name=%s", newName), "--format", "{{ .Names }}"}) + ps.WaitWithDefaultTimeout() + Expect(ps.ExitCode()).To(Equal(0)) + Expect(ps.OutputToString()).To(ContainSubstring(newName)) + }) }) |