mirror of
https://github.com/apache/druid.git
synced 2025-02-17 07:25:02 +00:00
* #16717 defer provider instatiation * add license header * fix style, ignore new class in jacoco as it is still initialization code --------- Co-authored-by: Alberto Lago Alvarado <albl@sitecore.net>
This commit is contained in:
parent
01d67ae543
commit
ebf216829d
@ -158,10 +158,12 @@
|
|||||||
<excludes>
|
<excludes>
|
||||||
<!-- Initialization code -->
|
<!-- Initialization code -->
|
||||||
<exclude>org/apache/druid/k8s/discovery/K8sDiscoveryModule*</exclude>
|
<exclude>org/apache/druid/k8s/discovery/K8sDiscoveryModule*</exclude>
|
||||||
|
<exclude>org/apache/druid/k8s/discovery/K8sDruidLeaderSelectorProvider*</exclude>
|
||||||
|
|
||||||
<!-- K8S Api Glue, not unit testable -->
|
<!-- K8S Api Glue, not unit testable -->
|
||||||
<exclude>org/apache/druid/k8s/discovery/DefaultK8sApiClient*</exclude>
|
<exclude>org/apache/druid/k8s/discovery/DefaultK8sApiClient*</exclude>
|
||||||
<exclude>org/apache/druid/k8s/discovery/DefaultK8sLeaderElectorFactory*</exclude>
|
<exclude>org/apache/druid/k8s/discovery/DefaultK8sLeaderElectorFactory*</exclude>
|
||||||
|
|
||||||
</excludes>
|
</excludes>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
@ -21,9 +21,7 @@ package org.apache.druid.k8s.discovery;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.databind.Module;
|
import com.fasterxml.jackson.databind.Module;
|
||||||
import com.google.inject.Binder;
|
import com.google.inject.Binder;
|
||||||
import com.google.inject.Inject;
|
|
||||||
import com.google.inject.Key;
|
import com.google.inject.Key;
|
||||||
import com.google.inject.Provider;
|
|
||||||
import io.kubernetes.client.openapi.ApiClient;
|
import io.kubernetes.client.openapi.ApiClient;
|
||||||
import io.kubernetes.client.util.Config;
|
import io.kubernetes.client.util.Config;
|
||||||
import org.apache.druid.client.coordinator.Coordinator;
|
import org.apache.druid.client.coordinator.Coordinator;
|
||||||
@ -34,9 +32,7 @@ import org.apache.druid.discovery.DruidNodeDiscoveryProvider;
|
|||||||
import org.apache.druid.guice.JsonConfigProvider;
|
import org.apache.druid.guice.JsonConfigProvider;
|
||||||
import org.apache.druid.guice.LazySingleton;
|
import org.apache.druid.guice.LazySingleton;
|
||||||
import org.apache.druid.guice.PolyBind;
|
import org.apache.druid.guice.PolyBind;
|
||||||
import org.apache.druid.guice.annotations.Self;
|
|
||||||
import org.apache.druid.initialization.DruidModule;
|
import org.apache.druid.initialization.DruidModule;
|
||||||
import org.apache.druid.server.DruidNode;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -88,65 +84,15 @@ public class K8sDiscoveryModule implements DruidModule
|
|||||||
PolyBind.optionBinder(binder, Key.get(DruidLeaderSelector.class, Coordinator.class))
|
PolyBind.optionBinder(binder, Key.get(DruidLeaderSelector.class, Coordinator.class))
|
||||||
.addBinding(K8S_KEY)
|
.addBinding(K8S_KEY)
|
||||||
.toProvider(
|
.toProvider(
|
||||||
new DruidLeaderSelectorProvider(true)
|
K8sDruidLeaderSelectorProvider.K8sCoordinatorDruidLeaderSelectorProvider.class
|
||||||
)
|
)
|
||||||
.in(LazySingleton.class);
|
.in(LazySingleton.class);
|
||||||
|
|
||||||
PolyBind.optionBinder(binder, Key.get(DruidLeaderSelector.class, IndexingService.class))
|
PolyBind.optionBinder(binder, Key.get(DruidLeaderSelector.class, IndexingService.class))
|
||||||
.addBinding(K8S_KEY)
|
.addBinding(K8S_KEY)
|
||||||
.toProvider(
|
.toProvider(
|
||||||
new DruidLeaderSelectorProvider(false)
|
K8sDruidLeaderSelectorProvider.K8sIndexingServiceDruidLeaderSelectorProvider.class
|
||||||
)
|
)
|
||||||
.in(LazySingleton.class);
|
.in(LazySingleton.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class DruidLeaderSelectorProvider implements Provider<DruidLeaderSelector>
|
|
||||||
{
|
|
||||||
@Inject
|
|
||||||
@Self
|
|
||||||
private DruidNode druidNode;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
private PodInfo podInfo;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
private K8sDiscoveryConfig discoveryConfig;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
private Provider<ApiClient> 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)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
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;
|
||||||
|
|
||||||
|
public abstract class K8sDruidLeaderSelectorProvider implements Provider<DruidLeaderSelector>
|
||||||
|
{
|
||||||
|
@Inject
|
||||||
|
@Self
|
||||||
|
private DruidNode druidNode;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private PodInfo podInfo;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private K8sDiscoveryConfig discoveryConfig;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private Provider<ApiClient> k8sApiClientProvider;
|
||||||
|
|
||||||
|
private boolean isCoordinator;
|
||||||
|
|
||||||
|
K8sDruidLeaderSelectorProvider(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 K8sCoordinatorDruidLeaderSelectorProvider extends K8sDruidLeaderSelectorProvider
|
||||||
|
{
|
||||||
|
@Inject
|
||||||
|
public K8sCoordinatorDruidLeaderSelectorProvider()
|
||||||
|
{
|
||||||
|
super(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class K8sIndexingServiceDruidLeaderSelectorProvider extends K8sDruidLeaderSelectorProvider
|
||||||
|
{
|
||||||
|
@Inject
|
||||||
|
public K8sIndexingServiceDruidLeaderSelectorProvider()
|
||||||
|
{
|
||||||
|
super(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user