I'm using grpc java on Android and I found a very weird issue. After a certain period a ManagedChannel no longer works.
I instantiated a ManagedChannel when there is no cached channel then cache it until the number of active channels is 0. My app worked fine and didn't have a problem when it's launched. but all grpc calls stopped working after a certain period. The app wasn't closed but it was in a backstack.I searched a similar issue in grpc issue tracker on github but I'm not sure if https://github.com/grpc/grpc-java/issues/1636 and https://github.com/grpc/grpc-java/issues/1648 are the issue I'm having.
06-26 13:41:47.612 28807-28891/com.test I/ManagedChannelImpl: [{0}] Terminated06-26 14:39:01.128 28807-28917/com.test I/ManagedChannelImpl: [{0}] Created with target {1}
public static synchronized ManagedChannelImpl get() throws RuntimeException {
if (_interceptor == null) {
throw new IllegalArgumentException("A Non-null ClientInterceptor must be provided");
}
if (channel == null || channel.isShutdown() || channel.isTerminated()) {
channel = OkHttpChannelBuilder.forAddress(BuildConfig.HOST, BuildConfig.PORT)
.sslSocketFactory(provideSSLSocketFactory())
.intercept(_interceptor)
.compressorRegistry(CompressorRegistry.getDefaultInstance())
.decompressorRegistry(DecompressorRegistry.getDefaultInstance())
.build();
}
return channel;
}
static SSLSocketFactory provideSSLSocketFactory() {
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput =
AndroidContext.getContext().getResources().openRawResource(R.raw.api_rancam_com);
Certificate ca;
try {
ca = cf.generateCertificate(caInput);
} finally {
caInput.close();
}
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
return context.getSocketFactory();
} catch (Exception e) {
Timber.e(e, "Failed to create SSLSocketFactory");
return null;
}
}
public static void release() {
try {
if (channel != null) {
Timber.d("Releasing channel");
channel.shutdown();
channel = null;
Timber.d("Channel released");
}
} catch (Exception e) {
Timber.e(e, "Failed to release channel");
channel = null;
}
}
Whew. I saw your email this morning but didn't have time to reply saying I had so clue what could cause that. Glad it's working for you, and you can look forward to built-in idleness.
And an hour makes sense for the tcp connection to (silently) break with a home network, since there is a NAT involved.
--
You received this message because you are subscribed to the Google Groups "grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email to grpc-io+unsubscribe@googlegroups.com.
To post to this group, send email to grp...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/2b885e4d-abef-4658-a6e9-45c9a4cd967e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
FYI: 3.0.0-pre1 includes support for auto-idling Channels (and keepalive for OkHttp). So you may be able to simplify your code now.
On Sun, Jun 26, 2016 at 1:01 PM, Eric Anderson <ej...@google.com> wrote:
Whew. I saw your email this morning but didn't have time to reply saying I had so clue what could cause that. Glad it's working for you, and you can look forward to built-in idleness.
And an hour makes sense for the tcp connection to (silently) break with a home network, since there is a NAT involved.
On Jun 26, 2016 12:29 PM, "Taehyun Park" <gold.d...@gmail.com> wrote:
Sorry for confusions. The logcat was not the same device and the timer I added didn't work properly. Releasing resources by shutting down a channel when there is a period of inactivity solved my issue.--
On Sunday, June 26, 2016 at 1:06:06 AM UTC+9, Eric Anderson wrote:On Sat, Jun 25, 2016 at 4:36 AM, Taehyun Park <gold.d...@gmail.com> wrote:I'm using grpc java on Android and I found a very weird issue. After a certain period a ManagedChannel no longer works.Was that after a period of inactivity? Were you on good WiFi (one that you trust), bad WiFi, or cellular?I instantiated a ManagedChannel when there is no cached channel then cache it until the number of active channels is 0. My app worked fine and didn't have a problem when it's launched. but all grpc calls stopped working after a certain period. The app wasn't closed but it was in a backstack.I searched a similar issue in grpc issue tracker on github but I'm not sure if https://github.com/grpc/grpc-java/issues/1636 and https://github.com/grpc/grpc-java/issues/1648 are the issue I'm having.When discussing keepalive, the general assumption is the network misbehaved (which is not uncommon on mobile). Keepalive is only going to be active when an RPC is outstanding. That means that it will need to be combined with channel idleness to close TCP connections after inactivity.Both are planned for 1.0 in order to give a full solution to this sort of issue (assuming that failures are due to poor networks). Idleness in general is useful. With it you really don't have much reason to cache the channel like you were. You could create the channel eagerly (which starts IDLE) and the channel can release resources when there is a period of inactivity.
You received this message because you are subscribed to the Google Groups "grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email to grpc-io+u...@googlegroups.com.
FYI: 3.0.0-pre1 includes support for auto-idling Channels (and keepalive for OkHttp). So you may be able to simplify your code now.
On Sun, Jun 26, 2016 at 1:01 PM, Eric Anderson <ej...@google.com> wrote:
Whew. I saw your email this morning but didn't have time to reply saying I had so clue what could cause that. Glad it's working for you, and you can look forward to built-in idleness.
And an hour makes sense for the tcp connection to (silently) break with a home network, since there is a NAT involved.
On Jun 26, 2016 12:29 PM, "Taehyun Park" <gold.d...@gmail.com> wrote:
Sorry for confusions. The logcat was not the same device and the timer I added didn't work properly. Releasing resources by shutting down a channel when there is a period of inactivity solved my issue.--
On Sunday, June 26, 2016 at 1:06:06 AM UTC+9, Eric Anderson wrote:On Sat, Jun 25, 2016 at 4:36 AM, Taehyun Park <gold.d...@gmail.com> wrote:I'm using grpc java on Android and I found a very weird issue. After a certain period a ManagedChannel no longer works.Was that after a period of inactivity? Were you on good WiFi (one that you trust), bad WiFi, or cellular?I instantiated a ManagedChannel when there is no cached channel then cache it until the number of active channels is 0. My app worked fine and didn't have a problem when it's launched. but all grpc calls stopped working after a certain period. The app wasn't closed but it was in a backstack.I searched a similar issue in grpc issue tracker on github but I'm not sure if https://github.com/grpc/grpc-java/issues/1636 and https://github.com/grpc/grpc-java/issues/1648 are the issue I'm having.When discussing keepalive, the general assumption is the network misbehaved (which is not uncommon on mobile). Keepalive is only going to be active when an RPC is outstanding. That means that it will need to be combined with channel idleness to close TCP connections after inactivity.Both are planned for 1.0 in order to give a full solution to this sort of issue (assuming that failures are due to poor networks). Idleness in general is useful. With it you really don't have much reason to cache the channel like you were. You could create the channel eagerly (which starts IDLE) and the channel can release resources when there is a period of inactivity.
You received this message because you are subscribed to the Google Groups "grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email to grpc-io+u...@googlegroups.com.
It sends a GO_AWAY packet when the status is changed to IDLE. Do I have to release this channel or is it safe to reuse this channel? If I can reuse the channel, it looks like I no longer need to release the channel.
I had to restore my own timer which releases a channel because auto-idle still caused the same problem. The grpc calls still didn't go through after a certain period so I guess releasing a channel is the only way if I don't want to use keepalive.
I lazily create my stub, so I've tried checking if stub is disconnected, and creating a new one in that case, but I'm still not winning. Is there some solution that you or anyone else could suggest?