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.
This commit is contained in:
Greyson Parrelli 2019-08-06 14:10:26 -04:00
parent 3849b46f0a
commit 02ea99254a
6 changed files with 12 additions and 15 deletions

View file

@ -75,6 +75,11 @@ public class ApplicationDependencies {
return messageReceiver; return messageReceiver;
} }
public static synchronized void resetSignalServiceMessageReceiver() {
assertInitialization();
messageReceiver = null;
}
public static synchronized @NonNull SignalServiceNetworkAccess getSignalServiceNetworkAccess() { public static synchronized @NonNull SignalServiceNetworkAccess getSignalServiceNetworkAccess() {
assertInitialization(); assertInitialization();
return provider.provideSignalServiceNetworkAccess(); return provider.provideSignalServiceNetworkAccess();

View file

@ -49,7 +49,7 @@ public class FcmJobService extends JobService {
SignalExecutors.UNBOUNDED.execute(() -> { SignalExecutors.UNBOUNDED.execute(() -> {
Context context = getApplicationContext(); Context context = getApplicationContext();
MessageRetriever retriever = ApplicationDependencies.getMessageRetriever(); MessageRetriever retriever = ApplicationDependencies.getMessageRetriever();
boolean success = retriever.retrieveMessages(context, new RestStrategy(context)); boolean success = retriever.retrieveMessages(context, new RestStrategy(), new RestStrategy());
if (success) { if (success) {
Log.i(TAG, "Successfully retrieved messages."); Log.i(TAG, "Successfully retrieved messages.");

View file

@ -49,7 +49,7 @@ public class FcmService extends FirebaseMessagingService {
private static void handleReceivedNotification(Context context) { private static void handleReceivedNotification(Context context) {
MessageRetriever retriever = ApplicationDependencies.getMessageRetriever(); MessageRetriever retriever = ApplicationDependencies.getMessageRetriever();
boolean success = retriever.retrieveMessages(context, new RestStrategy(context)); boolean success = retriever.retrieveMessages(context, new RestStrategy(), new RestStrategy());
if (success) { if (success) {
Log.i(TAG, "Successfully retrieved messages."); Log.i(TAG, "Successfully retrieved messages.");

View file

@ -1,14 +1,11 @@
package org.thoughtcrime.securesms.gcm; package org.thoughtcrime.securesms.gcm;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread; import androidx.annotation.WorkerThread;
import org.thoughtcrime.securesms.IncomingMessageProcessor; import org.thoughtcrime.securesms.IncomingMessageProcessor;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.signalservice.api.SignalServiceMessageReceiver; import org.whispersystems.signalservice.api.SignalServiceMessageReceiver;
import java.io.IOException; 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 static final long SOCKET_TIMEOUT = TimeUnit.SECONDS.toMillis(10);
private final Context context;
public RestStrategy(@NonNull Context context) {
this.context = context;
}
@WorkerThread @WorkerThread
@Override @Override
public boolean run() { public boolean run() {
@ -46,7 +37,8 @@ public class RestStrategy implements MessageRetriever.Strategy {
return true; return true;
} catch (IOException e) { } 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; return false;
} }
} }

View file

@ -47,7 +47,7 @@ public class PushNotificationReceiveJob extends BaseJob {
@Override @Override
public void onRun() throws IOException { public void onRun() throws IOException {
MessageRetriever retriever = ApplicationDependencies.getMessageRetriever(); MessageRetriever retriever = ApplicationDependencies.getMessageRetriever();
boolean result = retriever.retrieveMessages(context, new RestStrategy(context)); boolean result = retriever.retrieveMessages(context, new RestStrategy());
if (result) { if (result) {
Log.i(TAG, "Successfully pulled messages."); Log.i(TAG, "Successfully pulled messages.");

View file

@ -43,7 +43,6 @@ public class IncomingMessageObserver implements ConstraintObserver.Notifier {
private final Context context; private final Context context;
private final NetworkConstraint networkConstraint; private final NetworkConstraint networkConstraint;
private final SignalServiceMessageReceiver receiver;
private final SignalServiceNetworkAccess networkAccess; private final SignalServiceNetworkAccess networkAccess;
private boolean appVisible; private boolean appVisible;
@ -52,7 +51,6 @@ public class IncomingMessageObserver implements ConstraintObserver.Notifier {
public IncomingMessageObserver(@NonNull Context context) { public IncomingMessageObserver(@NonNull Context context) {
this.context = context; this.context = context;
this.networkConstraint = new NetworkConstraint.Factory(ApplicationContext.getInstance(context)).create(); this.networkConstraint = new NetworkConstraint.Factory(ApplicationContext.getInstance(context)).create();
this.receiver = ApplicationDependencies.getSignalServiceMessageReceiver();
this.networkAccess = ApplicationDependencies.getSignalServiceNetworkAccess(); this.networkAccess = ApplicationDependencies.getSignalServiceNetworkAccess();
new NetworkConstraintObserver(ApplicationContext.getInstance(context)).register(this); new NetworkConstraintObserver(ApplicationContext.getInstance(context)).register(this);
@ -144,6 +142,8 @@ public class IncomingMessageObserver implements ConstraintObserver.Notifier {
waitForConnectionNecessary(); waitForConnectionNecessary();
Log.i(TAG, "Making websocket connection...."); Log.i(TAG, "Making websocket connection....");
SignalServiceMessageReceiver receiver = ApplicationDependencies.getSignalServiceMessageReceiver();
pipe = receiver.createMessagePipe(); pipe = receiver.createMessagePipe();
unidentifiedPipe = receiver.createUnidentifiedMessagePipe(); unidentifiedPipe = receiver.createUnidentifiedMessagePipe();