func saveState()

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
}