Merge pull request #55034 from yujuhong/fix-fs

Automatic merge from submit-queue (batch tested with PRs 55034, 55068). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

Close the file before renaming in FileStore

Also change the unit test to use a real file system to detect errors
like this.
This commit is contained in:
Kubernetes Submit Queue 2017-11-06 12:29:09 -08:00 committed by GitHub
commit a6b4fab8c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 12 deletions

View File

@ -23,6 +23,7 @@ go_test(
deps = [ deps = [
"//pkg/util/filesystem:go_default_library", "//pkg/util/filesystem:go_default_library",
"//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library",
"//vendor/github.com/stretchr/testify/require:go_default_library",
], ],
) )

View File

@ -117,16 +117,19 @@ func writeFile(fs utilfs.Filesystem, path string, data []byte) (retErr error) {
} }
tmpPath := tmpFile.Name() tmpPath := tmpFile.Name()
shouldClose := true
defer func() { defer func() {
// Close the file. // Close the file.
if shouldClose {
if err := tmpFile.Close(); err != nil { if err := tmpFile.Close(); err != nil {
if retErr == nil { if retErr == nil {
retErr = err retErr = fmt.Errorf("close error: %v", err)
} else { } else {
retErr = fmt.Errorf("failed to close temp file after error %v; close error: %v", retErr, err) retErr = fmt.Errorf("failed to close temp file after error %v; close error: %v", retErr, err)
} }
} }
}
// Clean up the temp file on error. // Clean up the temp file on error.
if retErr != nil && tmpPath != "" { if retErr != nil && tmpPath != "" {
@ -146,6 +149,13 @@ func writeFile(fs utilfs.Filesystem, path string, data []byte) (retErr error) {
return err return err
} }
// Closing the file before renaming.
err = tmpFile.Close()
shouldClose = false
if err != nil {
return err
}
return fs.Rename(tmpPath, path) return fs.Rename(tmpPath, path)
} }

View File

@ -22,15 +22,25 @@ import (
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"k8s.io/kubernetes/pkg/util/filesystem" "k8s.io/kubernetes/pkg/util/filesystem"
) )
func TestFileStore(t *testing.T) { func TestFileStore(t *testing.T) {
path, err := ioutil.TempDir("", "FileStore") path, err := ioutil.TempDir("", "FileStore")
assert.NoError(t, err) assert.NoError(t, err)
store, err := NewFileStore(path, filesystem.NewFakeFs()) store, err := NewFileStore(path, filesystem.DefaultFs{})
assert.NoError(t, err) assert.NoError(t, err)
testStore(t, store)
}
func TestFakeFileStore(t *testing.T) {
store, err := NewFileStore("/tmp/test-fake-file-store", filesystem.NewFakeFs())
assert.NoError(t, err)
testStore(t, store)
}
func testStore(t *testing.T, store Store) {
testCases := []struct { testCases := []struct {
key string key string
data string data string
@ -70,20 +80,20 @@ func TestFileStore(t *testing.T) {
// Test add data. // Test add data.
for _, c := range testCases { for _, c := range testCases {
_, err = store.Read(c.key) t.Log("test case: ", c)
_, err := store.Read(c.key)
assert.Error(t, err) assert.Error(t, err)
err = store.Write(c.key, []byte(c.data)) err = store.Write(c.key, []byte(c.data))
if c.expectErr { if c.expectErr {
assert.Error(t, err) assert.Error(t, err)
continue continue
} else {
assert.NoError(t, err)
} }
require.NoError(t, err)
// Test read data by key. // Test read data by key.
data, err := store.Read(c.key) data, err := store.Read(c.key)
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, string(data), c.data) assert.Equal(t, string(data), c.data)
} }
@ -100,7 +110,7 @@ func TestFileStore(t *testing.T) {
} }
err = store.Delete(c.key) err = store.Delete(c.key)
assert.NoError(t, err) require.NoError(t, err)
_, err = store.Read(c.key) _, err = store.Read(c.key)
assert.EqualValues(t, ErrKeyNotFound, err) assert.EqualValues(t, ErrKeyNotFound, err)
} }
@ -111,6 +121,6 @@ func TestFileStore(t *testing.T) {
// Test list keys. // Test list keys.
keys, err = store.List() keys, err = store.List()
assert.NoError(t, err) require.NoError(t, err)
assert.Equal(t, len(keys), 0) assert.Equal(t, len(keys), 0)
} }