mirror of
https://github.com/optim-enterprises-bv/kubernetes.git
synced 2025-12-24 16:57:27 +00:00
Fix AtomicWriter may not create user visible files after kubelet was restarted
This commit is contained in:
@@ -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)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user