From e4c29dc5798f04f15d898e98197c079fd43799fe Mon Sep 17 00:00:00 2001 From: Ryan Uber Date: Fri, 11 Sep 2015 20:32:55 -0700 Subject: [PATCH] client: alloc dirs tolerate missing directories --- client/client.go | 2 +- client/util.go | 3 +++ client/util_test.go | 17 ++++++++++++++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/client/client.go b/client/client.go index 5a3323f8c..5b445e028 100644 --- a/client/client.go +++ b/client/client.go @@ -243,7 +243,7 @@ func (c *Client) restoreState() error { // Scan the directory list, err := ioutil.ReadDir(filepath.Join(c.config.StateDir, "alloc")) - if err != nil { + if err != nil && !os.IsNotExist(err) { return fmt.Errorf("failed to list alloc state: %v", err) } diff --git a/client/util.go b/client/util.go index 032e8d502..4efec9e18 100644 --- a/client/util.go +++ b/client/util.go @@ -106,6 +106,9 @@ func persistState(path string, data interface{}) error { func restoreState(path string, data interface{}) error { buf, err := ioutil.ReadFile(path) if err != nil { + if os.IsNotExist(err) { + return nil + } return fmt.Errorf("failed to read state: %v", err) } if err := json.Unmarshal(buf, data); err != nil { diff --git a/client/util_test.go b/client/util_test.go index 904749db6..d6c165b9b 100644 --- a/client/util_test.go +++ b/client/util_test.go @@ -1,7 +1,9 @@ package client import ( + "io/ioutil" "os" + "path/filepath" "reflect" "testing" "time" @@ -80,6 +82,16 @@ func TestShuffleStrings(t *testing.T) { } func TestPersistRestoreState(t *testing.T) { + dir, err := ioutil.TempDir("", "nomad") + if err != nil { + t.Fatalf("err: %s", err) + } + defer os.RemoveAll(dir) + + // Use a state path inside a non-existent directory. This + // verifies that the directory is created properly. + statePath := filepath.Join(dir, "subdir", "test-persist") + type stateTest struct { Foo int Bar string @@ -90,15 +102,14 @@ func TestPersistRestoreState(t *testing.T) { Bar: "the quick brown fox", Baz: true, } - defer os.Remove("test-persist") - err := persistState("test-persist", &state) + err = persistState(statePath, &state) if err != nil { t.Fatalf("err: %v", err) } var out stateTest - err = restoreState("test-persist", &out) + err = restoreState(statePath, &out) if err != nil { t.Fatalf("err: %v", err) }