You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2018/02/26 05:52:49 UTC
lucene-solr:master: SOLR-10720: Aggressive removal of a collection
breaks cluster status API
Repository: lucene-solr
Updated Branches:
refs/heads/master d3ef153b0 -> 6f2d99e57
SOLR-10720: Aggressive removal of a collection breaks cluster status API
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/6f2d99e5
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/6f2d99e5
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/6f2d99e5
Branch: refs/heads/master
Commit: 6f2d99e574888227a29ea173e52f6ff6a19e23db
Parents: d3ef153
Author: Shalin Shekhar Mangar <sh...@apache.org>
Authored: Mon Feb 26 11:22:38 2018 +0530
Committer: Shalin Shekhar Mangar <sh...@apache.org>
Committed: Mon Feb 26 11:22:38 2018 +0530
----------------------------------------------------------------------
solr/CHANGES.txt | 2 ++
.../OverseerCollectionMessageHandler.java | 34 --------------------
.../solr/handler/admin/ClusterStatus.java | 20 ++++++++----
3 files changed, 15 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6f2d99e5/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index c6a2dd0..c915aa4 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -223,6 +223,8 @@ Bug Fixes
* SOLR-12021: Fixed a bug in ApiSpec and other JSON resource loading that was causing unclosed file handles (hossman)
+* SOLR-10720: Aggressive removal of a collection breaks cluster status API. (Alexey Serba, shalin)
+
Optimizations
----------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6f2d99e5/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerCollectionMessageHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerCollectionMessageHandler.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerCollectionMessageHandler.java
index 2143d1e..b7cf013e6 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerCollectionMessageHandler.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerCollectionMessageHandler.java
@@ -23,7 +23,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
@@ -373,39 +372,6 @@ public class OverseerCollectionMessageHandler implements OverseerMessageHandler,
}
/**
- * Walks the tree of collection status to verify that any replicas not reporting a "down" status is
- * on a live node, if any replicas reporting their status as "active" but the node is not live is
- * marked as "down"; used by CLUSTERSTATUS.
- * @param liveNodes List of currently live node names.
- * @param collectionProps Map of collection status information pulled directly from ZooKeeper.
- */
-
- @SuppressWarnings("unchecked")
- protected void crossCheckReplicaStateWithLiveNodes(List<String> liveNodes, NamedList<Object> collectionProps) {
- Iterator<Map.Entry<String,Object>> colls = collectionProps.iterator();
- while (colls.hasNext()) {
- Map.Entry<String,Object> next = colls.next();
- Map<String,Object> collMap = (Map<String,Object>)next.getValue();
- Map<String,Object> shards = (Map<String,Object>)collMap.get("shards");
- for (Object nextShard : shards.values()) {
- Map<String,Object> shardMap = (Map<String,Object>)nextShard;
- Map<String,Object> replicas = (Map<String,Object>)shardMap.get("replicas");
- for (Object nextReplica : replicas.values()) {
- Map<String,Object> replicaMap = (Map<String,Object>)nextReplica;
- if (Replica.State.getState((String) replicaMap.get(ZkStateReader.STATE_PROP)) != Replica.State.DOWN) {
- // not down, so verify the node is live
- String node_name = (String)replicaMap.get(ZkStateReader.NODE_NAME_PROP);
- if (!liveNodes.contains(node_name)) {
- // node is not live, so this replica is actually down
- replicaMap.put(ZkStateReader.STATE_PROP, Replica.State.DOWN.toString());
- }
- }
- }
- }
- }
- }
-
- /**
* Get collection status from cluster state.
* Can return collection status by given shard name.
*
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6f2d99e5/solr/core/src/java/org/apache/solr/handler/admin/ClusterStatus.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ClusterStatus.java b/solr/core/src/java/org/apache/solr/handler/admin/ClusterStatus.java
index 0f15954..9ebac77 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ClusterStatus.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ClusterStatus.java
@@ -17,6 +17,7 @@
package org.apache.solr.handler.admin;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -53,7 +54,7 @@ public class ClusterStatus {
}
@SuppressWarnings("unchecked")
- public void getClusterStatus(NamedList results)
+ public void getClusterStatus(NamedList results)
throws KeeperException, InterruptedException {
// read aliases
Aliases aliases = zkStateReader.getAliases();
@@ -116,9 +117,7 @@ public class ClusterStatus {
}
if (shard != null) {
String[] paramShards = shard.split(",");
- for(String paramShard : paramShards){
- requestedShards.add(paramShard);
- }
+ requestedShards.addAll(Arrays.asList(paramShards));
}
if (clusterStateCollection.getStateFormat() > 1) {
@@ -133,9 +132,16 @@ public class ClusterStatus {
if (collectionVsAliases.containsKey(name) && !collectionVsAliases.get(name).isEmpty()) {
collectionStatus.put("aliases", collectionVsAliases.get(name));
}
- String configName = zkStateReader.readConfigName(name);
- collectionStatus.put("configName", configName);
- collectionProps.add(name, collectionStatus);
+ try {
+ String configName = zkStateReader.readConfigName(name);
+ collectionStatus.put("configName", configName);
+ collectionProps.add(name, collectionStatus);
+ } catch (SolrException e) {
+ if (e.getCause() instanceof KeeperException.NoNodeException) {
+ // skip this collection because the collection's znode has been deleted
+ // which can happen during aggressive collection removal, see SOLR-10720
+ } else throw e;
+ }
}
List<String> liveNodes = zkStateReader.getZkClient().getChildren(ZkStateReader.LIVE_NODES_ZKNODE, null, true);