// NewTransaction creates a new transaction. The transaction key is // composed using the specified baseKey (for locality with data // affected by the transaction) and a random UUID to guarantee // uniqueness. The specified user-level priority is combined with // a randomly chosen value to yield a final priority, used to settle // write conflicts in a way that avoids starvation of long-running // transactions (see Range.InternalPushTxn). func NewTransaction(baseKey engine.Key, userPriority int32, isolation proto.IsolationType, clock *hlc.Clock) *proto.Transaction { // Compute priority by adjusting based on userPriority factor. if userPriority < 1 { userPriority = 1 } priority := math.MaxInt32 - util.CachedRand.Int31n(math.MaxInt32/userPriority) // Compute timestamp and max timestamp. now := clock.Now() max := now max.WallTime += clock.MaxDrift().Nanoseconds() return &proto.Transaction{ ID: append(baseKey, []byte(uuid.New())...), Priority: priority, Isolation: isolation, Timestamp: now, MaxTimestamp: max, } }
// Clear clears the cache and resets the high water mark to the // current time plus the maximum clock skew. func (tc *TimestampCache) Clear(clock *hlc.Clock) { tc.cache.Clear() tc.highWater = clock.Now() tc.highWater.WallTime += clock.MaxDrift().Nanoseconds() tc.latest = tc.highWater }