Fix AtomicWriter may not create user visible files after kubelet was restarted

This commit is contained in:
carlory
2024-01-16 17:44:46 +08:00
parent 72d30a588b
commit 35004e8f77
2 changed files with 120 additions and 44 deletions

View File

@@ -1035,3 +1035,61 @@ func TestSetPerms(t *testing.T) {
t.Fatalf("unexpected error while writing: %v", err)
}
}
func TestWriteAgainAfterUnexpectedExit(t *testing.T) {
testCases := []struct {
name string
payload map[string]FileProjection
simulateFn func(targetDir string, payload map[string]FileProjection) error
}{
{
name: "process killed before creating user visible files",
payload: map[string]FileProjection{
"foo": {Mode: 0644, Data: []byte("foo")},
"bar": {Mode: 0644, Data: []byte("bar")},
},
simulateFn: func(targetDir string, payload map[string]FileProjection) error {
for filename := range payload {
path := filepath.Join(targetDir, filename)
if err := os.RemoveAll(path); err != nil {
return err
}
}
return nil
},
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
targetDir, err := utiltesting.MkTmpdir("atomic-write")
if err != nil {
t.Fatalf("unexpected error creating tmp dir: %v", err)
}
defer func() {
err := os.RemoveAll(targetDir)
if err != nil {
t.Errorf("%v: unexpected error removing tmp dir: %v", tc.name, err)
}
}()
writer := &AtomicWriter{targetDir: targetDir, logContext: "-test-"}
err = writer.Write(tc.payload, nil)
if err != nil {
t.Fatalf("unexpected error writing payload: %v", err)
}
err = tc.simulateFn(targetDir, tc.payload)
if err != nil {
t.Fatalf("failed to simulate the unexpected exit: %v", err)
}
err = writer.Write(tc.payload, nil)
if err != nil {
t.Fatalf("unexpected error writing payload again: %v", err)
}
checkVolumeContents(targetDir, tc.name, tc.payload, t)
})
}
}