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]

Reply via email to