Skip to content

Commit 52e8719

Browse files
authored
Merge pull request #710 from oracle/socket_timeout
discard client on watch failure; extend socket timeout
2 parents d23fbf4 + 8526d00 commit 52e8719

File tree

4 files changed

+35
-30
lines changed

4 files changed

+35
-30
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,13 @@ private void watchForEvents() {
126126
.withResourceVersion(resourceVersion.toString())
127127
.withTimeoutSeconds(tuning.watchLifetime))) {
128128
while (watch.hasNext()) {
129-
Watch.Response<T> item = watch.next();
129+
Watch.Response<T> item;
130+
try {
131+
item = watch.next();
132+
} catch (Throwable e) {
133+
watch.discardClient();
134+
throw e;
135+
}
130136

131137
if (isStopping()) setIsDraining(true);
132138
if (isDraining()) continue;

operator/src/main/java/oracle/kubernetes/operator/builders/WatchBuilder.java

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
import com.squareup.okhttp.Call;
88
import io.kubernetes.client.ApiClient;
99
import io.kubernetes.client.ApiException;
10-
import io.kubernetes.client.ProgressRequestBody;
11-
import io.kubernetes.client.ProgressResponseBody;
1210
import io.kubernetes.client.apis.BatchV1Api;
1311
import io.kubernetes.client.apis.CoreV1Api;
1412
import io.kubernetes.client.models.V1ConfigMap;
@@ -33,6 +31,8 @@ public class WatchBuilder {
3331
/** Ignored for watches. */
3432
private static final String START_LIST = null;
3533

34+
private static final int ADDITIONAL_TIMEOUT_FOR_SOCKET = 60;
35+
3636
private static WatchFactory FACTORY = new WatchFactoryImpl();
3737

3838
private CallParamsImpl callParams = new CallParamsImpl();
@@ -92,7 +92,7 @@ private class ListNamespacedServiceCall implements BiFunction<ApiClient, CallPar
9292
@Override
9393
public Call apply(ApiClient client, CallParams callParams) {
9494
// Ensure that client doesn't time out before call or watch
95-
client.getHttpClient().setReadTimeout(callParams.getTimeoutSeconds(), TimeUnit.SECONDS);
95+
client.getHttpClient().setReadTimeout(getSocketTimeout(callParams), TimeUnit.SECONDS);
9696

9797
try {
9898
return new CoreV1Api(client)
@@ -137,7 +137,7 @@ private class ListPodCall implements BiFunction<ApiClient, CallParams, Call> {
137137
@Override
138138
public Call apply(ApiClient client, CallParams callParams) {
139139
// Ensure that client doesn't time out before call or watch
140-
client.getHttpClient().setReadTimeout(callParams.getTimeoutSeconds(), TimeUnit.SECONDS);
140+
client.getHttpClient().setReadTimeout(getSocketTimeout(callParams), TimeUnit.SECONDS);
141141

142142
try {
143143
return new CoreV1Api(client)
@@ -182,7 +182,7 @@ private class ListJobCall implements BiFunction<ApiClient, CallParams, Call> {
182182
@Override
183183
public Call apply(ApiClient client, CallParams callParams) {
184184
// Ensure that client doesn't time out before call or watch
185-
client.getHttpClient().setReadTimeout(callParams.getTimeoutSeconds(), TimeUnit.SECONDS);
185+
client.getHttpClient().setReadTimeout(getSocketTimeout(callParams), TimeUnit.SECONDS);
186186

187187
try {
188188
return new BatchV1Api(client)
@@ -227,7 +227,7 @@ private class ListEventCall implements BiFunction<ApiClient, CallParams, Call> {
227227
@Override
228228
public Call apply(ApiClient client, CallParams callParams) {
229229
// Ensure that client doesn't time out before call or watch
230-
client.getHttpClient().setReadTimeout(callParams.getTimeoutSeconds(), TimeUnit.SECONDS);
230+
client.getHttpClient().setReadTimeout(getSocketTimeout(callParams), TimeUnit.SECONDS);
231231

232232
try {
233233
return new CoreV1Api(client)
@@ -272,7 +272,7 @@ private class ListDomainsCall implements BiFunction<ApiClient, CallParams, Call>
272272
@Override
273273
public Call apply(ApiClient client, CallParams callParams) {
274274
// Ensure that client doesn't time out before call or watch
275-
client.getHttpClient().setReadTimeout(callParams.getTimeoutSeconds(), TimeUnit.SECONDS);
275+
client.getHttpClient().setReadTimeout(getSocketTimeout(callParams), TimeUnit.SECONDS);
276276

277277
try {
278278
return new WeblogicApi(client)
@@ -320,7 +320,7 @@ private class ListNamespacedConfigMapCall implements BiFunction<ApiClient, CallP
320320
@Override
321321
public Call apply(ApiClient client, CallParams callParams) {
322322
// Ensure that client doesn't time out before call or watch
323-
client.getHttpClient().setReadTimeout(callParams.getTimeoutSeconds(), TimeUnit.SECONDS);
323+
client.getHttpClient().setReadTimeout(getSocketTimeout(callParams), TimeUnit.SECONDS);
324324

325325
try {
326326
return new CoreV1Api(client)
@@ -343,6 +343,10 @@ public Call apply(ApiClient client, CallParams callParams) {
343343
}
344344
}
345345

346+
private Integer getSocketTimeout(CallParams callParams) {
347+
return callParams.getTimeoutSeconds() + ADDITIONAL_TIMEOUT_FOR_SOCKET;
348+
}
349+
346350
/**
347351
* Sets a value for the fieldSelector parameter for the call that will set up this watch. Defaults
348352
* to null.
@@ -355,7 +359,8 @@ public WatchBuilder withFieldSelector(String fieldSelector) {
355359
return this;
356360
}
357361

358-
public WatchBuilder withIncludeUninitialized(Boolean includeUninitialized) {
362+
@SuppressWarnings("SameParameterValue")
363+
WatchBuilder withIncludeUninitialized(Boolean includeUninitialized) {
359364
callParams.setIncludeUninitialized(includeUninitialized);
360365
return this;
361366
}
@@ -370,16 +375,12 @@ public WatchBuilder withLabelSelectors(String... labelSelectors) {
370375
return this;
371376
}
372377

373-
public WatchBuilder withLimit(Integer limit) {
378+
@SuppressWarnings("SameParameterValue")
379+
WatchBuilder withLimit(Integer limit) {
374380
callParams.setLimit(limit);
375381
return this;
376382
}
377383

378-
public WatchBuilder withPrettyPrinting() {
379-
callParams.setPretty("true");
380-
return this;
381-
}
382-
383384
public WatchBuilder withResourceVersion(String resourceVersion) {
384385
callParams.setResourceVersion(resourceVersion);
385386
return this;
@@ -390,17 +391,6 @@ public WatchBuilder withTimeoutSeconds(Integer timeoutSeconds) {
390391
return this;
391392
}
392393

393-
public WatchBuilder withProgressListener(ProgressResponseBody.ProgressListener progressListener) {
394-
callParams.setProgressListener(progressListener);
395-
return this;
396-
}
397-
398-
public WatchBuilder withProgressRequestListener(
399-
ProgressRequestBody.ProgressRequestListener progressRequestListener) {
400-
callParams.setProgressRequestListener(progressRequestListener);
401-
return this;
402-
}
403-
404394
static class WatchFactoryImpl implements WatchFactory {
405395
@Override
406396
public <T> WatchI<T> createWatch(
@@ -411,7 +401,7 @@ public <T> WatchI<T> createWatch(
411401
throws ApiException {
412402
ApiClient client = pool.take();
413403
try {
414-
return new WatchImpl<T>(
404+
return new WatchImpl<>(
415405
pool,
416406
client,
417407
Watch.createWatch(

operator/src/main/java/oracle/kubernetes/operator/builders/WatchI.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@
1414
* @param <T> the generic object type
1515
*/
1616
public interface WatchI<T>
17-
extends Iterable<Watch.Response<T>>, Iterator<Watch.Response<T>>, java.io.Closeable {}
17+
extends Iterable<Watch.Response<T>>, Iterator<Watch.Response<T>>, java.io.Closeable {
18+
default void discardClient() {}
19+
}

operator/src/main/java/oracle/kubernetes/operator/builders/WatchImpl.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
import io.kubernetes.client.util.Watch;
99
import java.io.IOException;
1010
import java.util.Iterator;
11+
import javax.annotation.Nonnull;
1112
import oracle.kubernetes.operator.helpers.Pool;
1213

1314
/**
1415
* A pass-through implementation of the Kubernetes Watch class which implements a facade interface.
1516
*/
1617
public class WatchImpl<T> implements WatchI<T> {
1718
private final Pool<ApiClient> pool;
18-
private final ApiClient client;
19+
private ApiClient client;
1920
private Watch<T> impl;
2021

2122
WatchImpl(Pool<ApiClient> pool, ApiClient client, Watch<T> impl) {
@@ -31,6 +32,12 @@ public void close() throws IOException {
3132
}
3233

3334
@Override
35+
public void discardClient() {
36+
client = pool.take();
37+
}
38+
39+
@Override
40+
@Nonnull
3441
public Iterator<Watch.Response<T>> iterator() {
3542
return impl.iterator();
3643
}

0 commit comments

Comments
 (0)