This is an automated email from the ASF dual-hosted git repository.

jonwei pushed a commit to branch 0.17.0-incubating
in repository https://gitbox.apache.org/repos/asf/incubator-druid.git


The following commit(s) were added to refs/heads/0.17.0-incubating by this push:
     new 6402fd0  Fix broken master (#9005) (#9023)
6402fd0 is described below

commit 6402fd01f861026aeac18e2739a145ed0af8e761
Author: Jihoon Son <jihoon...@apache.org>
AuthorDate: Thu Dec 12 20:02:08 2019 -0800

    Fix broken master (#9005) (#9023)
    
    * Multibinding for NodeRole
    
    * Fix endpoints
    
    * fix doc
    
    * fix test
---
 docs/operations/api-reference.md                   |  4 +-
 .../druid/server/http/SelfDiscoveryResource.java   | 57 +++++++++++++---------
 .../http/security/SecurityResourceFilterTest.java  |  5 +-
 .../main/java/org/apache/druid/cli/CliBroker.java  |  5 +-
 .../java/org/apache/druid/cli/CliCoordinator.java  |  5 +-
 .../java/org/apache/druid/cli/CliHistorical.java   |  5 +-
 .../main/java/org/apache/druid/cli/CliIndexer.java |  2 +-
 .../org/apache/druid/cli/CliMiddleManager.java     |  4 +-
 .../java/org/apache/druid/cli/CliOverlord.java     |  5 +-
 .../main/java/org/apache/druid/cli/CliRouter.java  |  7 +--
 .../java/org/apache/druid/cli/ServerRunnable.java  | 33 ++++++++++++-
 11 files changed, 77 insertions(+), 55 deletions(-)

diff --git a/docs/operations/api-reference.md b/docs/operations/api-reference.md
index c184e8d..085a571 100644
--- a/docs/operations/api-reference.md
+++ b/docs/operations/api-reference.md
@@ -45,7 +45,7 @@ An endpoint that always returns a boolean "true" value with a 
200 OK response, u
 
 Returns the current configuration properties of the process.
 
-* `/status/selfDiscoveredStatus`
+* `/status/selfDiscovered/status`
 
 Returns a JSON map of the form `{"selfDiscovered": true/false}`, indicating 
whether the node has received a confirmation
 from the central node discovery mechanism (currently ZooKeeper) of the Druid 
cluster that the node has been added to the
@@ -60,7 +60,7 @@ nodes will be discovered by this node timely from this point.
 
 * `/status/selfDiscovered`
 
-Similar to `/status/selfDiscoveredStatus`, but returns 200 OK response with 
empty body if the node has discovered itself
+Similar to `/status/selfDiscovered/status`, but returns 200 OK response with 
empty body if the node has discovered itself
 and 503 SERVICE UNAVAILABLE if the node hasn't discovered itself yet. This 
endpoint might be useful because some
 monitoring checks such as AWS load balancer health checks are not able to look 
at the response body.
 
diff --git 
a/server/src/main/java/org/apache/druid/server/http/SelfDiscoveryResource.java 
b/server/src/main/java/org/apache/druid/server/http/SelfDiscoveryResource.java
index 46d04a9..13b7bde 100644
--- 
a/server/src/main/java/org/apache/druid/server/http/SelfDiscoveryResource.java
+++ 
b/server/src/main/java/org/apache/druid/server/http/SelfDiscoveryResource.java
@@ -19,6 +19,7 @@
 
 package org.apache.druid.server.http;
 
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.sun.jersey.spi.container.ResourceFilters;
@@ -36,6 +37,8 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.util.Collections;
+import java.util.List;
+import java.util.Set;
 import java.util.function.BooleanSupplier;
 
 /**
@@ -44,58 +47,68 @@ import java.util.function.BooleanSupplier;
  * DI configuration phase.
  */
 @Singleton
+@Path("/status/selfDiscovered")
 public class SelfDiscoveryResource
 {
-  private BooleanSupplier selfDiscovered;
+  private final List<BooleanSupplier> selfDiscoveredRoles;
 
   @Inject
   public SelfDiscoveryResource(
       @Self DruidNode thisDruidNode,
-      @Self NodeRole thisNodeRole,
+      @Self Set<NodeRole> thisNodeRoles,
       DruidNodeDiscoveryProvider nodeDiscoveryProvider,
       Lifecycle lifecycle
   )
   {
-    Lifecycle.Handler selfDiscoveryListenerRegistrator = new 
Lifecycle.Handler()
-    {
-      @Override
-      public void start()
-      {
-        selfDiscovered = nodeDiscoveryProvider.getForNode(thisDruidNode, 
thisNodeRole);
-      }
+    selfDiscoveredRoles = 
Lists.newArrayListWithExpectedSize(thisNodeRoles.size());
+    thisNodeRoles.forEach(
+        thisNodeRole -> {
+          Lifecycle.Handler selfDiscoveryListenerRegistrator = new 
Lifecycle.Handler()
+          {
+            @Override
+            public void start()
+            {
+              
selfDiscoveredRoles.add(nodeDiscoveryProvider.getForNode(thisDruidNode, 
thisNodeRole));
+            }
 
-      @Override
-      public void stop()
-      {
-        // do nothing
-      }
-    };
-    // Using Lifecycle.Stage.SERVER because DruidNodeDiscoveryProvider should 
be already started when
-    // selfDiscoveryListenerRegistrator.start() is called.
-    lifecycle.addHandler(selfDiscoveryListenerRegistrator, 
Lifecycle.Stage.SERVER);
+            @Override
+            public void stop()
+            {
+              // do nothing
+            }
+          };
+          // Using Lifecycle.Stage.SERVER because DruidNodeDiscoveryProvider 
should be already started when
+          // selfDiscoveryListenerRegistrator.start() is called.
+          lifecycle.addHandler(selfDiscoveryListenerRegistrator, 
Lifecycle.Stage.SERVER);
+        }
+    );
   }
 
   /** See the description of this endpoint in api-reference.md. */
   @GET
-  @Path("/status/selfDiscoveredStatus")
+  @Path("/status")
   @Produces(MediaType.APPLICATION_JSON)
   @ResourceFilters(StateResourceFilter.class)
   public Response getSelfDiscoveredStatus()
   {
-    return Response.ok(Collections.singletonMap("selfDiscovered", 
selfDiscovered.getAsBoolean())).build();
+    return Response.ok(Collections.singletonMap("selfDiscovered", 
isDiscoveredAllRoles())).build();
   }
 
   /** See the description of this endpoint in api-reference.md. */
   @GET
-  @Path("/status/selfDiscovered")
   @Produces(MediaType.APPLICATION_JSON)
   @ResourceFilters(StateResourceFilter.class)
   public Response getSelfDiscovered()
   {
-    if (selfDiscovered.getAsBoolean()) {
+    if (isDiscoveredAllRoles()) {
       return Response.ok().build();
     } else {
       return Response.status(HttpStatus.SERVICE_UNAVAILABLE_503).build();
     }
   }
+
+  private boolean isDiscoveredAllRoles()
+  {
+    return 
selfDiscoveredRoles.stream().allMatch(BooleanSupplier::getAsBoolean);
+  }
 }
diff --git 
a/server/src/test/java/org/apache/druid/server/http/security/SecurityResourceFilterTest.java
 
b/server/src/test/java/org/apache/druid/server/http/security/SecurityResourceFilterTest.java
index 344396c..e0a5ba1 100644
--- 
a/server/src/test/java/org/apache/druid/server/http/security/SecurityResourceFilterTest.java
+++ 
b/server/src/test/java/org/apache/druid/server/http/security/SecurityResourceFilterTest.java
@@ -53,7 +53,7 @@ import java.util.Collection;
 public class SecurityResourceFilterTest extends ResourceFilterTestHelper
 {
   @Parameterized.Parameters(name = "{index}: requestPath={0}, 
requestMethod={1}, resourceFilter={2}")
-  public static Collection<Object[]> data() throws NoSuchMethodException
+  public static Collection<Object[]> data()
   {
     return ImmutableList.copyOf(
         Iterables.concat(
@@ -70,8 +70,7 @@ public class SecurityResourceFilterTest extends 
ResourceFilterTestHelper
             
getRequestPathsWithAuthorizer(CoordinatorDynamicConfigsResource.class),
             getRequestPathsWithAuthorizer(QueryResource.class),
             getRequestPathsWithAuthorizer(StatusResource.class),
-            
getRequestPathsWithAuthorizer(SelfDiscoveryResource.class.getDeclaredMethod("getSelfDiscoveredStatus")),
-            
getRequestPathsWithAuthorizer(SelfDiscoveryResource.class.getDeclaredMethod("getSelfDiscovered")),
+            getRequestPathsWithAuthorizer(SelfDiscoveryResource.class),
             getRequestPathsWithAuthorizer(BrokerQueryResource.class),
             getRequestPathsWithAuthorizer(RouterResource.class)
         )
diff --git a/services/src/main/java/org/apache/druid/cli/CliBroker.java 
b/services/src/main/java/org/apache/druid/cli/CliBroker.java
index 45864f4..aaf46b9 100644
--- a/services/src/main/java/org/apache/druid/cli/CliBroker.java
+++ b/services/src/main/java/org/apache/druid/cli/CliBroker.java
@@ -43,7 +43,6 @@ import org.apache.druid.guice.LazySingleton;
 import org.apache.druid.guice.LifecycleModule;
 import org.apache.druid.guice.QueryRunnerFactoryModule;
 import org.apache.druid.guice.QueryableModule;
-import org.apache.druid.guice.annotations.Self;
 import org.apache.druid.java.util.common.logger.Logger;
 import org.apache.druid.query.QuerySegmentWalker;
 import org.apache.druid.query.RetryQueryRunnerConfig;
@@ -123,9 +122,7 @@ public class CliBroker extends ServerRunnable
 
           LifecycleModule.register(binder, Server.class);
 
-          
binder.bind(NodeRole.class).annotatedWith(Self.class).toInstance(NodeRole.BROKER);
-
-          bindAnnouncer(
+          bindNodeRoleAndAnnouncer(
               binder,
               DiscoverySideEffectsProvider
                   .builder(NodeRole.BROKER)
diff --git a/services/src/main/java/org/apache/druid/cli/CliCoordinator.java 
b/services/src/main/java/org/apache/druid/cli/CliCoordinator.java
index bfe5ef7..6e4c27f 100644
--- a/services/src/main/java/org/apache/druid/cli/CliCoordinator.java
+++ b/services/src/main/java/org/apache/druid/cli/CliCoordinator.java
@@ -46,7 +46,6 @@ import org.apache.druid.guice.LifecycleModule;
 import org.apache.druid.guice.ManageLifecycle;
 import org.apache.druid.guice.annotations.CoordinatorIndexingServiceHelper;
 import org.apache.druid.guice.annotations.EscalatedGlobal;
-import org.apache.druid.guice.annotations.Self;
 import org.apache.druid.guice.http.JettyHttpClientModule;
 import org.apache.druid.java.util.common.concurrent.Execs;
 import org.apache.druid.java.util.common.concurrent.ExecutorServices;
@@ -239,9 +238,7 @@ public class CliCoordinator extends ServerRunnable
                 DruidCoordinatorCleanupPendingSegments.class
             );
 
-            
binder.bind(NodeRole.class).annotatedWith(Self.class).toInstance(NodeRole.COORDINATOR);
-
-            bindAnnouncer(
+            bindNodeRoleAndAnnouncer(
                 binder,
                 Coordinator.class,
                 
DiscoverySideEffectsProvider.builder(NodeRole.COORDINATOR).build()
diff --git a/services/src/main/java/org/apache/druid/cli/CliHistorical.java 
b/services/src/main/java/org/apache/druid/cli/CliHistorical.java
index c1bc8ba..b700d82 100644
--- a/services/src/main/java/org/apache/druid/cli/CliHistorical.java
+++ b/services/src/main/java/org/apache/druid/cli/CliHistorical.java
@@ -38,7 +38,6 @@ import org.apache.druid.guice.ManageLifecycle;
 import org.apache.druid.guice.QueryRunnerFactoryModule;
 import org.apache.druid.guice.QueryableModule;
 import org.apache.druid.guice.ServerTypeConfig;
-import org.apache.druid.guice.annotations.Self;
 import org.apache.druid.java.util.common.logger.Logger;
 import org.apache.druid.query.QuerySegmentWalker;
 import org.apache.druid.query.lookup.LookupModule;
@@ -104,9 +103,7 @@ public class CliHistorical extends ServerRunnable
           JsonConfigProvider.bind(binder, "druid.historical.cache", 
CacheConfig.class);
           binder.install(new CacheModule());
 
-          
binder.bind(NodeRole.class).annotatedWith(Self.class).toInstance(NodeRole.HISTORICAL);
-
-          bindAnnouncer(
+          bindNodeRoleAndAnnouncer(
               binder,
               DiscoverySideEffectsProvider
                   .builder(NodeRole.HISTORICAL)
diff --git a/services/src/main/java/org/apache/druid/cli/CliIndexer.java 
b/services/src/main/java/org/apache/druid/cli/CliIndexer.java
index 6e51c45..5ffd2a8 100644
--- a/services/src/main/java/org/apache/druid/cli/CliIndexer.java
+++ b/services/src/main/java/org/apache/druid/cli/CliIndexer.java
@@ -149,7 +149,7 @@ public class CliIndexer extends ServerRunnable
 
             
binder.bind(SegmentLoadDropHandler.class).toProvider(Providers.of(null));
 
-            bindAnnouncer(
+            bindNodeRoleAndAnnouncer(
                 binder,
                 DiscoverySideEffectsProvider
                     .builder(NodeRole.INDEXER)
diff --git a/services/src/main/java/org/apache/druid/cli/CliMiddleManager.java 
b/services/src/main/java/org/apache/druid/cli/CliMiddleManager.java
index b6ce582..0eeb548 100644
--- a/services/src/main/java/org/apache/druid/cli/CliMiddleManager.java
+++ b/services/src/main/java/org/apache/druid/cli/CliMiddleManager.java
@@ -141,9 +141,7 @@ public class CliMiddleManager extends ServerRunnable
 
             LifecycleModule.register(binder, Server.class);
 
-            
binder.bind(NodeRole.class).annotatedWith(Self.class).toInstance(NodeRole.MIDDLE_MANAGER);
-
-            bindAnnouncer(
+            bindNodeRoleAndAnnouncer(
                 binder,
                 DiscoverySideEffectsProvider
                     .builder(NodeRole.MIDDLE_MANAGER)
diff --git a/services/src/main/java/org/apache/druid/cli/CliOverlord.java 
b/services/src/main/java/org/apache/druid/cli/CliOverlord.java
index 6e00ba9..f84a5e1 100644
--- a/services/src/main/java/org/apache/druid/cli/CliOverlord.java
+++ b/services/src/main/java/org/apache/druid/cli/CliOverlord.java
@@ -52,7 +52,6 @@ import org.apache.druid.guice.ListProvider;
 import org.apache.druid.guice.ManageLifecycle;
 import org.apache.druid.guice.PolyBind;
 import org.apache.druid.guice.annotations.Json;
-import org.apache.druid.guice.annotations.Self;
 import org.apache.druid.indexing.common.actions.LocalTaskActionClientFactory;
 import org.apache.druid.indexing.common.actions.TaskActionClientFactory;
 import org.apache.druid.indexing.common.actions.TaskActionToolbox;
@@ -248,9 +247,7 @@ public class CliOverlord extends ServerRunnable
               LifecycleModule.register(binder, Server.class);
             }
 
-            
binder.bind(NodeRole.class).annotatedWith(Self.class).toInstance(NodeRole.OVERLORD);
-
-            bindAnnouncer(
+            bindNodeRoleAndAnnouncer(
                 binder,
                 IndexingService.class,
                 DiscoverySideEffectsProvider.builder(NodeRole.OVERLORD).build()
diff --git a/services/src/main/java/org/apache/druid/cli/CliRouter.java 
b/services/src/main/java/org/apache/druid/cli/CliRouter.java
index d945222..21ab630 100644
--- a/services/src/main/java/org/apache/druid/cli/CliRouter.java
+++ b/services/src/main/java/org/apache/druid/cli/CliRouter.java
@@ -109,12 +109,7 @@ public class CliRouter extends ServerRunnable
           LifecycleModule.register(binder, Server.class);
           DiscoveryModule.register(binder, Self.class);
 
-          
binder.bind(NodeRole.class).annotatedWith(Self.class).toInstance(NodeRole.ROUTER);
-
-          bindAnnouncer(
-              binder,
-              DiscoverySideEffectsProvider.builder(NodeRole.ROUTER).build()
-          );
+          bindNodeRoleAndAnnouncer(binder, 
DiscoverySideEffectsProvider.builder(NodeRole.ROUTER).build());
 
           Jerseys.addResource(binder, SelfDiscoveryResource.class);
           LifecycleModule.registerKey(binder, 
Key.get(SelfDiscoveryResource.class));
diff --git a/services/src/main/java/org/apache/druid/cli/ServerRunnable.java 
b/services/src/main/java/org/apache/druid/cli/ServerRunnable.java
index 8ac9244..4beeab8 100644
--- a/services/src/main/java/org/apache/druid/cli/ServerRunnable.java
+++ b/services/src/main/java/org/apache/druid/cli/ServerRunnable.java
@@ -26,6 +26,7 @@ import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Key;
 import com.google.inject.Provider;
+import com.google.inject.multibindings.Multibinder;
 import org.apache.druid.curator.discovery.ServiceAnnouncer;
 import org.apache.druid.discovery.DiscoveryDruidNode;
 import org.apache.druid.discovery.DruidNodeAnnouncer;
@@ -42,6 +43,7 @@ import java.lang.annotation.Annotation;
 import java.util.List;
 
 /**
+ *
  */
 public abstract class ServerRunnable extends GuiceRunnable
 {
@@ -64,7 +66,34 @@ public abstract class ServerRunnable extends GuiceRunnable
     }
   }
 
-  public static void bindAnnouncer(
+  public static void bindNodeRoleAndAnnouncer(Binder binder, 
DiscoverySideEffectsProvider discoverySideEffectsProvider)
+  {
+    Multibinder<NodeRole> selfBinder = Multibinder.newSetBinder(binder, 
NodeRole.class, Self.class);
+    selfBinder.addBinding().toInstance(discoverySideEffectsProvider.nodeRole);
+
+    bindAnnouncer(
+        binder,
+        discoverySideEffectsProvider
+    );
+  }
+
+  public static void bindNodeRoleAndAnnouncer(
+      Binder binder,
+      Class<? extends Annotation> annotation,
+      DiscoverySideEffectsProvider discoverySideEffectsProvider
+  )
+  {
+    Multibinder<NodeRole> selfBinder = Multibinder.newSetBinder(binder, 
NodeRole.class, Self.class);
+    selfBinder.addBinding().toInstance(discoverySideEffectsProvider.nodeRole);
+
+    bindAnnouncer(
+        binder,
+        annotation,
+        discoverySideEffectsProvider
+    );
+  }
+
+  private static void bindAnnouncer(
       final Binder binder,
       final DiscoverySideEffectsProvider provider
   )
@@ -76,7 +105,7 @@ public abstract class ServerRunnable extends GuiceRunnable
     LifecycleModule.registerKey(binder, 
Key.get(DiscoverySideEffectsProvider.Child.class));
   }
 
-  public static void bindAnnouncer(
+  private static void bindAnnouncer(
       final Binder binder,
       final Class<? extends Annotation> annotation,
       final DiscoverySideEffectsProvider provider


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@druid.apache.org
For additional commands, e-mail: commits-h...@druid.apache.org

Reply via email to