Skip to content

Commit

Permalink
SOLR-15135: Use DocCollection to generate state.json format expected …
Browse files Browse the repository at this point in the history
…by UI to work with perReplicaState collections (backport to 8x) (apache#2384) (apache#2385)
  • Loading branch information
thelabdude authored Feb 16, 2021
1 parent b31c117 commit 64f3b49
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 21 deletions.
2 changes: 2 additions & 0 deletions solr/CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<String> matchesStatusFilter = applyStatusFilter ? new ArrayList<String>() : null;
Set<String> liveNodes = applyStatusFilter ?
zkController.getZkStateReader().getClusterState().getLiveNodes() : null;
List<String> matchesStatusFilter = applyStatusFilter ? new ArrayList<>() : null;
ClusterState cs = zkController.getZkStateReader().getClusterState();
Set<String> liveNodes = applyStatusFilter ? cs.getLiveNodes() : null;

SortedMap<String, Object> collectionStates = new TreeMap<String, Object>(pagingSupport);
for (String collection : page.selected) {
Expand All @@ -680,24 +682,11 @@ boolean printZnode(JSONWriter json, String path) throws IOException {
collectionStates.put(collection, ClusterStatus.postProcessCollectionJSON((Map<String, Object>) 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<String, Object> extColl = (Map<String, Object>) 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<String, Object>) collectionState, liveNodes)) {
Expand Down

0 comments on commit 64f3b49

Please sign in to comment.