Browse code

Persist container to disk after rename

Fixes #11315

After rename occured the graphdb was updated but the container struct
was never commited back to disk, so on daemon restart it loads the old
name again.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>

Brian Goff authored on 2015/03/12 01:17:23
Showing 2 changed files
... ...
@@ -1,8 +1,6 @@
1 1
 package daemon
2 2
 
3
-import (
4
-	"github.com/docker/docker/engine"
5
-)
3
+import "github.com/docker/docker/engine"
6 4
 
7 5
 func (daemon *Daemon) ContainerRename(job *engine.Job) engine.Status {
8 6
 	if len(job.Args) != 2 {
... ...
@@ -26,9 +24,21 @@ func (daemon *Daemon) ContainerRename(job *engine.Job) engine.Status {
26 26
 
27 27
 	container.Name = newName
28 28
 
29
+	undo := func() {
30
+		container.Name = oldName
31
+		daemon.reserveName(container.ID, oldName)
32
+		daemon.containerGraph.Delete(newName)
33
+	}
34
+
29 35
 	if err := daemon.containerGraph.Delete(oldName); err != nil {
36
+		undo()
30 37
 		return job.Errorf("Failed to delete container %q: %v", oldName, err)
31 38
 	}
32 39
 
40
+	if err := container.toDisk(); err != nil {
41
+		undo()
42
+		return job.Error(err)
43
+	}
44
+
33 45
 	return engine.StatusOK
34 46
 }
... ...
@@ -534,3 +534,29 @@ func TestDaemonUlimitDefaults(t *testing.T) {
534 534
 
535 535
 	logDone("daemon - default ulimits are applied")
536 536
 }
537
+
538
+// #11315
539
+func TestDaemonRestartRenameContainer(t *testing.T) {
540
+	d := NewDaemon(t)
541
+	if err := d.StartWithBusybox(); err != nil {
542
+		t.Fatal(err)
543
+	}
544
+
545
+	if out, err := d.Cmd("run", "--name=test", "busybox"); err != nil {
546
+		t.Fatal(err, out)
547
+	}
548
+
549
+	if out, err := d.Cmd("rename", "test", "test2"); err != nil {
550
+		t.Fatal(err, out)
551
+	}
552
+
553
+	if err := d.Restart(); err != nil {
554
+		t.Fatal(err)
555
+	}
556
+
557
+	if out, err := d.Cmd("start", "test2"); err != nil {
558
+		t.Fatal(err, out)
559
+	}
560
+
561
+	logDone("daemon - rename persists through daemon restart")
562
+}