From 02ea99254a4fd00779261c962ffbc6fcf8aa696d Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 6 Aug 2019 14:10:26 -0400 Subject: [PATCH] Reset message receiver upon REST failure. We've been seeing a lot of socket timeouts on REST requests under certain conditions. The issue seems to be a problem with the OkHttp client. Through testing, I've seen that resetting the receiver and retrying again seems to resolve most issues. --- .../dependencies/ApplicationDependencies.java | 5 +++++ .../thoughtcrime/securesms/gcm/FcmJobService.java | 2 +- src/org/thoughtcrime/securesms/gcm/FcmService.java | 2 +- src/org/thoughtcrime/securesms/gcm/RestStrategy.java | 12 ++---------- .../securesms/jobs/PushNotificationReceiveJob.java | 2 +- .../securesms/service/IncomingMessageObserver.java | 4 ++-- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java b/src/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java index c601841be8..e6d5209cff 100644 --- a/src/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java +++ b/src/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java @@ -75,6 +75,11 @@ public class ApplicationDependencies { return messageReceiver; } + public static synchronized void resetSignalServiceMessageReceiver() { + assertInitialization(); + messageReceiver = null; + } + public static synchronized @NonNull SignalServiceNetworkAccess getSignalServiceNetworkAccess() { assertInitialization(); return provider.provideSignalServiceNetworkAccess(); diff --git a/src/org/thoughtcrime/securesms/gcm/FcmJobService.java b/src/org/thoughtcrime/securesms/gcm/FcmJobService.java index 5c5c1fc149..25c0bf9654 100644 --- a/src/org/thoughtcrime/securesms/gcm/FcmJobService.java +++ b/src/org/thoughtcrime/securesms/gcm/FcmJobService.java @@ -49,7 +49,7 @@ public class FcmJobService extends JobService { SignalExecutors.UNBOUNDED.execute(() -> { Context context = getApplicationContext(); MessageRetriever retriever = ApplicationDependencies.getMessageRetriever(); - boolean success = retriever.retrieveMessages(context, new RestStrategy(context)); + boolean success = retriever.retrieveMessages(context, new RestStrategy(), new RestStrategy()); if (success) { Log.i(TAG, "Successfully retrieved messages."); diff --git a/src/org/thoughtcrime/securesms/gcm/FcmService.java b/src/org/thoughtcrime/securesms/gcm/FcmService.java index 85e14c4631..8d9040a13a 100644 --- a/src/org/thoughtcrime/securesms/gcm/FcmService.java +++ b/src/org/thoughtcrime/securesms/gcm/FcmService.java @@ -49,7 +49,7 @@ public class FcmService extends FirebaseMessagingService { private static void handleReceivedNotification(Context context) { MessageRetriever retriever = ApplicationDependencies.getMessageRetriever(); - boolean success = retriever.retrieveMessages(context, new RestStrategy(context)); + boolean success = retriever.retrieveMessages(context, new RestStrategy(), new RestStrategy()); if (success) { Log.i(TAG, "Successfully retrieved messages."); diff --git a/src/org/thoughtcrime/securesms/gcm/RestStrategy.java b/src/org/thoughtcrime/securesms/gcm/RestStrategy.java index c9fe6a647f..e0a8583353 100644 --- a/src/org/thoughtcrime/securesms/gcm/RestStrategy.java +++ b/src/org/thoughtcrime/securesms/gcm/RestStrategy.java @@ -1,14 +1,11 @@ package org.thoughtcrime.securesms.gcm; -import android.content.Context; - import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; import org.thoughtcrime.securesms.IncomingMessageProcessor; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.logging.Log; -import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.signalservice.api.SignalServiceMessageReceiver; import java.io.IOException; @@ -23,12 +20,6 @@ public class RestStrategy implements MessageRetriever.Strategy { private static final long SOCKET_TIMEOUT = TimeUnit.SECONDS.toMillis(10); - private final Context context; - - public RestStrategy(@NonNull Context context) { - this.context = context; - } - @WorkerThread @Override public boolean run() { @@ -46,7 +37,8 @@ public class RestStrategy implements MessageRetriever.Strategy { return true; } catch (IOException e) { - Log.w(TAG, "Failed to retrieve messages.", e); + Log.w(TAG, "Failed to retrieve messages. Resetting the SignalServiceMessageReceiver.", e); + ApplicationDependencies.resetSignalServiceMessageReceiver(); return false; } } diff --git a/src/org/thoughtcrime/securesms/jobs/PushNotificationReceiveJob.java b/src/org/thoughtcrime/securesms/jobs/PushNotificationReceiveJob.java index da3199ca71..a039a53339 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushNotificationReceiveJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushNotificationReceiveJob.java @@ -47,7 +47,7 @@ public class PushNotificationReceiveJob extends BaseJob { @Override public void onRun() throws IOException { MessageRetriever retriever = ApplicationDependencies.getMessageRetriever(); - boolean result = retriever.retrieveMessages(context, new RestStrategy(context)); + boolean result = retriever.retrieveMessages(context, new RestStrategy()); if (result) { Log.i(TAG, "Successfully pulled messages."); diff --git a/src/org/thoughtcrime/securesms/service/IncomingMessageObserver.java b/src/org/thoughtcrime/securesms/service/IncomingMessageObserver.java index af3e707a73..c98a4c1b66 100644 --- a/src/org/thoughtcrime/securesms/service/IncomingMessageObserver.java +++ b/src/org/thoughtcrime/securesms/service/IncomingMessageObserver.java @@ -43,7 +43,6 @@ public class IncomingMessageObserver implements ConstraintObserver.Notifier { private final Context context; private final NetworkConstraint networkConstraint; - private final SignalServiceMessageReceiver receiver; private final SignalServiceNetworkAccess networkAccess; private boolean appVisible; @@ -52,7 +51,6 @@ public class IncomingMessageObserver implements ConstraintObserver.Notifier { public IncomingMessageObserver(@NonNull Context context) { this.context = context; this.networkConstraint = new NetworkConstraint.Factory(ApplicationContext.getInstance(context)).create(); - this.receiver = ApplicationDependencies.getSignalServiceMessageReceiver(); this.networkAccess = ApplicationDependencies.getSignalServiceNetworkAccess(); new NetworkConstraintObserver(ApplicationContext.getInstance(context)).register(this); @@ -144,6 +142,8 @@ public class IncomingMessageObserver implements ConstraintObserver.Notifier { waitForConnectionNecessary(); Log.i(TAG, "Making websocket connection...."); + SignalServiceMessageReceiver receiver = ApplicationDependencies.getSignalServiceMessageReceiver(); + pipe = receiver.createMessagePipe(); unidentifiedPipe = receiver.createUnidentifiedMessagePipe();