Github user aweisberg commented on a diff in the pull request:
https://github.com/apache/cassandra/pull/271#discussion_r220635043
--- Diff: src/java/org/apache/cassandra/locator/EndpointsForRange.java ---
@@ -57,95 +54,77 @@ private EndpointsForRange(Range<Token> range,
List<Replica> list, boolean isSnap
}
@Override
- public Mutable newMutable(int initialCapacity)
+ public Builder newBuilder(int initialCapacity)
{
- return new Mutable(range, initialCapacity);
+ return new Builder(range, initialCapacity);
}
public EndpointsForToken forToken(Token token)
{
if (!range.contains(token))
throw new IllegalArgumentException(token + " is not contained
within " + range);
- return new EndpointsForToken(token, list, isSnapshot, byEndpoint);
+ return new EndpointsForToken(token, list, byEndpoint);
}
@Override
- public EndpointsForRange self()
+ public EndpointsForRange snapshot()
{
return this;
}
@Override
- protected EndpointsForRange snapshot(List<Replica> snapshot)
+ EndpointsForRange snapshot(ReplicaList newList)
{
- if (snapshot.isEmpty()) return empty(range);
- return new EndpointsForRange(range, snapshot, true);
+ if (newList.isEmpty()) return empty(range);
+ ReplicaMap<InetAddressAndPort> byEndpoint = null;
+ if (this.byEndpoint != null && list.isSubList(newList))
+ byEndpoint = this.byEndpoint.forSubList(newList);
+ return new EndpointsForRange(range, newList, byEndpoint);
}
- public static class Mutable extends EndpointsForRange implements
ReplicaCollection.Mutable<EndpointsForRange>
+ public static class Builder extends EndpointsForRange implements
ReplicaCollection.Builder<EndpointsForRange>
{
- boolean hasSnapshot;
- public Mutable(Range<Token> range) { this(range, 0); }
- public Mutable(Range<Token> range, int capacity) { super(range,
new ArrayList<>(capacity), false, new LinkedHashMap<>(capacity)); }
+ boolean built;
+ public Builder(Range<Token> range) { this(range, 0); }
+ public Builder(Range<Token> range, int capacity) { this(range, new
ReplicaList(capacity)); }
+ private Builder(Range<Token> range, ReplicaList list) {
super(range, list, endpointMap(list)); }
- public void add(Replica replica, Conflict ignoreConflict)
+ public EndpointsForRange.Builder add(Replica replica, Conflict
ignoreConflict)
{
- if (hasSnapshot) throw new IllegalStateException();
+ if (built) throw new IllegalStateException();
Preconditions.checkNotNull(replica);
if (!replica.range().contains(super.range))
throw new IllegalArgumentException("Replica " + replica +
" does not contain " + super.range);
- Replica prev = super.byEndpoint.put(replica.endpoint(),
replica);
- if (prev != null)
+ if (!super.byEndpoint.internalPutIfAbsent(replica,
list.size()))
{
- super.byEndpoint.put(replica.endpoint(), prev); // restore
prev
switch (ignoreConflict)
{
case DUPLICATE:
- if (prev.equals(replica))
+ if
(byEndpoint().get(replica.endpoint()).equals(replica))
--- End diff --
Seems like now it has to look up in the map twice?
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]