From eb54ec4f2015a3c1560e4bc7b2056f0a6ad5d231 Mon Sep 17 00:00:00 2001 From: Alberto Lago Alvarado Date: Thu, 11 Jul 2024 18:06:21 +0200 Subject: [PATCH 1/3] #16717 defer provider instatiation --- .../DruidLeaderSelectorProvider.java | 72 +++++++++++++++++++ .../k8s/discovery/K8sDiscoveryModule.java | 58 +-------------- 2 files changed, 74 insertions(+), 56 deletions(-) create mode 100644 extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/DruidLeaderSelectorProvider.java diff --git a/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/DruidLeaderSelectorProvider.java b/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/DruidLeaderSelectorProvider.java new file mode 100644 index 000000000000..ca10c5f9f7a9 --- /dev/null +++ b/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/DruidLeaderSelectorProvider.java @@ -0,0 +1,72 @@ +package org.apache.druid.k8s.discovery; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import io.kubernetes.client.openapi.ApiClient; +import org.apache.druid.discovery.DruidLeaderSelector; +import org.apache.druid.guice.annotations.Self; +import org.apache.druid.server.DruidNode; + +abstract public class DruidLeaderSelectorProvider implements Provider +{ + @Inject + @Self + private DruidNode druidNode; + + @Inject + private PodInfo podInfo; + + @Inject + private K8sDiscoveryConfig discoveryConfig; + + @Inject + private Provider k8sApiClientProvider; + + private boolean isCoordinator; + + DruidLeaderSelectorProvider(boolean isCoordinator) + { + this.isCoordinator = isCoordinator; + } + + @Override + public DruidLeaderSelector get() + { + // Note: these can not be setup in the constructor because injected K8sDiscoveryConfig and PodInfo + // are not available at that time. + String lockResourceName; + String lockResourceNamespace; + + if (isCoordinator) { + lockResourceName = discoveryConfig.getClusterIdentifier() + "-leaderelection-coordinator"; + lockResourceNamespace = discoveryConfig.getCoordinatorLeaderElectionConfigMapNamespace() == null ? + podInfo.getPodNamespace() : discoveryConfig.getCoordinatorLeaderElectionConfigMapNamespace(); + } else { + lockResourceName = discoveryConfig.getClusterIdentifier() + "-leaderelection-overlord"; + lockResourceNamespace = discoveryConfig.getOverlordLeaderElectionConfigMapNamespace() == null ? + podInfo.getPodNamespace() : discoveryConfig.getOverlordLeaderElectionConfigMapNamespace(); + } + + return new K8sDruidLeaderSelector( + druidNode, + lockResourceName, + lockResourceNamespace, + discoveryConfig, + new DefaultK8sLeaderElectorFactory(k8sApiClientProvider.get(), discoveryConfig) + ); + } + + static class CoordinatorDruidLeaderSelectorProvider extends DruidLeaderSelectorProvider { + @Inject + public CoordinatorDruidLeaderSelectorProvider() { + super(true); + } + } + + static class IndexingServiceDruidLeaderSelectorProvider extends DruidLeaderSelectorProvider { + @Inject + public IndexingServiceDruidLeaderSelectorProvider() { + super(false); + } + } +} \ No newline at end of file diff --git a/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDiscoveryModule.java b/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDiscoveryModule.java index 6da6819ff4b5..c16f77d2b216 100644 --- a/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDiscoveryModule.java +++ b/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDiscoveryModule.java @@ -21,9 +21,7 @@ import com.fasterxml.jackson.databind.Module; import com.google.inject.Binder; -import com.google.inject.Inject; import com.google.inject.Key; -import com.google.inject.Provider; import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.util.Config; import org.apache.druid.client.coordinator.Coordinator; @@ -34,9 +32,7 @@ import org.apache.druid.guice.JsonConfigProvider; import org.apache.druid.guice.LazySingleton; import org.apache.druid.guice.PolyBind; -import org.apache.druid.guice.annotations.Self; import org.apache.druid.initialization.DruidModule; -import org.apache.druid.server.DruidNode; import java.io.IOException; import java.util.Collections; @@ -88,65 +84,15 @@ public void configure(Binder binder) PolyBind.optionBinder(binder, Key.get(DruidLeaderSelector.class, Coordinator.class)) .addBinding(K8S_KEY) .toProvider( - new DruidLeaderSelectorProvider(true) + DruidLeaderSelectorProvider.CoordinatorDruidLeaderSelectorProvider.class ) .in(LazySingleton.class); PolyBind.optionBinder(binder, Key.get(DruidLeaderSelector.class, IndexingService.class)) .addBinding(K8S_KEY) .toProvider( - new DruidLeaderSelectorProvider(false) + DruidLeaderSelectorProvider.IndexingServiceDruidLeaderSelectorProvider.class ) .in(LazySingleton.class); } - - private static class DruidLeaderSelectorProvider implements Provider - { - @Inject - @Self - private DruidNode druidNode; - - @Inject - private PodInfo podInfo; - - @Inject - private K8sDiscoveryConfig discoveryConfig; - - @Inject - private Provider k8sApiClientProvider; - - private boolean isCoordinator; - - DruidLeaderSelectorProvider(boolean isCoordinator) - { - this.isCoordinator = isCoordinator; - } - - @Override - public DruidLeaderSelector get() - { - // Note: these can not be setup in the constructor because injected K8sDiscoveryConfig and PodInfo - // are not available at that time. - String lockResourceName; - String lockResourceNamespace; - - if (isCoordinator) { - lockResourceName = discoveryConfig.getClusterIdentifier() + "-leaderelection-coordinator"; - lockResourceNamespace = discoveryConfig.getCoordinatorLeaderElectionConfigMapNamespace() == null ? - podInfo.getPodNamespace() : discoveryConfig.getCoordinatorLeaderElectionConfigMapNamespace(); - } else { - lockResourceName = discoveryConfig.getClusterIdentifier() + "-leaderelection-overlord"; - lockResourceNamespace = discoveryConfig.getOverlordLeaderElectionConfigMapNamespace() == null ? - podInfo.getPodNamespace() : discoveryConfig.getOverlordLeaderElectionConfigMapNamespace(); - } - - return new K8sDruidLeaderSelector( - druidNode, - lockResourceName, - lockResourceNamespace, - discoveryConfig, - new DefaultK8sLeaderElectorFactory(k8sApiClientProvider.get(), discoveryConfig) - ); - } - } } From d8b096297a51e62151bdffffe5ffc5d9c236585d Mon Sep 17 00:00:00 2001 From: Alberto Lago Alvarado Date: Fri, 12 Jul 2024 17:27:13 +0200 Subject: [PATCH 2/3] add license header --- .../DruidLeaderSelectorProvider.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/DruidLeaderSelectorProvider.java b/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/DruidLeaderSelectorProvider.java index ca10c5f9f7a9..e618a6f9488d 100644 --- a/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/DruidLeaderSelectorProvider.java +++ b/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/DruidLeaderSelectorProvider.java @@ -1,3 +1,22 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + package org.apache.druid.k8s.discovery; import com.google.inject.Inject; From e06d0f946e2c70d19df6a28ecb2b01bfb3d34182 Mon Sep 17 00:00:00 2001 From: Alberto Lago Alvarado Date: Sat, 13 Jul 2024 10:02:05 +0200 Subject: [PATCH 3/3] fix style, ignore new class in jacoco as it is still initialization code --- extensions-core/kubernetes-extensions/pom.xml | 2 + .../k8s/discovery/K8sDiscoveryModule.java | 4 +- ...va => K8sDruidLeaderSelectorProvider.java} | 58 ++++++++++--------- 3 files changed, 36 insertions(+), 28 deletions(-) rename extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/{DruidLeaderSelectorProvider.java => K8sDruidLeaderSelectorProvider.java} (52%) diff --git a/extensions-core/kubernetes-extensions/pom.xml b/extensions-core/kubernetes-extensions/pom.xml index 613dfd756edd..e51d12184648 100644 --- a/extensions-core/kubernetes-extensions/pom.xml +++ b/extensions-core/kubernetes-extensions/pom.xml @@ -158,10 +158,12 @@ org/apache/druid/k8s/discovery/K8sDiscoveryModule* + org/apache/druid/k8s/discovery/K8sDruidLeaderSelectorProvider* org/apache/druid/k8s/discovery/DefaultK8sApiClient* org/apache/druid/k8s/discovery/DefaultK8sLeaderElectorFactory* + diff --git a/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDiscoveryModule.java b/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDiscoveryModule.java index c16f77d2b216..b18f03d7f5b0 100644 --- a/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDiscoveryModule.java +++ b/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDiscoveryModule.java @@ -84,14 +84,14 @@ public void configure(Binder binder) PolyBind.optionBinder(binder, Key.get(DruidLeaderSelector.class, Coordinator.class)) .addBinding(K8S_KEY) .toProvider( - DruidLeaderSelectorProvider.CoordinatorDruidLeaderSelectorProvider.class + K8sDruidLeaderSelectorProvider.K8sCoordinatorDruidLeaderSelectorProvider.class ) .in(LazySingleton.class); PolyBind.optionBinder(binder, Key.get(DruidLeaderSelector.class, IndexingService.class)) .addBinding(K8S_KEY) .toProvider( - DruidLeaderSelectorProvider.IndexingServiceDruidLeaderSelectorProvider.class + K8sDruidLeaderSelectorProvider.K8sIndexingServiceDruidLeaderSelectorProvider.class ) .in(LazySingleton.class); } diff --git a/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/DruidLeaderSelectorProvider.java b/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDruidLeaderSelectorProvider.java similarity index 52% rename from extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/DruidLeaderSelectorProvider.java rename to extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDruidLeaderSelectorProvider.java index e618a6f9488d..cff6a8bdf468 100644 --- a/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/DruidLeaderSelectorProvider.java +++ b/extensions-core/kubernetes-extensions/src/main/java/org/apache/druid/k8s/discovery/K8sDruidLeaderSelectorProvider.java @@ -1,21 +1,21 @@ /* -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, -* software distributed under the License is distributed on an -* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. -*/ + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.druid.k8s.discovery; @@ -26,7 +26,7 @@ import org.apache.druid.guice.annotations.Self; import org.apache.druid.server.DruidNode; -abstract public class DruidLeaderSelectorProvider implements Provider +public abstract class K8sDruidLeaderSelectorProvider implements Provider { @Inject @Self @@ -43,7 +43,7 @@ abstract public class DruidLeaderSelectorProvider implements Provider