Browse code

Fix removing containers on leaving from pending state

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
(cherry picked from commit 826f6f07031abc4dea6f71ed69d33a4e0789ee11)

Tonis Tiigi authored on 2016/06/17 08:08:15
Showing 2 changed files
... ...
@@ -389,10 +389,11 @@ func (c *Cluster) Leave(force bool) error {
389 389
 	if err := node.Stop(ctx); err != nil && !strings.Contains(err.Error(), "context canceled") {
390 390
 		return err
391 391
 	}
392
-	nodeID := node.NodeID()
393
-	for _, id := range c.config.Backend.ListContainersForNode(nodeID) {
394
-		if err := c.config.Backend.ContainerRm(id, &apitypes.ContainerRmConfig{ForceRemove: true}); err != nil {
395
-			logrus.Errorf("error removing %v: %v", id, err)
392
+	if nodeID := node.NodeID(); nodeID != "" {
393
+		for _, id := range c.config.Backend.ListContainersForNode(nodeID) {
394
+			if err := c.config.Backend.ContainerRm(id, &apitypes.ContainerRmConfig{ForceRemove: true}); err != nil {
395
+				logrus.Errorf("error removing %v: %v", id, err)
396
+			}
396 397
 		}
397 398
 	}
398 399
 	c.Lock()
... ...
@@ -552,6 +552,32 @@ func (s *DockerSwarmSuite) TestApiSwarmLeaveRemovesContainer(c *check.C) {
552 552
 	c.Assert(id, checker.HasPrefix, strings.TrimSpace(id2))
553 553
 }
554 554
 
555
+// #23629
556
+func (s *DockerSwarmSuite) TestApiSwarmLeaveOnPendingJoin(c *check.C) {
557
+	s.AddDaemon(c, true, true)
558
+	d2 := s.AddDaemon(c, false, false)
559
+
560
+	id, err := d2.Cmd("run", "-d", "busybox", "top")
561
+	c.Assert(err, checker.IsNil)
562
+	id = strings.TrimSpace(id)
563
+
564
+	go d2.Join("nosuchhost:1234", "", "", false) // will block on pending state
565
+
566
+	time.Sleep(1 * time.Second)
567
+
568
+	info, err := d2.info()
569
+	c.Assert(err, checker.IsNil)
570
+	c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStatePending)
571
+
572
+	c.Assert(d2.Leave(true), checker.IsNil)
573
+
574
+	waitAndAssert(c, defaultReconciliationTimeout, d2.checkActiveContainerCount, checker.Equals, 1)
575
+
576
+	id2, err := d2.Cmd("ps", "-q")
577
+	c.Assert(err, checker.IsNil)
578
+	c.Assert(id, checker.HasPrefix, strings.TrimSpace(id2))
579
+}
580
+
555 581
 func (s *DockerSwarmSuite) TestApiSwarmManagerRestore(c *check.C) {
556 582
 	d1 := s.AddDaemon(c, true, true)
557 583