SOLR-6069: The 'clusterstatus' API should return 'roles' information

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1606034 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Shalin Shekhar Mangar 2014-06-27 11:29:14 +00:00
parent dd0f5fc9c1
commit 70709b224a
3 changed files with 49 additions and 2 deletions

View File

@ -94,6 +94,8 @@ New Features
* SOLR-6196: The overseerstatus collection API instruments amILeader and ZK state update calls.
(shalin)
* SOLR-6069: The 'clusterstatus' API should return 'roles' information. (shalin)
Bug Fixes
----------------------

View File

@ -668,7 +668,7 @@ public class OverseerCollectionProcessor implements Runnable, ClosableThread {
}
private void getClusterStatus(ClusterState clusterState, ZkNodeProps message, NamedList results) {
private void getClusterStatus(ClusterState clusterState, ZkNodeProps message, NamedList results) throws KeeperException, InterruptedException {
String collection = message.getStr(ZkStateReader.COLLECTION_PROP);
// read aliases
@ -692,6 +692,11 @@ public class OverseerCollectionProcessor implements Runnable, ClosableThread {
}
}
Map roles = null;
if(zkStateReader.getZkClient().exists(ZkStateReader.ROLES, true)){
roles = (Map) ZkStateReader.fromJSON(zkStateReader.getZkClient().getData(ZkStateReader.ROLES, null, null, true));
}
// convert cluster state into a map of writable types
byte[] bytes = ZkStateReader.toJSON(clusterState);
Map<String, Object> stateMap = (Map<String, Object>) ZkStateReader.fromJSON(bytes);
@ -753,6 +758,11 @@ public class OverseerCollectionProcessor implements Runnable, ClosableThread {
clusterStatus.add("aliases", aliasVsCollections);
}
// add the roles map
if (roles != null) {
clusterStatus.add("roles", roles);
}
results.add("cluster", clusterStatus);
}

View File

@ -24,6 +24,7 @@ import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.cloud.Replica;
import org.apache.solr.common.params.CollectionParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.ShardParams;
@ -74,6 +75,7 @@ public class TestCollectionAPI extends AbstractFullDistribZkTestBase {
clusterStatusWithCollectionAndShard();
clusterStatusWithRouteKey();
clusterStatusAliasTest();
clusterStatusRolesTest();
}
private void clusterStatusWithCollectionAndShard() throws IOException, SolrServerException {
@ -239,7 +241,40 @@ public class TestCollectionAPI extends AbstractFullDistribZkTestBase {
List<String> collAlias = (List<String>) collection.get("aliases");
assertEquals("Aliases not found", Lists.newArrayList("myalias"), collAlias);
} finally {
//remove collections
client.shutdown();
}
}
private void clusterStatusRolesTest() throws Exception {
CloudSolrServer client = createCloudClient(null);
try {
client.connect();
Replica replica = client.getZkStateReader().getLeaderRetry(DEFAULT_COLLECTION, SHARD1);
ModifiableSolrParams params = new ModifiableSolrParams();
params.set("action", CollectionParams.CollectionAction.ADDROLE.toString());
params.set("node", replica.getNodeName());
params.set("role", "overseer");
SolrRequest request = new QueryRequest(params);
request.setPath("/admin/collections");
client.request(request);
params = new ModifiableSolrParams();
params.set("action", CollectionParams.CollectionAction.CLUSTERSTATUS.toString());
params.set("collection", DEFAULT_COLLECTION);
request = new QueryRequest(params);
request.setPath("/admin/collections");
NamedList<Object> rsp = client.request(request);
NamedList<Object> cluster = (NamedList<Object>) rsp.get("cluster");
assertNotNull("Cluster state should not be null", cluster);
Map<String, Object> roles = (Map<String, Object>) cluster.get("roles");
assertNotNull("Role information should not be null", roles);
List<String> overseer = (List<String>) roles.get("overseer");
assertNotNull(overseer);
assertEquals(1, overseer.size());
assertTrue(overseer.contains(replica.getNodeName()));
} finally {
client.shutdown();
}
}