@@ -16,6 +16,7 @@ import (
1616
1717 "github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverpb"
1818 "github.com/cockroachdb/cockroach/pkg/roachpb"
19+ "github.com/cockroachdb/cockroach/pkg/util/hlc"
1920 "github.com/cockroachdb/cockroach/pkg/util/log"
2021 "github.com/cockroachdb/errors"
2122 "github.com/kr/pretty"
@@ -63,8 +64,10 @@ type LocalResult struct {
6364 MaybeAddToSplitQueue bool
6465 // Call MaybeGossipNodeLiveness with the specified Span, if set.
6566 MaybeGossipNodeLiveness * roachpb.Span
66- // Call maybeWatchForMerge.
67- MaybeWatchForMerge bool
67+ // FreezeStart indicates the high water mark timestamp beyond which the range
68+ // is guaranteed to not have served any requests. This value is only set when
69+ // a range merge is in progress. If set, call maybeWatchForMerge.
70+ FreezeStart hlc.Timestamp
6871
6972 // Metrics contains counters which are to be passed to the
7073 // metrics subsystem.
@@ -84,7 +87,7 @@ func (lResult *LocalResult) IsZero() bool {
8487 ! lResult .MaybeGossipSystemConfig &&
8588 ! lResult .MaybeGossipSystemConfigIfHaveFailure &&
8689 lResult .MaybeGossipNodeLiveness == nil &&
87- ! lResult .MaybeWatchForMerge &&
90+ lResult .FreezeStart . IsEmpty () &&
8891 lResult .Metrics == nil
8992}
9093
@@ -97,13 +100,13 @@ func (lResult *LocalResult) String() string {
97100 "#updated txns: %d #end txns: %d, " +
98101 "GossipFirstRange:%t MaybeGossipSystemConfig:%t " +
99102 "MaybeGossipSystemConfigIfHaveFailure:%t MaybeAddToSplitQueue:%t " +
100- "MaybeGossipNodeLiveness:%s MaybeWatchForMerge:%t " ,
103+ "MaybeGossipNodeLiveness:%s FreezeStart:%s " ,
101104 lResult .Reply ,
102105 len (lResult .EncounteredIntents ), len (lResult .AcquiredLocks ), len (lResult .ResolvedLocks ),
103106 len (lResult .UpdatedTxns ), len (lResult .EndTxns ),
104107 lResult .GossipFirstRange , lResult .MaybeGossipSystemConfig ,
105108 lResult .MaybeGossipSystemConfigIfHaveFailure , lResult .MaybeAddToSplitQueue ,
106- lResult .MaybeGossipNodeLiveness , lResult .MaybeWatchForMerge )
109+ lResult .MaybeGossipNodeLiveness , lResult .FreezeStart )
107110}
108111
109112// DetachEncounteredIntents returns (and removes) those encountered
@@ -187,32 +190,32 @@ func coalesceBool(lhs *bool, rhs *bool) {
187190func (p * Result ) MergeAndDestroy (q Result ) error {
188191 if q .Replicated .State != nil {
189192 if q .Replicated .State .RaftAppliedIndex != 0 {
190- return errors .New ("must not specify RaftApplyIndex" )
193+ return errors .AssertionFailedf ("must not specify RaftApplyIndex" )
191194 }
192195 if q .Replicated .State .LeaseAppliedIndex != 0 {
193- return errors .New ("must not specify RaftApplyIndex" )
196+ return errors .AssertionFailedf ("must not specify RaftApplyIndex" )
194197 }
195198 if p .Replicated .State == nil {
196199 p .Replicated .State = & kvserverpb.ReplicaState {}
197200 }
198201 if p .Replicated .State .Desc == nil {
199202 p .Replicated .State .Desc = q .Replicated .State .Desc
200203 } else if q .Replicated .State .Desc != nil {
201- return errors .New ("conflicting RangeDescriptor" )
204+ return errors .AssertionFailedf ("conflicting RangeDescriptor" )
202205 }
203206 q .Replicated .State .Desc = nil
204207
205208 if p .Replicated .State .Lease == nil {
206209 p .Replicated .State .Lease = q .Replicated .State .Lease
207210 } else if q .Replicated .State .Lease != nil {
208- return errors .New ("conflicting Lease" )
211+ return errors .AssertionFailedf ("conflicting Lease" )
209212 }
210213 q .Replicated .State .Lease = nil
211214
212215 if p .Replicated .State .TruncatedState == nil {
213216 p .Replicated .State .TruncatedState = q .Replicated .State .TruncatedState
214217 } else if q .Replicated .State .TruncatedState != nil {
215- return errors .New ("conflicting TruncatedState" )
218+ return errors .AssertionFailedf ("conflicting TruncatedState" )
216219 }
217220 q .Replicated .State .TruncatedState = nil
218221
@@ -226,7 +229,7 @@ func (p *Result) MergeAndDestroy(q Result) error {
226229 }
227230
228231 if q .Replicated .State .Stats != nil {
229- return errors .New ("must not specify Stats" )
232+ return errors .AssertionFailedf ("must not specify Stats" )
230233 }
231234 if (* q .Replicated .State != kvserverpb.ReplicaState {}) {
232235 log .Fatalf (context .TODO (), "unhandled EvalResult: %s" ,
@@ -238,42 +241,42 @@ func (p *Result) MergeAndDestroy(q Result) error {
238241 if p .Replicated .Split == nil {
239242 p .Replicated .Split = q .Replicated .Split
240243 } else if q .Replicated .Split != nil {
241- return errors .New ("conflicting Split" )
244+ return errors .AssertionFailedf ("conflicting Split" )
242245 }
243246 q .Replicated .Split = nil
244247
245248 if p .Replicated .Merge == nil {
246249 p .Replicated .Merge = q .Replicated .Merge
247250 } else if q .Replicated .Merge != nil {
248- return errors .New ("conflicting Merge" )
251+ return errors .AssertionFailedf ("conflicting Merge" )
249252 }
250253 q .Replicated .Merge = nil
251254
252255 if p .Replicated .ChangeReplicas == nil {
253256 p .Replicated .ChangeReplicas = q .Replicated .ChangeReplicas
254257 } else if q .Replicated .ChangeReplicas != nil {
255- return errors .New ("conflicting ChangeReplicas" )
258+ return errors .AssertionFailedf ("conflicting ChangeReplicas" )
256259 }
257260 q .Replicated .ChangeReplicas = nil
258261
259262 if p .Replicated .ComputeChecksum == nil {
260263 p .Replicated .ComputeChecksum = q .Replicated .ComputeChecksum
261264 } else if q .Replicated .ComputeChecksum != nil {
262- return errors .New ("conflicting ComputeChecksum" )
265+ return errors .AssertionFailedf ("conflicting ComputeChecksum" )
263266 }
264267 q .Replicated .ComputeChecksum = nil
265268
266269 if p .Replicated .RaftLogDelta == 0 {
267270 p .Replicated .RaftLogDelta = q .Replicated .RaftLogDelta
268271 } else if q .Replicated .RaftLogDelta != 0 {
269- return errors .New ("conflicting RaftLogDelta" )
272+ return errors .AssertionFailedf ("conflicting RaftLogDelta" )
270273 }
271274 q .Replicated .RaftLogDelta = 0
272275
273276 if p .Replicated .AddSSTable == nil {
274277 p .Replicated .AddSSTable = q .Replicated .AddSSTable
275278 } else if q .Replicated .AddSSTable != nil {
276- return errors .New ("conflicting AddSSTable" )
279+ return errors .AssertionFailedf ("conflicting AddSSTable" )
277280 }
278281 q .Replicated .AddSSTable = nil
279282
@@ -289,7 +292,7 @@ func (p *Result) MergeAndDestroy(q Result) error {
289292 if p .Replicated .PrevLeaseProposal == nil {
290293 p .Replicated .PrevLeaseProposal = q .Replicated .PrevLeaseProposal
291294 } else if q .Replicated .PrevLeaseProposal != nil {
292- return errors .New ("conflicting lease expiration" )
295+ return errors .AssertionFailedf ("conflicting lease expiration" )
293296 }
294297 q .Replicated .PrevLeaseProposal = nil
295298
@@ -331,15 +334,21 @@ func (p *Result) MergeAndDestroy(q Result) error {
331334 if p .Local .MaybeGossipNodeLiveness == nil {
332335 p .Local .MaybeGossipNodeLiveness = q .Local .MaybeGossipNodeLiveness
333336 } else if q .Local .MaybeGossipNodeLiveness != nil {
334- return errors .New ("conflicting MaybeGossipNodeLiveness" )
337+ return errors .AssertionFailedf ("conflicting MaybeGossipNodeLiveness" )
335338 }
336339 q .Local .MaybeGossipNodeLiveness = nil
337340
341+ if p .Local .FreezeStart .IsEmpty () {
342+ p .Local .FreezeStart = q .Local .FreezeStart
343+ } else if ! q .Local .FreezeStart .IsEmpty () {
344+ return errors .AssertionFailedf ("conflicting FreezeStart" )
345+ }
346+ q .Local .FreezeStart = hlc.Timestamp {}
347+
338348 coalesceBool (& p .Local .GossipFirstRange , & q .Local .GossipFirstRange )
339349 coalesceBool (& p .Local .MaybeGossipSystemConfig , & q .Local .MaybeGossipSystemConfig )
340350 coalesceBool (& p .Local .MaybeGossipSystemConfigIfHaveFailure , & q .Local .MaybeGossipSystemConfigIfHaveFailure )
341351 coalesceBool (& p .Local .MaybeAddToSplitQueue , & q .Local .MaybeAddToSplitQueue )
342- coalesceBool (& p .Local .MaybeWatchForMerge , & q .Local .MaybeWatchForMerge )
343352
344353 if p .Local .Metrics == nil {
345354 p .Local .Metrics = q .Local .Metrics
0 commit comments