Skip to content

Commit

Permalink
Don’t try to restore swarm from incomplete state
Browse files Browse the repository at this point in the history
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
(cherry picked from commit ded1d9a)
  • Loading branch information
tonistiigi authored and Tibor Vass committed Jun 30, 2016
1 parent abb6e38 commit 8a994d4
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 6 deletions.
27 changes: 21 additions & 6 deletions daemon/cluster/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,19 +93,14 @@ func New(config Config) (*Cluster, error) {
reconnectDelay: initialReconnectDelay,
}

dt, err := ioutil.ReadFile(filepath.Join(root, stateFile))
st, err := c.loadState()
if err != nil {
if os.IsNotExist(err) {
return c, nil
}
return nil, err
}

var st state
if err := json.Unmarshal(dt, &st); err != nil {
return nil, err
}

n, ctx, err := c.startNewNode(false, st.ListenAddr, "", "", "", false)
if err != nil {
return nil, err
Expand All @@ -124,6 +119,25 @@ func New(config Config) (*Cluster, error) {
return c, nil
}

func (c *Cluster) loadState() (*state, error) {
dt, err := ioutil.ReadFile(filepath.Join(c.root, stateFile))
if err != nil {
return nil, err
}
// missing certificate means no actual state to restore from
if _, err := os.Stat(filepath.Join(c.root, "certificates/swarm-node.crt")); err != nil {
if os.IsNotExist(err) {
c.clearState()
}
return nil, err
}
var st state
if err := json.Unmarshal(dt, &st); err != nil {
return nil, err
}
return &st, nil
}

func (c *Cluster) saveState() error {
dt, err := json.Marshal(state{ListenAddr: c.listenAddr})
if err != nil {
Expand Down Expand Up @@ -410,6 +424,7 @@ func (c *Cluster) Leave(force bool) error {
}

func (c *Cluster) clearState() error {
// todo: backup this data instead of removing?
if err := os.RemoveAll(c.root); err != nil {
return err
}
Expand Down
25 changes: 25 additions & 0 deletions integration-cli/docker_api_swarm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,31 @@ func (s *DockerSwarmSuite) TestApiSwarmLeaveOnPendingJoin(c *check.C) {
c.Assert(id, checker.HasPrefix, strings.TrimSpace(id2))
}

// #23705
func (s *DockerSwarmSuite) TestApiSwarmRestoreOnPendingJoin(c *check.C) {
d := s.AddDaemon(c, false, false)
go d.Join("nosuchhost:1234", "", "", false) // will block on pending state

for i := 0; ; i++ {
info, err := d.info()
c.Assert(err, checker.IsNil)
if info.LocalNodeState == swarm.LocalNodeStatePending {
break
}
if i > 10 {
c.Fatalf("node did not go to pending state: %v", info.LocalNodeState)
}
time.Sleep(100 * time.Millisecond)
}

c.Assert(d.Stop(), checker.IsNil)
c.Assert(d.Start(), checker.IsNil)

info, err := d.info()
c.Assert(err, checker.IsNil)
c.Assert(info.LocalNodeState, checker.Equals, swarm.LocalNodeStateInactive)
}

func (s *DockerSwarmSuite) TestApiSwarmManagerRestore(c *check.C) {
d1 := s.AddDaemon(c, true, true)

Expand Down

0 comments on commit 8a994d4

Please sign in to comment.