func FinalSave(saver statemanager.Saver, taskEngine engine.TaskEngine) error {
	engineDisabled := make(chan error)

	disableTimer := time.AfterFunc(engineDisableTimeout, func() {
		engineDisabled <- errors.New("final save: timed out waiting for TaskEngine to settle")
	})

	go func() {
		seelog.Debug("Shutting down task engine for final save")
		taskEngine.Disable()
		disableTimer.Stop()
		engineDisabled <- nil
	}()

	disableErr := <-engineDisabled

	stateSaved := make(chan error)
	saveTimer := time.AfterFunc(finalSaveTimeout, func() {
		stateSaved <- errors.New("final save: timed out trying to save to disk")
	})
	go func() {
		seelog.Debug("Saving state before shutting down")
		stateSaved <- saver.ForceSave()
		saveTimer.Stop()
	}()

	saveErr := <-stateSaved

	if disableErr != nil || saveErr != nil {
		return apierrors.NewMultiError(disableErr, saveErr)
	}
	return nil
}
func FinalSave(saver statemanager.Saver, taskEngine engine.TaskEngine) error {
	engineDisabled := make(chan error)

	disableTimer := time.AfterFunc(engineDisableTimeout, func() {
		engineDisabled <- errors.New("final save: timed out waiting for TaskEngine to settle")
	})

	go func() {
		seelog.Debug("Shutting down task engine for final save")
		taskEngine.Disable()
		disableTimer.Stop()
		engineDisabled <- nil
	}()

	disableErr := <-engineDisabled

	stateSaved := make(chan error)
	saveTimer := time.AfterFunc(finalSaveTimeout, func() {
		stateSaved <- errors.New("final save: timed out trying to save to disk")
	})
	go func() {
		seelog.Debug("Saving state before shutting down")
		stateSaved <- saver.ForceSave()
		saveTimer.Stop()
	}()

	saveErr := <-stateSaved

	if disableErr != nil || saveErr != nil {
		return apierrors.NewMultiError(disableErr, saveErr)
	}
	return nil
}
func FinalSave ( saver statemanager . Saver , taskEngine engine . TaskEngine ) error { engineDisabled := make ( chan error ) disableTimer := time . AfterFunc ( engineDisableTimeout , func ( ) { engineDisabled <- errors . New ( " " ) } ) go func ( ) { seelog . Debug ( " " ) taskEngine . Disable ( ) disableTimer . Stop ( ) engineDisabled <- nil } ( ) disableErr := <- engineDisabled stateSaved := make ( chan error ) saveTimer := time . AfterFunc ( finalSaveTimeout , func ( ) { stateSaved <- errors . New ( " " ) } ) go func ( ) { seelog . Debug ( " " ) stateSaved <- saver . ForceSave ( ) saveTimer . Stop ( ) } ( ) saveErr := <- stateSaved if disableErr != nil || saveErr != nil { return apierrors . NewMultiError ( disableErr , saveErr ) } return nil }
// 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
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