Browse code

Fix removing containers on leaving from pending state

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>

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