mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 05:27:21 +00:00
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:
commit
a6b4fab8c4
@ -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",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user