diff --git a/docs/operations/api-reference.md b/docs/operations/api-reference.md index fe6813d7c49b..25bf9548279b 100644 --- a/docs/operations/api-reference.md +++ b/docs/operations/api-reference.md @@ -752,7 +752,11 @@ Returns segment information lists including server locations for the given datas * `/druid/broker/v1/loadstatus` -Returns a flag indicating if the Broker knows about all segments in Zookeeper. This can be used to know when a Broker process is ready to be queried after a restart. +Returns a flag indicating if the Broker knows about all segments in the cluster. This can be used to know when a Broker process is ready to be queried after a restart. + +* `/druid/broker/v1/readiness` + +Similar to `/druid/broker/v1/loadstatus`, but instead of returning a JSON, responses 200 OK if its ready and otherwise 503 SERVICE UNAVAILABLE. #### Queries diff --git a/server/src/main/java/org/apache/druid/server/http/BrokerResource.java b/server/src/main/java/org/apache/druid/server/http/BrokerResource.java index ddbe19e0bcf0..e50b04edf8f0 100644 --- a/server/src/main/java/org/apache/druid/server/http/BrokerResource.java +++ b/server/src/main/java/org/apache/druid/server/http/BrokerResource.java @@ -32,7 +32,6 @@ import javax.ws.rs.core.Response; @Path("/druid/broker/v1") -@ResourceFilters(StateResourceFilter.class) public class BrokerResource { private final BrokerServerView brokerServerView; @@ -45,9 +44,21 @@ public BrokerResource(BrokerServerView brokerServerView) @GET @Path("/loadstatus") + @ResourceFilters(StateResourceFilter.class) @Produces(MediaType.APPLICATION_JSON) public Response getLoadStatus() { return Response.ok(ImmutableMap.of("inventoryInitialized", brokerServerView.isInitialized())).build(); } + + @GET + @Path("/readiness") + public Response getReadiness() + { + if (brokerServerView.isInitialized()) { + return Response.ok().build(); + } else { + return Response.status(Response.Status.SERVICE_UNAVAILABLE).build(); + } + } } diff --git a/server/src/main/java/org/apache/druid/server/http/HistoricalResource.java b/server/src/main/java/org/apache/druid/server/http/HistoricalResource.java index dcaa434696ea..c338854dca20 100644 --- a/server/src/main/java/org/apache/druid/server/http/HistoricalResource.java +++ b/server/src/main/java/org/apache/druid/server/http/HistoricalResource.java @@ -32,7 +32,6 @@ import javax.ws.rs.core.Response; @Path("/druid/historical/v1") -@ResourceFilters(StateResourceFilter.class) public class HistoricalResource { private final ZkCoordinator coordinator; @@ -47,6 +46,7 @@ public HistoricalResource( @GET @Path("/loadstatus") + @ResourceFilters(StateResourceFilter.class) @Produces(MediaType.APPLICATION_JSON) public Response getLoadStatus() { diff --git a/services/src/main/java/org/apache/druid/cli/QueryJettyServerInitializer.java b/services/src/main/java/org/apache/druid/cli/QueryJettyServerInitializer.java index 9282ca3d1f0d..431b3a0a26ed 100644 --- a/services/src/main/java/org/apache/druid/cli/QueryJettyServerInitializer.java +++ b/services/src/main/java/org/apache/druid/cli/QueryJettyServerInitializer.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; @@ -45,16 +46,20 @@ import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; -import java.util.Collections; import java.util.List; import java.util.Set; /** + * */ public class QueryJettyServerInitializer implements JettyServerInitializer { private static final Logger log = new Logger(QueryJettyServerInitializer.class); - private static List UNSECURED_PATHS = Collections.singletonList("/status/health"); + private static List UNSECURED_PATHS = Lists.newArrayList( + "/status/health", + "/druid/historical/v1/readiness", + "/druid/broker/v1/readiness" + ); private final List extensionHandlers;