diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 7831efd011e0..233cdf6561ad 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -20,6 +20,8 @@ Bug Fixes * SOLR-15138: Collection creation for PerReplicaStates does not scale to large collections as well as regular collections (Mike Drob, Ilan Ginzburg, noble, Ishan Chattopadhyaya) +* SOLR-15135: Admin UI display collections with perReplicaState=true in graph view (Timothy Potter) + ================== 8.8.0 ================== Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release. diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java index d6afc61581d6..3396e8bf1820 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java @@ -42,6 +42,8 @@ import org.apache.solr.cloud.ZkController; import org.apache.solr.common.SolrException; import org.apache.solr.common.SolrException.ErrorCode; +import org.apache.solr.common.cloud.ClusterState; +import org.apache.solr.common.cloud.DocCollection; import org.apache.solr.common.cloud.OnReconnect; import org.apache.solr.common.cloud.Replica; import org.apache.solr.common.cloud.SolrZkClient; @@ -661,9 +663,9 @@ boolean printZnode(JSONWriter json, String path) throws IOException { // keep track of how many collections match the filter boolean applyStatusFilter = (page.filterType == FilterType.status && page.filter != null); - List matchesStatusFilter = applyStatusFilter ? new ArrayList() : null; - Set liveNodes = applyStatusFilter ? - zkController.getZkStateReader().getClusterState().getLiveNodes() : null; + List matchesStatusFilter = applyStatusFilter ? new ArrayList<>() : null; + ClusterState cs = zkController.getZkStateReader().getClusterState(); + Set liveNodes = applyStatusFilter ? cs.getLiveNodes() : null; SortedMap collectionStates = new TreeMap(pagingSupport); for (String collection : page.selected) { @@ -680,24 +682,11 @@ boolean printZnode(JSONWriter json, String path) throws IOException { collectionStates.put(collection, ClusterStatus.postProcessCollectionJSON((Map) collectionState)); } } else { - // looks like an external collection ... - String collStatePath = String.format(Locale.ROOT, "/collections/%s/state.json", collection); - String childDataStr = null; - try { - byte[] childData = zkClient.getData(collStatePath, null, null, true); - if (childData != null) - childDataStr = (new BytesRef(childData)).utf8ToString(); - } catch (KeeperException.NoNodeException nne) { - log.warn("State for collection {} not found in /clusterstate.json or /collections/{}/state.json!" - , collection, collection); - } catch (Exception childErr) { - log.error("Failed to get {} due to", collStatePath, childErr); - } - - if (childDataStr != null) { - Map extColl = (Map) Utils.fromJSONString(childDataStr); - collectionState = extColl.get(collection); - + // looks like an external collection ... just use DocCollection instead of reading ZK data directly to work with per replica states + DocCollection dc = cs.getCollectionOrNull(collection); + if (dc != null) { + // TODO: for collections with perReplicaState, a ser/deser to JSON was needed to get the state to render correctly for the UI? + collectionState = dc.isPerReplicaState() ? Utils.fromJSONString(Utils.toJSONString(dc)) : dc.getProperties(); if (applyStatusFilter) { // verify this collection matches the filtered state if (page.matchesStatusFilter((Map) collectionState, liveNodes)) {