// FinalSave should be called immediately before exiting, and only before // exiting, in order to flush tasks to disk. It waits a short timeout for state // to settle if necessary. If unable to reach a steady-state and save within // this short timeout, it returns an error func FinalSave(saver statemanager.Saver, taskEngine engine.TaskEngine) error { engineDisabled := make(chan error) disableTimer := time.AfterFunc(engineDisableTimeout, func() { engineDisabled <- errors.New("Timed out waiting for TaskEngine to settle") }) go func() { log.Debug("Shutting down task engine") taskEngine.Disable() disableTimer.Stop() engineDisabled <- nil }() disableErr := <-engineDisabled stateSaved := make(chan error) saveTimer := time.AfterFunc(finalSaveTimeout, func() { stateSaved <- errors.New("Timed out trying to save to disk") }) go func() { log.Debug("Saving state before shutting down") stateSaved <- saver.ForceSave() saveTimer.Stop() }() saveErr := <-stateSaved if disableErr != nil || saveErr != nil { return utils.NewMultiError(disableErr, saveErr) } return nil }