Don’t try to restore swarm from incomplete state

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
Upstream-commit: ded1d9af38cb467dadab0521936174eef0d4bc9e
Component: engine
This commit is contained in:
Tonis Tiigi
2016-06-18 19:43:47 -07:00
parent 78a01ebf61
commit 20fc079713
2 changed files with 46 additions and 6 deletions
+21 -6
View File
@@ -93,7 +93,7 @@ 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
@@ -101,11 +101,6 @@ func New(config Config) (*Cluster, error) {
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
@@ -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 {
@@ -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
}