func (l *localOracle) GetTimestamp() (uint64, error) { l.Lock() defer l.Unlock() physical := oracle.GetPhysical(time.Now()) ts := oracle.ComposeTS(physical, 0) if l.lastTimeStampTS == ts { l.n++ return uint64(ts + l.n), nil } l.lastTimeStampTS = ts l.n = 0 return uint64(ts), nil }
func (o *mockOracle) GetTimestamp() (uint64, error) { o.Lock() defer o.Unlock() if o.stop { return 0, errors.Trace(errStopped) } physical := oracle.GetPhysical(time.Now().Add(o.offset)) ts := oracle.ComposeTS(physical, 0) if oracle.ExtractPhysical(o.lastTS) == physical { ts = o.lastTS + 1 } o.lastTS = ts return ts, nil }
// prepare checks required conditions for starting a GC job. It returns a bool // that indicates whether the GC job should start and the new safePoint. func (w *GCWorker) prepare() (bool, uint64, error) { now, err := w.getOracleTime() if err != nil { return false, 0, errors.Trace(err) } ok, err := w.checkGCInterval(now) if err != nil || !ok { return false, 0, errors.Trace(err) } newSafePoint, err := w.calculateNewSafePoint(now) if err != nil || newSafePoint == nil { return false, 0, errors.Trace(err) } err = w.saveTime(gcLastRunTimeKey, now) if err != nil { return false, 0, errors.Trace(err) } err = w.saveTime(gcSafePointKey, *newSafePoint) if err != nil { return false, 0, errors.Trace(err) } return true, oracle.ComposeTS(oracle.GetPhysical(*newSafePoint), 0), nil }
func (l *localOracle) IsExpired(lockTS uint64, TTL uint64) bool { return oracle.GetPhysical(time.Now()) >= oracle.ExtractPhysical(lockTS)+int64(TTL) }
func (o *mockOracle) IsExpired(lockTimestamp uint64, TTL uint64) bool { o.RLock() defer o.RUnlock() return oracle.GetPhysical(time.Now().Add(o.offset)) >= oracle.ExtractPhysical(lockTimestamp)+int64(TTL) }