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;
}
public static synchronized void resetSignalServiceMessageReceiver() {
assertInitialization();
messageReceiver = null;
}
public static synchronized @NonNull SignalServiceNetworkAccess getSignalServiceNetworkAccess() {
assertInitialization();
return provider.provideSignalServiceNetworkAccess();

View file

@ -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.");

View file

@ -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.");

View file

@ -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;
}
}

View file

@ -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.");

View file

@ -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();