Repository: cassandra Updated Branches: refs/heads/cassandra-3.0 f93e6e340 -> 36bdc2531 refs/heads/cassandra-3.11 2bae4ca90 -> 85514ed9e refs/heads/trunk 030ec1f05 -> 79e344fc6
Remove non-rpc-ready nodes from counter leader candidates patch by Stefano Ortolani; reviewed by Aleksey Yeschenko for CASSANDRA-13043 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/36bdc253 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/36bdc253 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/36bdc253 Branch: refs/heads/cassandra-3.0 Commit: 36bdc253193318ceaf5beb9bc5e869f6af590cb1 Parents: f93e6e3 Author: Stefano Ortolani <ortol...@lastline.com> Authored: Sun Sep 3 16:48:36 2017 +0100 Committer: Aleksey Yeschenko <alek...@yeschenko.com> Committed: Wed Sep 20 18:32:24 2017 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../apache/cassandra/service/StorageProxy.java | 25 +++++++++++++------- .../cassandra/service/StorageService.java | 18 +++++++++++--- 3 files changed, 32 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/36bdc253/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 07742ef..91f5a51 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.15 + * Remove non-rpc-ready nodes from counter leader candidates (CASSANDRA-13043) * Improve short read protection performance (CASSANDRA-13794) * Fix sstable reader to support range-tombstone-marker for multi-slices (CASSANDRA-13787) * Fix short read protection for tables with no clustering columns (CASSANDRA-13880) http://git-wip-us.apache.org/repos/asf/cassandra/blob/36bdc253/src/java/org/apache/cassandra/service/StorageProxy.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index 1ce1bc5..6bf275d 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -1404,27 +1404,34 @@ public class StorageProxy implements StorageProxyMBean { Keyspace keyspace = Keyspace.open(keyspaceName); IEndpointSnitch snitch = DatabaseDescriptor.getEndpointSnitch(); - List<InetAddress> endpoints = StorageService.instance.getLiveNaturalEndpoints(keyspace, key); + List<InetAddress> endpoints = new ArrayList<>(); + StorageService.instance.getLiveNaturalEndpoints(keyspace, key, endpoints); + + // CASSANDRA-13043: filter out those endpoints not accepting clients yet, maybe because still bootstrapping + endpoints.removeIf(endpoint -> !StorageService.instance.isRpcReady(endpoint)); + + // TODO have a way to compute the consistency level if (endpoints.isEmpty()) - // TODO have a way to compute the consistency level throw new UnavailableException(cl, cl.blockFor(keyspace), 0); - List<InetAddress> localEndpoints = new ArrayList<InetAddress>(); + List<InetAddress> localEndpoints = new ArrayList<>(endpoints.size()); + for (InetAddress endpoint : endpoints) - { if (snitch.getDatacenter(endpoint).equals(localDataCenter)) localEndpoints.add(endpoint); - } + if (localEndpoints.isEmpty()) { + // If the consistency required is local then we should not involve other DCs + if (cl.isDatacenterLocal()) + throw new UnavailableException(cl, cl.blockFor(keyspace), 0); + // No endpoint in local DC, pick the closest endpoint according to the snitch snitch.sortByProximity(FBUtilities.getBroadcastAddress(), endpoints); return endpoints.get(0); } - else - { - return localEndpoints.get(ThreadLocalRandom.current().nextInt(localEndpoints.size())); - } + + return localEndpoints.get(ThreadLocalRandom.current().nextInt(localEndpoints.size())); } // Must be called on a replica of the mutation. This replica becomes the http://git-wip-us.apache.org/repos/asf/cassandra/blob/36bdc253/src/java/org/apache/cassandra/service/StorageService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index a1d1756..52f28d4 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -3415,16 +3415,28 @@ public class StorageService extends NotificationBroadcasterSupport implements IE public List<InetAddress> getLiveNaturalEndpoints(Keyspace keyspace, RingPosition pos) { + List<InetAddress> liveEps = new ArrayList<>(); + getLiveNaturalEndpoints(keyspace, pos, liveEps); + return liveEps; + } + + /** + * This method attempts to return N endpoints that are responsible for storing the + * specified key i.e for replication. + * + * @param keyspace keyspace name also known as keyspace + * @param pos position for which we need to find the endpoint + * @param liveEps the list of endpoints to mutate + */ + public void getLiveNaturalEndpoints(Keyspace keyspace, RingPosition pos, List<InetAddress> liveEps) + { List<InetAddress> endpoints = keyspace.getReplicationStrategy().getNaturalEndpoints(pos); - List<InetAddress> liveEps = new ArrayList<>(endpoints.size()); for (InetAddress endpoint : endpoints) { if (FailureDetector.instance.isAlive(endpoint)) liveEps.add(endpoint); } - - return liveEps; } public void setLoggingLevel(String classQualifier, String rawLevel) throws Exception --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org