func (manager *basicStateManager) Save() error {
	defer metrics.MetricsEngineGlobal.RecordStateManagerMetric("SAVE")()
	manager.saveTimesLock.Lock()
	defer manager.saveTimesLock.Unlock()
	if time.Since(manager.lastSave) >= minSaveInterval {
		// we can just save
		err := manager.ForceSave()
		manager.lastSave = time.Now()
		manager.nextPlannedSave = time.Time{} // re-zero it; assume all pending desires to save are fulfilled
		return err
	} else if manager.nextPlannedSave.IsZero() {
		// No save planned yet, we should plan one.
		next := manager.lastSave.Add(minSaveInterval)
		manager.nextPlannedSave = next
		go func() {
			time.Sleep(next.Sub(time.Now()))
			manager.Save()
		}()
	}
	// else nextPlannedSave wasn't Zero so there's a save planned elsewhere that'll
	// fulfill this
	return nil
}
func (manager *basicStateManager) Save() error {
	defer metrics.MetricsEngineGlobal.RecordStateManagerMetric("SAVE")()
	manager.saveTimesLock.Lock()
	defer manager.saveTimesLock.Unlock()
	if time.Since(manager.lastSave) >= minSaveInterval {
		
		err := manager.ForceSave()
		manager.lastSave = time.Now()
		manager.nextPlannedSave = time.Time{} 
		return err
	} else if manager.nextPlannedSave.IsZero() {
		
		next := manager.lastSave.Add(minSaveInterval)
		manager.nextPlannedSave = next
		go func() {
			time.Sleep(next.Sub(time.Now()))
			manager.Save()
		}()
	}
	
	
	return nil
}
func ( manager * basicStateManager ) Save ( ) error { defer metrics . MetricsEngineGlobal . RecordStateManagerMetric ( " " ) ( ) manager . saveTimesLock . Lock ( ) defer manager . saveTimesLock . Unlock ( ) if time . Since ( manager . lastSave ) >= minSaveInterval { // we can just save err := manager . ForceSave ( ) manager . lastSave = time . Now ( ) manager . nextPlannedSave = time . Time { } // re-zero it; assume all pending desires to save are fulfilled return err } else if manager . nextPlannedSave . IsZero ( ) { // No save planned yet, we should plan one. next := manager . lastSave . Add ( minSaveInterval ) manager . nextPlannedSave = next go func ( ) { time . Sleep ( next . Sub ( time . Now ( ) ) ) manager . Save ( ) } ( ) } // else nextPlannedSave wasn't Zero so there's a save planned elsewhere that'll // fulfill this return nil }
// Save triggers a save to file, though respects a minimum save interval to wait
// between saves.
Save triggers a save to file though respects a minimum save interval to wait between saves .