in ecs-init/volumes/state_manager.go [94:128]
func saveState(b []byte) error {
// Make our temp-file on the same volume as our data-file to ensure we can
// actually move it atomically; cross-device renaming will error out
tmpfile, err := ioutil.TempFile(PluginStatePath, "tmp_ecs_volume_plugin")
if err != nil {
return fmt.Errorf("failed to create temp file: %v", err)
}
_, err = tmpfile.Write(b)
if err != nil {
return fmt.Errorf("failed to write state to temp file: %v", err)
}
// flush temp state file to disk
err = tmpfile.Sync()
if err != nil {
return fmt.Errorf("error flushing state file: %v", err)
}
err = os.Rename(tmpfile.Name(), filepath.Join(PluginStatePath, PluginStateFile))
if err != nil {
return fmt.Errorf("could not move data to state file: %v", err)
}
stateDir, err := os.Open(PluginStatePath)
if err != nil {
return fmt.Errorf("error opening state path: %v", err)
}
// sync directory entry of the new state file to disk
err = stateDir.Sync()
if err != nil {
return fmt.Errorf("error syncing state file directory entry: %v", err)
}
return nil
}