blambov commented on code in PR #4245:
URL: https://github.com/apache/cassandra/pull/4245#discussion_r2231350425
##########
src/java/org/apache/cassandra/db/memtable/TrieMemtable.java:
##########
@@ -360,8 +360,8 @@ public FlushablePartitionSet<MemtablePartition>
getFlushSet(PartitionPosition fr
{
boolean allPositionsToFlush = from == null && to == null
|| from != null && to != null
- && from.isMinimum()
- && to.isMaximum();
+ && from.isMinimum() && from.kind() ==
PartitionPosition.Kind.MIN_BOUND
Review Comment:
The minimum token is something reserved for boundaries (i.e. the computed
hash is adjusted to avoid it) thus the `MIN_BOUND` check here is unnecessary.
AFAIAA other uses of `isMinimum` don't check this, and I believe we also use
minimum with `MAX_BOUND` in some cases, which will fail this check when the
intention is to fully cover the lower side of the ring.
##########
src/java/org/apache/cassandra/db/memtable/TrieMemtable.java:
##########
@@ -382,25 +383,32 @@ public FlushablePartitionSet<MemtablePartition>
getFlushSet(PartitionPosition fr
int toShardFull;
int toShardPartial;
- if (from == null || from.isMinimum())
+ if (from == null || from.isMinimum() && from.kind() ==
PartitionPosition.Kind.MIN_BOUND)
Review Comment:
... also applicable here.
##########
src/java/org/apache/cassandra/dht/Token.java:
##########
@@ -425,6 +430,11 @@ public boolean isMinimum()
return getToken().isMinimum();
}
+ public boolean isMaximum()
+ {
+ return getToken().isMaximum();
Review Comment:
As explained above, we do need `&& !isMinimumBound` here.
##########
src/java/org/apache/cassandra/db/memtable/TrieMemtable.java:
##########
@@ -382,25 +383,32 @@ public FlushablePartitionSet<MemtablePartition>
getFlushSet(PartitionPosition fr
int toShardFull;
int toShardPartial;
- if (from == null || from.isMinimum())
+ if (from == null || from.isMinimum() && from.kind() ==
PartitionPosition.Kind.MIN_BOUND)
fromShardFull = fromShardPartial = 0;
else
{
fromShardPartial = boundaries.getShardForToken(from.getToken());
- Token fromStartBoundaryToken =
boundaries.getShardStartBoundary(fromShardPartial);
- if (fromStartBoundaryToken != null &&
from.equals(fromStartBoundaryToken.maxKeyBound()))
+ // not symmetric to "to" logic because the start part of shard
ranges is exclusive
+ Token fromEndBoundaryToken =
boundaries.getShardEndBoundary(fromShardPartial);
+ if (fromEndBoundaryToken != null &&
from.equals(fromEndBoundaryToken.maxKeyBound()))
+ {
+ fromShardPartial++;
fromShardFull = fromShardPartial;
+ }
else
fromShardFull = fromShardPartial + 1;
}
- if (to == null || to.isMaximum())
+ if (to == null || to.isMaximum() && to.kind() ==
PartitionPosition.Kind.MAX_BOUND)
Review Comment:
... and here
##########
src/java/org/apache/cassandra/db/memtable/TrieMemtable.java:
##########
@@ -360,8 +360,8 @@ public FlushablePartitionSet<MemtablePartition>
getFlushSet(PartitionPosition fr
{
boolean allPositionsToFlush = from == null && to == null
|| from != null && to != null
- && from.isMinimum()
- && to.isMaximum();
+ && from.isMinimum() && from.kind() ==
PartitionPosition.Kind.MIN_BOUND
+ && to.isMaximum() && to.kind() ==
PartitionPosition.Kind.MAX_BOUND;
Review Comment:
To clarify (or add to the confusion), the maximum is sometimes out of scope
(`RandomPartitioner`) and other times isn't (`Murmur3Partitioner`). The
`MAX_BOUND` check is necessary for the maximum, but it should be part of the
`isMaximum` call rather than done here.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]