Skip to content

Commit 53121e2

Browse files
committed
timeout race for 10 sec
1 parent e896ac4 commit 53121e2

File tree

3 files changed

+48
-31
lines changed

3 files changed

+48
-31
lines changed

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ private void persistEvent(
341341
if (!isFatal) {
342342
crashlyticsWorkers.diskWrite.submit(
343343
() -> {
344+
Logger.getLogger().d("disk worker: log non-fatal event to persistence");
344345
reportPersistence.persistEvent(finallizedEvent, sessionId, isHighPriority);
345346
});
346347
return;

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/concurrency/CrashlyticsTasks.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@
2121
import com.google.android.gms.tasks.Task;
2222
import com.google.android.gms.tasks.TaskCompletionSource;
2323
import com.google.android.gms.tasks.Tasks;
24+
import com.google.firebase.crashlytics.internal.Logger;
25+
import java.util.Timer;
26+
import java.util.TimerTask;
2427
import java.util.concurrent.Executor;
28+
import java.util.concurrent.TimeoutException;
2529
import java.util.concurrent.atomic.AtomicBoolean;
2630

2731
/**
@@ -41,6 +45,7 @@ public final class CrashlyticsTasks {
4145
public static <T> Task<T> race(Task<T> task1, Task<T> task2) {
4246
CancellationTokenSource cancellation = new CancellationTokenSource();
4347
TaskCompletionSource<T> result = new TaskCompletionSource<>(cancellation.getToken());
48+
Timer timer = new Timer();
4449

4550
AtomicBoolean otherTaskCancelled = new AtomicBoolean(false);
4651

@@ -62,6 +67,15 @@ public static <T> Task<T> race(Task<T> task1, Task<T> task2) {
6267
task1.continueWithTask(DIRECT, continuation);
6368
task2.continueWithTask(DIRECT, continuation);
6469

70+
timer.schedule(
71+
new TimerTask() {
72+
@Override
73+
public void run() {
74+
Logger.getLogger().d("Race gets timed out");
75+
result.trySetException(new TimeoutException("Race result gets timed out"));
76+
}
77+
},
78+
10 * 1000);
6579
return result.getTask();
6680
}
6781

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/settings/SettingsController.java

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
import android.content.Context;
1919
import android.content.SharedPreferences;
2020
import androidx.annotation.NonNull;
21-
import androidx.annotation.Nullable;
22-
import com.google.android.gms.tasks.SuccessContinuation;
21+
import com.google.android.gms.tasks.Continuation;
2322
import com.google.android.gms.tasks.Task;
2423
import com.google.android.gms.tasks.TaskCompletionSource;
2524
import com.google.android.gms.tasks.Tasks;
@@ -190,38 +189,41 @@ public Task<Void> loadSettingsData(
190189
// TODO(mrober): Refactor to call worker directly, not expose executor.
191190
return dataCollectionArbiter
192191
.waitForDataCollectionPermission()
193-
.onSuccessTask(
192+
.continueWithTask(
194193
crashlyticsWorkers.common,
195-
new SuccessContinuation<Void, Void>() {
196-
@NonNull
194+
new Continuation<Void, Task<Void>>() {
197195
@Override
198-
public Task<Void> then(@Nullable Void aVoid) throws Exception {
199-
// Waited for data collection permission, so this is safe.
200-
final boolean dataCollectionToken = true;
201-
Future<JSONObject> settingsFuture =
202-
crashlyticsWorkers
203-
.network
204-
.getExecutor()
205-
.submit(() -> settingsSpiCall.invoke(settingsRequest, dataCollectionToken));
206-
// TODO(mrober): Should we add a timeout here, or let the entire init timeout?
207-
JSONObject settingsJson = settingsFuture.get();
208-
209-
if (settingsJson != null) {
210-
final Settings fetchedSettings =
211-
settingsJsonParser.parseSettingsJson(settingsJson);
212-
cachedSettingsIo.writeCachedSettings(
213-
fetchedSettings.expiresAtMillis, settingsJson);
214-
logSettings(settingsJson, "Loaded settings: ");
215-
216-
setStoredBuildInstanceIdentifier(settingsRequest.instanceId);
217-
218-
// Update the regular settings.
219-
settings.set(fetchedSettings);
220-
221-
// Signal the Task that we have a new valid settings
222-
settingsTask.get().trySetResult(fetchedSettings);
196+
public Task<Void> then(@NonNull Task<Void> task) throws Exception {
197+
if (task.isSuccessful()) {
198+
final boolean dataCollectionToken = true;
199+
Future<JSONObject> settingsFuture =
200+
crashlyticsWorkers
201+
.network
202+
.getExecutor()
203+
.submit(
204+
() -> settingsSpiCall.invoke(settingsRequest, dataCollectionToken));
205+
// TODO(mrober): Should we add a timeout here, or let the entire init timeout?
206+
JSONObject settingsJson = settingsFuture.get();
207+
208+
if (settingsJson != null) {
209+
final Settings fetchedSettings =
210+
settingsJsonParser.parseSettingsJson(settingsJson);
211+
cachedSettingsIo.writeCachedSettings(
212+
fetchedSettings.expiresAtMillis, settingsJson);
213+
logSettings(settingsJson, "Loaded settings: ");
214+
215+
setStoredBuildInstanceIdentifier(settingsRequest.instanceId);
216+
217+
// Update the regular settings.
218+
settings.set(fetchedSettings);
219+
220+
// Signal the Task that we have a new valid settings
221+
settingsTask.get().trySetResult(fetchedSettings);
222+
return Tasks.forResult(null);
223+
}
223224
}
224-
225+
Logger.getLogger().d("waitForDataCollectionPermission failed, set setting to null");
226+
settingsTask.get().trySetResult(null);
225227
return Tasks.forResult(null);
226228
}
227229
});

0 commit comments

Comments
 (0)