Skip to content

Commit 7a826a0

Browse files
committed
Refactor away from ConfigHolder, ConfigHelper
1 parent 59183fe commit 7a826a0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1046
-927
lines changed

src/main/java/oracle/kubernetes/operator/ConfigMapWatcher.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import oracle.kubernetes.operator.builders.WatchI;
1010
import oracle.kubernetes.operator.watcher.WatchListener;
1111

12+
import java.util.concurrent.ScheduledExecutorService;
1213
import java.util.concurrent.atomic.AtomicBoolean;
1314

1415
/**
@@ -18,9 +19,9 @@
1819
public class ConfigMapWatcher extends Watcher<V1ConfigMap> {
1920
private final String ns;
2021

21-
public static ConfigMapWatcher create(String ns, String initialResourceVersion, WatchListener<V1ConfigMap> listener, AtomicBoolean isStopping) {
22+
public static ConfigMapWatcher create(ScheduledExecutorService threadPool, String ns, String initialResourceVersion, WatchListener<V1ConfigMap> listener, AtomicBoolean isStopping) {
2223
ConfigMapWatcher watcher = new ConfigMapWatcher(ns, initialResourceVersion, listener, isStopping);
23-
watcher.start("Thread-ConfigMapWatcher-" + ns);
24+
watcher.start(threadPool);
2425
return watcher;
2526
}
2627

src/main/java/oracle/kubernetes/operator/DomainStatusUpdater.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import oracle.kubernetes.weblogic.domain.v1.ServerStartup;
2525
import oracle.kubernetes.weblogic.domain.v1.ServerStatus;
2626
import oracle.kubernetes.operator.helpers.CallBuilder;
27+
import oracle.kubernetes.operator.helpers.CallBuilderFactory;
2728
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
2829
import oracle.kubernetes.operator.helpers.DomainPresenceInfo.ServerStartupInfo;
2930
import oracle.kubernetes.operator.helpers.ResponseStep;
@@ -34,6 +35,7 @@
3435
import oracle.kubernetes.operator.wlsconfig.WlsClusterConfig;
3536
import oracle.kubernetes.operator.wlsconfig.WlsDomainConfig;
3637
import oracle.kubernetes.operator.wlsconfig.WlsServerConfig;
38+
import oracle.kubernetes.operator.work.ContainerResolver;
3739
import oracle.kubernetes.operator.work.Fiber;
3840
import oracle.kubernetes.operator.work.Fiber.CompletionCallback;
3941
import oracle.kubernetes.operator.work.NextAction;
@@ -610,7 +612,8 @@ public NextAction apply(Packet packet) {
610612
private static NextAction doDomainUpdate(Domain dom, DomainPresenceInfo info, Packet packet, Step conflictStep, Step next) {
611613
V1ObjectMeta meta = dom.getMetadata();
612614
NextAction na = new NextAction();
613-
na.invoke(CallBuilder.create().replaceDomainAsync(meta.getName(), meta.getNamespace(), dom, new ResponseStep<Domain>(next) {
615+
CallBuilderFactory factory = ContainerResolver.getInstance().getContainer().getSPI(CallBuilderFactory.class);
616+
na.invoke(factory.create().replaceDomainAsync(meta.getName(), meta.getNamespace(), dom, new ResponseStep<Domain>(next) {
614617
@Override
615618
public NextAction onFailure(Packet packet, ApiException e, int statusCode,
616619
Map<String, List<String>> responseHeaders) {

src/main/java/oracle/kubernetes/operator/DomainWatcher.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import oracle.kubernetes.operator.watcher.WatchListener;
1010
import oracle.kubernetes.weblogic.domain.v1.Domain;
1111

12+
import java.util.concurrent.ScheduledExecutorService;
1213
import java.util.concurrent.atomic.AtomicBoolean;
1314

1415
/**
@@ -18,9 +19,9 @@
1819
public class DomainWatcher extends Watcher<Domain> {
1920
private final String ns;
2021

21-
public static DomainWatcher create(String ns, String initialResourceVersion, WatchListener<Domain> listener, AtomicBoolean isStopping) {
22+
public static DomainWatcher create(ScheduledExecutorService threadPool, String ns, String initialResourceVersion, WatchListener<Domain> listener, AtomicBoolean isStopping) {
2223
DomainWatcher watcher = new DomainWatcher(ns, initialResourceVersion, listener, isStopping);
23-
watcher.start("Thread-DomainWatcher-" + ns);
24+
watcher.start(threadPool);
2425
return watcher;
2526
}
2627

src/main/java/oracle/kubernetes/operator/IngressWatcher.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import oracle.kubernetes.operator.watcher.WatchListener;
1212

1313
import java.util.Map;
14+
import java.util.concurrent.ScheduledExecutorService;
1415
import java.util.concurrent.atomic.AtomicBoolean;
1516

1617
/**
@@ -20,9 +21,9 @@
2021
public class IngressWatcher extends Watcher<V1beta1Ingress> {
2122
private final String ns;
2223

23-
public static IngressWatcher create(String ns, String initialResourceVersion, WatchListener<V1beta1Ingress> listener, AtomicBoolean isStopping) {
24+
public static IngressWatcher create(ScheduledExecutorService threadPool, String ns, String initialResourceVersion, WatchListener<V1beta1Ingress> listener, AtomicBoolean isStopping) {
2425
IngressWatcher watcher = new IngressWatcher(ns, initialResourceVersion, listener, isStopping);
25-
watcher.start("Thread-IngressWatcher-" + ns);
26+
watcher.start(threadPool);
2627
return watcher;
2728
}
2829

src/main/java/oracle/kubernetes/operator/Main.java

Lines changed: 79 additions & 96 deletions
Large diffs are not rendered by default.

src/main/java/oracle/kubernetes/operator/PodWatcher.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
import oracle.kubernetes.operator.builders.WatchBuilder;
1313
import oracle.kubernetes.operator.builders.WatchI;
1414
import oracle.kubernetes.operator.helpers.CallBuilder;
15+
import oracle.kubernetes.operator.helpers.CallBuilderFactory;
1516
import oracle.kubernetes.operator.helpers.ResponseStep;
1617
import oracle.kubernetes.operator.logging.LoggingFacade;
1718
import oracle.kubernetes.operator.logging.LoggingFactory;
1819
import oracle.kubernetes.operator.logging.MessageKeys;
1920
import oracle.kubernetes.operator.watcher.WatchListener;
21+
import oracle.kubernetes.operator.work.ContainerResolver;
2022
import oracle.kubernetes.operator.work.NextAction;
2123
import oracle.kubernetes.operator.work.Packet;
2224
import oracle.kubernetes.operator.work.Step;
@@ -25,6 +27,7 @@
2527
import java.util.Map;
2628
import java.util.concurrent.ConcurrentHashMap;
2729
import java.util.concurrent.ConcurrentMap;
30+
import java.util.concurrent.ScheduledExecutorService;
2831
import java.util.concurrent.atomic.AtomicBoolean;
2932

3033
/**
@@ -42,15 +45,16 @@ public class PodWatcher extends Watcher<V1Pod> implements WatchListener<V1Pod> {
4245

4346
/**
4447
* Factory for PodWatcher
48+
* @param theradPool executor
4549
* @param ns Namespace
4650
* @param initialResourceVersion Initial resource version or empty string
4751
* @param listener Callback for watch events
4852
* @param isStopping Stop signal
4953
* @return Pod watcher for the namespace
5054
*/
51-
public static PodWatcher create(String ns, String initialResourceVersion, WatchListener<V1Pod> listener, AtomicBoolean isStopping) {
55+
public static PodWatcher create(ScheduledExecutorService threadPool, String ns, String initialResourceVersion, WatchListener<V1Pod> listener, AtomicBoolean isStopping) {
5256
PodWatcher watcher = new PodWatcher(ns, initialResourceVersion, listener, isStopping);
53-
watcher.start("Thread-PodWatcher-" + ns);
57+
watcher.start(threadPool);
5458
return watcher;
5559
}
5660

@@ -188,7 +192,8 @@ public NextAction apply(Packet packet) {
188192
readyCallbackRegistrations.put(metadata.getName(), ready);
189193

190194
// Timing window -- pod may have come ready before registration for callback
191-
fiber.createChildFiber().start(CallBuilder.create().readPodAsync(
195+
CallBuilderFactory factory = ContainerResolver.getInstance().getContainer().getSPI(CallBuilderFactory.class);
196+
fiber.createChildFiber().start(factory.create().readPodAsync(
192197
metadata.getName(), metadata.getNamespace(), new ResponseStep<V1Pod>(null) {
193198
@Override
194199
public NextAction onFailure(Packet packet, ApiException e, int statusCode,

src/main/java/oracle/kubernetes/operator/ProcessingConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010
public interface ProcessingConstants {
1111

12+
public static final String MAIN_COMPONENT_NAME = "main";
1213
public static final String DOMAIN_COMPONENT_NAME = "domain";
1314
public static final String FIBER_COMPONENT_NAME = "fiber";
1415

src/main/java/oracle/kubernetes/operator/ServerStatusReader.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
import com.google.common.base.Charsets;
2020
import com.google.common.io.CharStreams;
2121

22+
import io.kubernetes.client.ApiClient;
2223
import io.kubernetes.client.ApiException;
2324
import io.kubernetes.client.Exec;
2425
import io.kubernetes.client.models.V1Pod;
25-
import oracle.kubernetes.operator.helpers.ClientHelper;
26-
import oracle.kubernetes.operator.helpers.ClientHolder;
26+
import oracle.kubernetes.operator.helpers.ClientPool;
2727
import oracle.kubernetes.operator.helpers.DomainPresenceInfo;
2828
import oracle.kubernetes.operator.helpers.ServerKubernetesObjects;
2929
import oracle.kubernetes.operator.logging.LoggingFacade;
@@ -131,13 +131,12 @@ public NextAction apply(Packet packet) {
131131
final boolean tty = true;
132132

133133
return doSuspend(fiber -> {
134-
ClientHelper helper = ClientHelper.getInstance();
135-
ClientHolder holder = helper.take();
136-
Exec exec = new Exec(holder.getApiClient());
137134
Process proc = null;
138135
String state = null;
136+
ClientPool helper = ClientPool.getInstance();
137+
ApiClient client = helper.take();
139138
try {
140-
proc = exec.exec(pod,
139+
proc = new Exec(client).exec(pod,
141140
new String[] { "/weblogic-operator/scripts/readState.sh" },
142141
KubernetesConstants.CONTAINER_NAME, stdin, tty);
143142

@@ -150,7 +149,7 @@ public NextAction apply(Packet packet) {
150149
} catch (IOException | ApiException | InterruptedException e) {
151150
LOGGER.warning(MessageKeys.EXCEPTION, e);
152151
} finally {
153-
helper.recycle(holder);
152+
helper.recycle(client);
154153
if (proc != null) {
155154
proc.destroy();
156155
}

src/main/java/oracle/kubernetes/operator/ServiceWatcher.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import oracle.kubernetes.operator.watcher.WatchListener;
1212

1313
import java.util.Map;
14+
import java.util.concurrent.ScheduledExecutorService;
1415
import java.util.concurrent.atomic.AtomicBoolean;
1516

1617
/**
@@ -20,9 +21,9 @@
2021
public class ServiceWatcher extends Watcher<V1Service> {
2122
private final String ns;
2223

23-
public static ServiceWatcher create(String ns, String initialResourceVersion, WatchListener<V1Service> listener, AtomicBoolean isStopping) {
24+
public static ServiceWatcher create(ScheduledExecutorService threadPool, String ns, String initialResourceVersion, WatchListener<V1Service> listener, AtomicBoolean isStopping) {
2425
ServiceWatcher watcher = new ServiceWatcher(ns, initialResourceVersion, listener, isStopping);
25-
watcher.start("Thread-ServiceWatcher-" + ns);
26+
watcher.start(threadPool);
2627
return watcher;
2728
}
2829

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
// Copyright 2017, 2018, Oracle Corporation and/or its affiliates. All rights reserved.
2+
// Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.
3+
4+
package oracle.kubernetes.operator;
5+
6+
import java.io.IOException;
7+
import java.util.concurrent.ScheduledExecutorService;
8+
import java.util.concurrent.locks.ReadWriteLock;
9+
import java.util.concurrent.locks.ReentrantReadWriteLock;
10+
11+
import oracle.kubernetes.operator.helpers.ConfigMapConsumer;
12+
import oracle.kubernetes.operator.logging.LoggingFacade;
13+
import oracle.kubernetes.operator.logging.LoggingFactory;
14+
import oracle.kubernetes.operator.logging.MessageKeys;
15+
16+
public class TuningParameters extends ConfigMapConsumer {
17+
private static final LoggingFacade LOGGER = LoggingFactory.getLogger("Operator", "Operator");
18+
private static TuningParameters INSTANCE = null;
19+
20+
private final ReadWriteLock lock = new ReentrantReadWriteLock();
21+
private MainTuning main = null;
22+
private CallBuilderTuning callBuilder = null;
23+
private WatchTuning watch = null;
24+
private PodTuning pod = null;
25+
26+
public static class MainTuning {
27+
public final int statusUpdateTimeoutSeconds;
28+
public final int unchangedCountToDelayStatusRecheck;
29+
public final long initialShortDelay;
30+
public final long eventualLongDelay;
31+
32+
public MainTuning(int statusUpdateTimeoutSeconds, int unchangedCountToDelayStatusRecheck,
33+
long initialShortDelay, long eventualLongDelay) {
34+
this.statusUpdateTimeoutSeconds = statusUpdateTimeoutSeconds;
35+
this.unchangedCountToDelayStatusRecheck = unchangedCountToDelayStatusRecheck;
36+
this.initialShortDelay = initialShortDelay;
37+
this.eventualLongDelay = eventualLongDelay;
38+
}
39+
}
40+
41+
public static class CallBuilderTuning {
42+
public final int callRequestLimit;
43+
public final int callMaxRetryCount;
44+
public final int callTimeoutSeconds;
45+
46+
public CallBuilderTuning(int callRequestLimit, int callMaxRetryCount, int callTimeoutSeconds) {
47+
this.callRequestLimit = callRequestLimit;
48+
this.callMaxRetryCount = callMaxRetryCount;
49+
this.callTimeoutSeconds = callTimeoutSeconds;
50+
}
51+
}
52+
53+
public static class WatchTuning {
54+
public final int watchLifetime;
55+
56+
public WatchTuning(int watchLifetime) {
57+
this.watchLifetime = watchLifetime;
58+
}
59+
}
60+
61+
public static class PodTuning {
62+
public final int readinessProbeInitialDelaySeconds;
63+
public final int readinessProbeTimeoutSeconds;
64+
public final int readinessProbePeriodSeconds;
65+
public final int livenessProbeInitialDelaySeconds;
66+
public final int livenessProbeTimeoutSeconds;
67+
public final int livenessProbePeriodSeconds;
68+
69+
public PodTuning(int readinessProbeInitialDelaySeconds, int readinessProbeTimeoutSeconds,
70+
int readinessProbePeriodSeconds, int livenessProbeInitialDelaySeconds,
71+
int livenessProbeTimeoutSeconds, int livenessProbePeriodSeconds) {
72+
this.readinessProbeInitialDelaySeconds = readinessProbeInitialDelaySeconds;
73+
this.readinessProbeTimeoutSeconds = readinessProbeTimeoutSeconds;
74+
this.readinessProbePeriodSeconds = readinessProbePeriodSeconds;
75+
this.livenessProbeInitialDelaySeconds = livenessProbeInitialDelaySeconds;
76+
this.livenessProbeTimeoutSeconds = livenessProbeTimeoutSeconds;
77+
this.livenessProbePeriodSeconds = livenessProbePeriodSeconds;
78+
}
79+
}
80+
81+
public synchronized static TuningParameters initializeInstance(
82+
ScheduledExecutorService threadPool, String mountPoint) throws IOException {
83+
if (INSTANCE == null) {
84+
INSTANCE = new TuningParameters(threadPool, mountPoint);
85+
return INSTANCE;
86+
}
87+
throw new IllegalStateException();
88+
}
89+
90+
private TuningParameters(ScheduledExecutorService threadPool, String mountPoint) throws IOException {
91+
super(threadPool, mountPoint, () -> {
92+
updateTuningParameters();
93+
});
94+
}
95+
96+
public static void updateTuningParameters() {
97+
INSTANCE.update();
98+
}
99+
100+
private void update() {
101+
LOGGER.info(MessageKeys.TUNING_PARAMETERS);
102+
103+
MainTuning main = new MainTuning(
104+
(int) readTuningParameter("statusUpdateTimeoutSeconds", 10),
105+
(int) readTuningParameter("statueUpdateUnchangedCountToDelayStatusRecheck", 10),
106+
readTuningParameter("statusUpdateInitialShortDelay", 3),
107+
readTuningParameter("statusUpdateEventualLongDelay", 30));
108+
109+
CallBuilderTuning callBuilder = new CallBuilderTuning(
110+
(int) readTuningParameter("callRequestLimit", 500),
111+
(int) readTuningParameter("callMaxRetryCount", 5),
112+
(int) readTuningParameter("callTimeoutSeconds", 10));
113+
114+
WatchTuning watch = new WatchTuning(
115+
(int) readTuningParameter("watchLifetime", 45));
116+
117+
PodTuning pod = new PodTuning(
118+
(int) readTuningParameter("readinessProbeInitialDelaySeconds", 2),
119+
(int) readTuningParameter("readinessProbeTimeoutSeconds", 5),
120+
(int) readTuningParameter("readinessProbeTimeoutSeconds", 5),
121+
(int) readTuningParameter("livenessProbeInitialDelaySeconds", 10),
122+
(int) readTuningParameter("livenessProbeTimeoutSeconds", 5),
123+
(int) readTuningParameter("livenessProbePeriodSeconds", 10));
124+
125+
lock.writeLock().lock();
126+
try {
127+
this.main = main;
128+
this.callBuilder = callBuilder;
129+
this.watch = watch;
130+
this.pod = pod;
131+
} finally {
132+
lock.writeLock().unlock();
133+
}
134+
}
135+
136+
public MainTuning getMainTuning() {
137+
lock.readLock().lock();
138+
try {
139+
return main;
140+
} finally {
141+
lock.readLock().unlock();
142+
}
143+
}
144+
145+
public CallBuilderTuning getCallBuilderTuning() {
146+
lock.readLock().lock();
147+
try {
148+
return callBuilder;
149+
} finally {
150+
lock.readLock().unlock();
151+
}
152+
}
153+
154+
public WatchTuning getWatchTuning() {
155+
lock.readLock().lock();
156+
try {
157+
return watch;
158+
} finally {
159+
lock.readLock().unlock();
160+
}
161+
}
162+
163+
public PodTuning getPodTuning() {
164+
lock.readLock().lock();
165+
try {
166+
return pod;
167+
} finally {
168+
lock.readLock().unlock();
169+
}
170+
}
171+
}

0 commit comments

Comments
 (0)