Skip to content

Commit 71feb02

Browse files
committed
Migrate business logic into NodeHealthAPI, and fix enum issue
1 parent 1452364 commit 71feb02

File tree

3 files changed

+18
-74
lines changed

3 files changed

+18
-74
lines changed

solr/core/src/java/org/apache/solr/handler/admin/HealthCheckHandler.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
import org.apache.solr.api.Api;
2424
import org.apache.solr.api.JerseyResource;
2525
import org.apache.solr.client.solrj.request.HealthCheckRequest;
26-
import org.apache.solr.cloud.CloudDescriptor;
27-
import org.apache.solr.common.cloud.ClusterState;
2826
import org.apache.solr.common.util.NamedList;
2927
import org.apache.solr.core.CoreContainer;
3028
import org.apache.solr.handler.RequestHandlerBase;
@@ -92,17 +90,6 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw
9290
new NodeHealthAPI(coreContainer).checkNodeHealth(requireHealthyCores, maxGenerationLag));
9391
}
9492

95-
/**
96-
* Find replicas DOWN or RECOVERING, or replicas in clusterstate that do not exist on local node.
97-
*
98-
* @deprecated Use {@link NodeHealthAPI#findUnhealthyCores(Collection, ClusterState)} instead.
99-
*/
100-
@Deprecated
101-
public static int findUnhealthyCores(
102-
Collection<CloudDescriptor> cores, ClusterState clusterState) {
103-
return NodeHealthAPI.findUnhealthyCores(cores, clusterState);
104-
}
105-
10693
@Override
10794
public String getDescription() {
10895
return "Health check handler for SolrCloud node";

solr/core/src/java/org/apache/solr/handler/admin/api/NodeHealthAPI.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.apache.solr.common.cloud.ZkStateReader;
4444
import org.apache.solr.common.util.NamedList;
4545
import org.apache.solr.core.CoreContainer;
46+
import org.apache.solr.core.CoreDescriptor;
4647
import org.apache.solr.core.SolrCore;
4748
import org.apache.solr.handler.IndexFetcher;
4849
import org.apache.solr.handler.ReplicationHandler;
@@ -108,24 +109,15 @@ public NodeHealthResponse checkNodeHealth(Boolean requireHealthyCores, Integer m
108109
}
109110

110111
private void healthCheckCloudMode(NodeHealthResponse response, Boolean requireHealthyCores) {
111-
ZkStateReader zkStateReader = coreContainer.getZkController().getZkStateReader();
112-
ClusterState clusterState = zkStateReader.getClusterState();
113-
114-
if (zkStateReader.getZkClient().isClosed() || !zkStateReader.getZkClient().isConnected()) {
115-
throw new SolrException(SERVICE_UNAVAILABLE, "Host Unavailable: Not connected to zk");
116-
}
117-
118-
if (!clusterState.getLiveNodes().contains(coreContainer.getZkController().getNodeName())) {
119-
throw new SolrException(SERVICE_UNAVAILABLE, "Host Unavailable: Not in live nodes as per zk");
120-
}
112+
ClusterState clusterState = getClusterState();
121113

122114
if (Boolean.TRUE.equals(requireHealthyCores)) {
123115
if (!coreContainer.isStatusLoadComplete()) {
124116
throw new SolrException(SERVICE_UNAVAILABLE, "Host Unavailable: Core Loading not complete");
125117
}
126118
Collection<CloudDescriptor> coreDescriptors =
127119
coreContainer.getCoreDescriptors().stream()
128-
.map(cd -> cd.getCloudDescriptor())
120+
.map(CoreDescriptor::getCloudDescriptor)
129121
.collect(Collectors.toList());
130122
int unhealthyCores = findUnhealthyCores(coreDescriptors, clusterState);
131123
if (unhealthyCores > 0) {
@@ -143,6 +135,20 @@ private void healthCheckCloudMode(NodeHealthResponse response, Boolean requireHe
143135
response.status = OK;
144136
}
145137

138+
private ClusterState getClusterState() {
139+
ZkStateReader zkStateReader = coreContainer.getZkController().getZkStateReader();
140+
ClusterState clusterState = zkStateReader.getClusterState();
141+
142+
if (zkStateReader.getZkClient().isClosed() || !zkStateReader.getZkClient().isConnected()) {
143+
throw new SolrException(SERVICE_UNAVAILABLE, "Host Unavailable: Not connected to zk");
144+
}
145+
146+
if (!clusterState.getLiveNodes().contains(coreContainer.getZkController().getNodeName())) {
147+
throw new SolrException(SERVICE_UNAVAILABLE, "Host Unavailable: Not in live nodes as per zk");
148+
}
149+
return clusterState;
150+
}
151+
146152
private void healthCheckLegacyMode(NodeHealthResponse response, Integer maxGenerationLag) {
147153
List<String> laggingCoresInfo = new ArrayList<>();
148154
boolean allCoresAreInSync = true;

solr/core/src/test/org/apache/solr/handler/admin/HealthCheckHandlerTest.java

Lines changed: 1 addition & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,15 @@
2323
import java.util.Arrays;
2424
import java.util.Collection;
2525
import java.util.Properties;
26-
import org.apache.solr.client.api.model.NodeHealthResponse;
2726
import org.apache.solr.client.solrj.RemoteSolrException;
2827
import org.apache.solr.client.solrj.SolrClient;
2928
import org.apache.solr.client.solrj.SolrRequest;
3029
import org.apache.solr.client.solrj.SolrServerException;
3130
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
3231
import org.apache.solr.client.solrj.request.GenericSolrRequest;
3332
import org.apache.solr.client.solrj.request.HealthCheckRequest;
34-
import org.apache.solr.client.solrj.request.V2Request;
3533
import org.apache.solr.client.solrj.response.CollectionAdminResponse;
3634
import org.apache.solr.client.solrj.response.HealthCheckResponse;
37-
import org.apache.solr.client.solrj.response.V2Response;
3835
import org.apache.solr.cloud.CloudDescriptor;
3936
import org.apache.solr.cloud.ClusterStateMockUtil;
4037
import org.apache.solr.cloud.SolrCloudTestCase;
@@ -106,11 +103,7 @@ public void testHealthCheckHandler() throws Exception {
106103

107104
// negative check of our (new) "broken" node that we deliberately put into an unhealthy state
108105
RemoteSolrException e =
109-
expectThrows(
110-
RemoteSolrException.class,
111-
() -> {
112-
runHealthcheckWithClient(solrClient);
113-
});
106+
expectThrows(RemoteSolrException.class, () -> runHealthcheckWithClient(solrClient));
114107
assertTrue(e.getMessage(), e.getMessage().contains("Host Unavailable"));
115108
assertEquals(SolrException.ErrorCode.SERVICE_UNAVAILABLE.code, e.code());
116109
} finally {
@@ -137,48 +130,6 @@ public void testHealthCheckHandlerSolrJ() throws IOException, SolrServerExceptio
137130
}
138131
}
139132

140-
@Test
141-
public void testHealthCheckV2Api() throws Exception {
142-
V2Response res = new V2Request.Builder("/node/health").build().process(cluster.getSolrClient());
143-
assertEquals(0, res.getStatus());
144-
var b = res.getResponse().get(CommonParams.STATUS);
145-
var c = NodeHealthResponse.NodeStatus.OK;
146-
// assertEquals(c, b);
147-
assertTrue(b.toString().contains(("OK")));
148-
149-
// add a new node for the purpose of negative testing
150-
JettySolrRunner newJetty = cluster.startJettySolrRunner();
151-
try (SolrClient solrClient = getHttpSolrClient(newJetty.getBaseUrl().toString())) {
152-
153-
// positive check that our (new) "healthy" node works with direct http client
154-
var d =
155-
new V2Request.Builder("/node/health")
156-
.build()
157-
.process(solrClient)
158-
.getResponse()
159-
.get(CommonParams.STATUS);
160-
// assertEquals(
161-
// NodeHealthResponse.NodeStatus.OK,
162-
// );
163-
assertTrue(d.toString().contains(("OK")));
164-
165-
// now "break" our (new) node
166-
newJetty.getCoreContainer().getZkController().getZkClient().close();
167-
168-
// negative check of our (new) "broken" node that we deliberately put into an unhealthy state
169-
RemoteSolrException e =
170-
expectThrows(
171-
RemoteSolrException.class,
172-
() -> {
173-
new V2Request.Builder("/node/health").build().process(solrClient);
174-
});
175-
assertTrue(e.getMessage(), e.getMessage().contains("Host Unavailable"));
176-
assertEquals(SolrException.ErrorCode.SERVICE_UNAVAILABLE.code, e.code());
177-
} finally {
178-
newJetty.stop();
179-
}
180-
}
181-
182133
@Test
183134
public void testFindUnhealthyCores() {
184135
// Simulate two nodes, with two collections:

0 commit comments

Comments
 (0)