Ensure blobs from old sessions are deleted before creating new ones.

There was a race condition where if you created a blob super-early in
the application lifecycle, you could create it *before* we deleted the
blobs from the previous session, leading you to lose the blob you just
created immediately.

In an effort to protect our cold start time, I just made a little
initialization flow where read/write calls to BlobProvider will block
until it's deleted blobs from the old session.
This commit is contained in:
Greyson Parrelli
2021-02-24 16:04:58 -05:00
committed by GitHub
parent da56c2790f
commit 32ac6e3429
2 changed files with 49 additions and 11 deletions

View File

@@ -145,6 +145,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr
Conscrypt.setUseEngineSocketByDefault(true);
}
})
.addBlocking("blob-provider", this::initializeBlobProvider)
.addNonBlocking(this::initializeRevealableMessageManager)
.addNonBlocking(this::initializeGcmCheck)
.addNonBlocking(this::initializeSignedPreKeyCheck)
@@ -158,7 +159,6 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr
.addNonBlocking(StorageSyncHelper::scheduleRoutineSync)
.addNonBlocking(() -> ApplicationDependencies.getJobManager().beginJobLoop())
.addPostRender(this::initializeExpiringMessageManager)
.addPostRender(this::initializeBlobProvider)
.execute();
Log.d(TAG, "onCreate() took " + (System.currentTimeMillis() - startTime) + " ms");
@@ -387,7 +387,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr
@WorkerThread
private void initializeBlobProvider() {
BlobProvider.getInstance().onSessionStart(this);
BlobProvider.getInstance().initialize(this);
}
@WorkerThread