Further improvements to connection handling for gRPC-based devices
Force reset of gRPC connection backoff when probing for reachability.
This allows provider to attempt reconnection when needed, instead of
depending on the channel backoff timer.
Improved checkup task in GDP to better handle mastership
flapping observed when reconnecting devices.
Change-Id: I473fb14160b2eb744a483de431b91f9f6bcdab95
diff --git a/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/AbstractGrpcClientController.java b/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/AbstractGrpcClientController.java
index 5b3153c..f7c33c3 100644
--- a/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/AbstractGrpcClientController.java
+++ b/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/AbstractGrpcClientController.java
@@ -101,7 +101,7 @@
"A %s client already exists for %s", serviceName, deviceId));
}
- log.info("Creating {}...", clientName(deviceId));
+ log.debug("Creating {}...", clientName(deviceId));
final C client;
try {
@@ -135,7 +135,7 @@
withDeviceLock(() -> {
final C client = clients.remove(deviceId);
if (client != null) {
- log.info("Removing {}...", clientName(deviceId));
+ log.debug("Removing {}...", clientName(deviceId));
client.shutdown();
}
return null;
diff --git a/protocols/grpc/utils/src/main/java/org/onosproject/grpc/utils/AbstractGrpcHandshaker.java b/protocols/grpc/utils/src/main/java/org/onosproject/grpc/utils/AbstractGrpcHandshaker.java
index 0183133..4cfb63b 100644
--- a/protocols/grpc/utils/src/main/java/org/onosproject/grpc/utils/AbstractGrpcHandshaker.java
+++ b/protocols/grpc/utils/src/main/java/org/onosproject/grpc/utils/AbstractGrpcHandshaker.java
@@ -17,6 +17,7 @@
package org.onosproject.grpc.utils;
import com.google.common.util.concurrent.Striped;
+import io.grpc.ConnectivityState;
import io.grpc.ManagedChannel;
import org.onosproject.grpc.api.GrpcChannelController;
import org.onosproject.grpc.api.GrpcClient;
@@ -159,6 +160,7 @@
if (!setupBehaviour("probeReachability()")) {
return completedFuture(false);
}
+ resetChannelConnectBackoffIfNeeded();
return client.probeService();
}
@@ -175,4 +177,26 @@
handler().get(controllerClass)
.removeDeviceAgentListener(data().deviceId(), providerId);
}
+
+ private void resetChannelConnectBackoffIfNeeded() {
+ // Stimulate channel reconnect if in failure state.
+ final ManagedChannel channel = getExistingChannel();
+ if (channel == null) {
+ // Where did the channel go?
+ return;
+ }
+ if (channel.getState(false)
+ .equals(ConnectivityState.TRANSIENT_FAILURE)) {
+ channel.resetConnectBackoff();
+ }
+ }
+
+ private ManagedChannel getExistingChannel() {
+ final DeviceId deviceId = data().deviceId();
+ if (CHANNEL_URIS.containsKey(deviceId)) {
+ return handler().get(GrpcChannelController.class)
+ .get(CHANNEL_URIS.get(deviceId)).orElse(null);
+ }
+ return null;
+ }
}