diff --git a/nucleus/change.go b/nucleus/change.go index 3fd4d7c0cb11b9166ab880eeebb83ff0ff977163..f64a99eaba5de7fa43ddcb52ff5adb6d14282a37 100644 --- a/nucleus/change.go +++ b/nucleus/change.go @@ -117,26 +117,27 @@ func stateManager(ch *Change, timeout time.Duration) (chan<- ppb.Change_State, < stateOut := make(chan ppb.Change_State) stateRequest := make(chan bool) errChan := make(chan error) - ticker := time.NewTicker(timeout) + // create ticker and make it wait for 1 week + // workaround for delayed ticker start and ugly housekeeping + ticker := time.NewTicker(time.Hour * 7 * 24) go func() { state := ppb.Change_PENDING for { select { case <-ticker.C: - // only roll back committed changes - if state == ppb.Change_COMMITTED { - err := ch.callback(ch.intendedState, ch.previousState) - if err != nil { - state = ppb.Change_INCONSISTENT - errChan <- err - } - errChan <- fmt.Errorf("change %v timed out", ch.cuid) - break + err := ch.callback(ch.intendedState, ch.previousState) + if err != nil { + state = ppb.Change_INCONSISTENT + errChan <- err } + errChan <- fmt.Errorf("change %v timed out", ch.cuid) + break case s := <-stateIn: switch s { case ppb.Change_COMMITTED: + // reset ticker to enable activate the change timeout + ticker.Reset(timeout) err := ch.callback(ch.previousState, ch.intendedState) if err != nil { state = ppb.Change_INCONSISTENT