@@ -69,50 +69,46 @@ public class CommandsForRanges extends TreeMap<Timestamp, Summary> implements Co
69
69
{
70
70
static final IntervalComparators COMPARATORS = new IntervalComparators ();
71
71
static final IntervalKeyComparators KEY_COMPARATORS = new IntervalKeyComparators ();
72
- static class TxnIdInterval implements Comparable < TxnIdInterval >
72
+ static class TxnIdInterval extends TokenRange
73
73
{
74
- final RoutingKey start , end ;
75
74
final TxnId txnId ;
76
75
77
76
TxnIdInterval (RoutingKey start , RoutingKey end , TxnId txnId )
78
77
{
79
- this .start = start ;
80
- this .end = end ;
78
+ super ((TokenKey ) start , (TokenKey ) end );
81
79
this .txnId = txnId ;
82
80
}
83
81
84
82
TxnIdInterval (Range range , TxnId txnId )
85
83
{
86
- this .start = range .start ();
87
- this .end = range .end ();
88
- this .txnId = txnId ;
89
- }
90
-
91
- @ Override
92
- public int compareTo (TxnIdInterval that )
93
- {
94
- int c = this .start .compareTo (that .start );
95
- if (c == 0 ) c = this .end .compareTo (that .end );
96
- if (c == 0 ) c = this .txnId .compareTo (that .txnId );
97
- return c ;
84
+ this (range .start (), range .end (), txnId );
98
85
}
99
86
}
100
87
101
88
static class IntervalComparators implements IntervalBTree .IntervalComparators <TxnIdInterval >
102
89
{
103
- @ Override public Comparator <TxnIdInterval > totalOrder () { return TxnIdInterval ::compareTo ; }
104
- @ Override public Comparator <TxnIdInterval > endWithEndSorter () { return (a , b ) -> a .end .compareTo (b .end ); }
90
+ @ Override
91
+ public Comparator <TxnIdInterval > totalOrder ()
92
+ {
93
+ return (a , b ) -> {
94
+ int c = a .start ().compareTo (b .start ());
95
+ if (c == 0 ) c = a .end ().compareTo (b .end ());
96
+ if (c == 0 ) c = a .txnId .compareTo (b .txnId );
97
+ return c ;
98
+ };
99
+ }
100
+ @ Override public Comparator <TxnIdInterval > endWithEndSorter () { return (a , b ) -> a .end ().compareTo (b .end ()); }
105
101
106
- @ Override public SymmetricComparator <TxnIdInterval > startWithStartSeeker () { return (a , b ) -> startWithStart (a .start .compareTo (b .start )); }
107
- @ Override public SymmetricComparator <TxnIdInterval > startWithEndSeeker () { return (a , b ) -> startWithEnd (a .start .compareTo (b .end )); }
108
- @ Override public SymmetricComparator <TxnIdInterval > endWithStartSeeker () { return (a , b ) -> endWithStart (a .end .compareTo (b .start )); }
102
+ @ Override public SymmetricComparator <TxnIdInterval > startWithStartSeeker () { return (a , b ) -> startWithStart (a .start () .compareTo (b .start () )); }
103
+ @ Override public SymmetricComparator <TxnIdInterval > startWithEndSeeker () { return (a , b ) -> startWithEnd (a .start () .compareTo (b .end () )); }
104
+ @ Override public SymmetricComparator <TxnIdInterval > endWithStartSeeker () { return (a , b ) -> endWithStart (a .end () .compareTo (b .start () )); }
109
105
}
110
106
111
107
static class IntervalKeyComparators implements IntervalBTree .WithIntervalComparators <RoutingKey , TxnIdInterval >
112
108
{
113
- @ Override public AsymmetricComparator <RoutingKey , TxnIdInterval > startWithStartSeeker () { return (a , b ) -> keyStartWithStart (a .compareTo (b .start ));}
114
- @ Override public AsymmetricComparator <RoutingKey , TxnIdInterval > startWithEndSeeker () { return (a , b ) -> keyStartWithEnd (a .compareTo (b .end )); }
115
- @ Override public AsymmetricComparator <RoutingKey , TxnIdInterval > endWithStartSeeker () { return (a , b ) -> keyEndWithStart (a .compareTo (b .start )); }
109
+ @ Override public AsymmetricComparator <RoutingKey , TxnIdInterval > startWithStartSeeker () { return (a , b ) -> keyStartWithStart (a .compareTo (b .start () ));}
110
+ @ Override public AsymmetricComparator <RoutingKey , TxnIdInterval > startWithEndSeeker () { return (a , b ) -> keyStartWithEnd (a .compareTo (b .end () )); }
111
+ @ Override public AsymmetricComparator <RoutingKey , TxnIdInterval > endWithStartSeeker () { return (a , b ) -> keyEndWithStart (a .compareTo (b .start () )); }
116
112
}
117
113
118
114
public CommandsForRanges (Map <? extends Timestamp , ? extends Summary > m )
@@ -217,7 +213,7 @@ private Loader newLoader(@Nullable TxnId primaryTxnId, Unseekables<?> searchKeys
217
213
MaxDecidedRX maxDecidedRX = null ;
218
214
if (primaryTxnId != null && primaryTxnId .is (Txn .Kind .ExclusiveSyncPoint ) && findAsDep == null )
219
215
maxDecidedRX = commandStore .unsafeGetMaxDecidedRX ();
220
- return new Loader (this , searchKeysOrRanges , redundantBefore , testKind , minTxnId , maxTxnId , findAsDep , maxDecidedRX );
216
+ return new Loader (this , primaryTxnId , searchKeysOrRanges , redundantBefore , testKind , minTxnId , maxTxnId , findAsDep , maxDecidedRX );
221
217
}
222
218
223
219
private void updateTransitive (UnaryOperator <NavigableMap <TxnId , Ranges >> update )
@@ -267,14 +263,16 @@ public static class Loader extends Summary.Loader
267
263
{
268
264
private final Manager manager ;
269
265
private final MaxDecidedRX maxDecidedRX ;
266
+ private final TxnId primaryTxnId ;
270
267
private final TxnId minRelevantId ;
271
268
272
- public Loader (Manager manager , Unseekables <?> searchKeysOrRanges , RedundantBefore redundantBefore , Kinds testKinds , TxnId minTxnId , Timestamp maxTxnId , @ Nullable TxnId findAsDep , MaxDecidedRX maxDecidedRX )
269
+ public Loader (Manager manager , TxnId primaryTxnId , Unseekables <?> searchKeysOrRanges , RedundantBefore redundantBefore , Kinds testKinds , TxnId minTxnId , Timestamp maxTxnId , @ Nullable TxnId findAsDep , MaxDecidedRX maxDecidedRX )
273
270
{
274
- super (null , searchKeysOrRanges , redundantBefore , testKinds , minTxnId , maxTxnId , findAsDep );
271
+ super (primaryTxnId , searchKeysOrRanges , redundantBefore , testKinds , minTxnId , maxTxnId , findAsDep );
275
272
this .manager = manager ;
276
273
this .maxDecidedRX = maxDecidedRX ;
277
- this .minRelevantId = maxDecidedRX == null ? null : TxnId .nonNullOrMax (TxnId .NONE , maxDecidedRX .foldl (searchKeysOrRanges , TxnId ::nonNullOrMin , null ));
274
+ this .primaryTxnId = primaryTxnId ;
275
+ this .minRelevantId = MaxDecidedRX .minDecidedDependencyId (maxDecidedRX , searchKeysOrRanges , primaryTxnId );
278
276
}
279
277
280
278
public void intersects (Consumer <TxnId > forEach )
@@ -306,14 +304,22 @@ boolean isRelevant(TxnIdInterval txnIdInterval)
306
304
{
307
305
if (maxDecidedRX == null )
308
306
return true ;
309
- if (txnIdInterval .txnId .compareTo (minRelevantId ) < 0 )
307
+
308
+ if (!isMaybeRelevant (txnIdInterval .txnId ))
310
309
return false ;
311
- return maxDecidedRX .foldl (txnIdInterval .start , txnIdInterval .end , (decided , anyUndecided , test , ignore ) -> test .compareTo (decided ) >= 0 , false , txnIdInterval .txnId , null );
310
+
311
+ TxnId minRelevantId = MaxDecidedRX .minDecidedDependencyId (maxDecidedRX , Ranges .of (txnIdInterval ), primaryTxnId );
312
+ return isRelevant (minRelevantId , primaryTxnId );
313
+ }
314
+
315
+ private boolean isRelevant (@ Nullable TxnId minRelevantId , TxnId txnId )
316
+ {
317
+ return minRelevantId == null || minRelevantId .compareTo (txnId ) <= 0 ;
312
318
}
313
319
314
320
boolean isMaybeRelevant (TxnId txnId )
315
321
{
316
- return maxDecidedRX == null || txnId . compareTo (minRelevantId ) >= 0 ;
322
+ return isRelevant (minRelevantId , txnId ) ;
317
323
}
318
324
319
325
public void forEachInCache (Unseekables <?> keysOrRanges , Consumer <Summary > forEach , AccordCommandStore .Caches caches )
0 commit comments