Don't hold the backup queue lock across a backup operation
This got lost in the shuffle when the backup process was retooled to run synchronously within a single spun-off HandlerThread. Formerly it was okay to hold the lock around the point in time when the backup service thread was being spun off, but once that became synchronous it wound up locking out apps' calls to dataChanged(), which in turn led to ANRs. Bug: 2421333 Change-Id: Icf378e5733af5f28a689c564494486cd3555eca7
This commit is contained in:
@ -258,8 +258,11 @@ class BackupManagerService extends IBackupManager.Stub {
|
||||
|
||||
// snapshot the pending-backup set and work on that
|
||||
ArrayList<BackupRequest> queue = new ArrayList<BackupRequest>();
|
||||
File oldJournal = mJournal;
|
||||
synchronized (mQueueLock) {
|
||||
// Do we have any work to do?
|
||||
// Do we have any work to do? Construct the work queue
|
||||
// then release the synchronization lock to actually run
|
||||
// the backup.
|
||||
if (mPendingBackups.size() > 0) {
|
||||
for (BackupRequest b: mPendingBackups.values()) {
|
||||
queue.add(b);
|
||||
@ -268,20 +271,22 @@ class BackupManagerService extends IBackupManager.Stub {
|
||||
mPendingBackups.clear();
|
||||
|
||||
// Start a new backup-queue journal file too
|
||||
File oldJournal = mJournal;
|
||||
mJournal = null;
|
||||
|
||||
// At this point, we have started a new journal file, and the old
|
||||
// file identity is being passed to the backup processing thread.
|
||||
// When it completes successfully, that old journal file will be
|
||||
// deleted. If we crash prior to that, the old journal is parsed
|
||||
// at next boot and the journaled requests fulfilled.
|
||||
(new PerformBackupTask(transport, queue, oldJournal)).run();
|
||||
} else {
|
||||
Log.v(TAG, "Backup requested but nothing pending");
|
||||
mWakelock.release();
|
||||
}
|
||||
}
|
||||
|
||||
if (queue.size() > 0) {
|
||||
// At this point, we have started a new journal file, and the old
|
||||
// file identity is being passed to the backup processing thread.
|
||||
// When it completes successfully, that old journal file will be
|
||||
// deleted. If we crash prior to that, the old journal is parsed
|
||||
// at next boot and the journaled requests fulfilled.
|
||||
(new PerformBackupTask(transport, queue, oldJournal)).run();
|
||||
} else {
|
||||
Log.v(TAG, "Backup requested but nothing pending");
|
||||
mWakelock.release();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user