Merge pull request #33899 from MrHohn/fix_config_test

Automatic merge from submit-queue

Fix #33784, IN_CREATE event does not guarantee file content written

Fixed #33784.

The CREATE inotify event [here](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/config/file_linux_test.go#L275) is triggered by os.OpenFile(), however the content would be written by the following f.Write(). It will fail if the program try to process the event in between.

IN_CREAE event is triggered by open(2), mkdir(2), link(2), symlink(2), bind(2), but not all of them will guarantee the content is written ([ref](http://man7.org/linux/man-pages/man7/inotify.7.html)). <s>Hence we should not respond to IN_CREATE event for pod creation. I believe listen on IN_MODIFY and IN_MOVED_TO would be sufficient for pod addition&update.

Would like to see the Jenkins test results for further evaluation.

@Random-Liu
This commit is contained in:
Kubernetes Submit Queue 2016-10-03 22:24:48 -07:00 committed by GitHub
commit 47b4c0e770

View File

@ -261,32 +261,13 @@ func watchFileAdded(watchDir bool, t *testing.T) {
testCase.writeToFile(dirName, fileName, t)
}
if watchDir {
defer func() {
// Remove the file
deleteFile(dirName, fileName, ch, t)
}()
}
go addFile()
if watchDir {
// expect an update by CREATE inotify event
expectUpdate(t, ch, testCase)
// expect an update by MODIFY inotify event
expectUpdate(t, ch, testCase)
from := fileName
fileName = fileName + "_ch"
go changeFileName(dirName, from, fileName, t)
// expect an update by MOVED_FROM inotify event cause changing file name
expectEmptyUpdate(t, ch)
// expect an update by MOVED_TO inotify event cause changing file name
expectUpdate(t, ch, testCase)
} else {
// expect an update by SourceFile.resetStoreFromPath()
expectUpdate(t, ch, testCase)
}
// For !watchDir: expect an update by SourceFile.resetStoreFromPath().
// For watchDir: expect at least one update from CREATE & MODIFY inotify event.
// Shouldn't expect two updates from CREATE & MODIFY because CREATE doesn't guarantee file written.
// In that case no update will be sent from CREATE event.
expectUpdate(t, ch, testCase)
}()
}
}