Skip to content

Instantly share code, notes, and snippets.

@markrmiller
Created February 29, 2024 22:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save markrmiller/66c93e157e64561b335a207aaec6e4cb to your computer and use it in GitHub Desktop.
Save markrmiller/66c93e157e64561b335a207aaec6e4cb to your computer and use it in GitHub Desktop.
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.client.solrj.response.CollectionAdminResponse;
import org.apache.solr.common.cloud.*;
import org.apache.solr.common.util.NamedList;
import org.apache.zookeeper.KeeperException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class SolrCoreReloader {
public static void main(String[] args) {
try (SolrZkClient zkClient = new SolrZkClient.Builder().withUrl(args[0]).build()) {
ZkStateReader zkStateReader = new ZkStateReader(zkClient);
List<String> solrCoreUrls = fetchSolrCoreUrls(zkStateReader, args[1]);
reloadSolrCores(solrCoreUrls).join();
System.out.println("All cores reloaded.");
} catch (Exception e) {
e.printStackTrace();
}
}
private static List<String> fetchSolrCoreUrls(ZkStateReader zkStateReader, String collectionName) throws KeeperException, InterruptedException, IOException {
List<String> solrCoreUrls = new ArrayList<>();
zkStateReader.createClusterStateWatchersAndUpdate();
Map<String, ClusterState.CollectionRef> collectionStates = zkStateReader.getClusterState().getCollectionStates();
if (collectionStates.containsKey(collectionName)) {
ClusterState.CollectionRef collectionState = collectionStates.get(collectionName);
Collection<Slice> slices = collectionState.get().getSlices();
for (Slice slice : slices) {
Collection<Replica> replicas = slice.getReplicas();
for (Replica replica : replicas) {
String coreUrl = replica.getBaseUrl() + "/admin/cores?action=RELOAD&core=" + replica.get("core");
System.out.println("Core URL: " + coreUrl);
solrCoreUrls.add(coreUrl);
}
}
}
return solrCoreUrls;
}
private static CompletableFuture<Void> reloadSolrCores(List<String> solrCoreUrls) {
HttpClient client = HttpClient.newHttpClient();
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (String url : solrCoreUrls) {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.GET()
.build();
CompletableFuture<Void> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(body -> System.out.println("Reloaded core: " + url + " Response: " + body))
.exceptionally(e -> {
System.err.println("Failed to reload core: " + url + " Error: " + e.getMessage());
return null;
});
futures.add(future);
}
return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment