Merge "Prevent concurrent backup operations"
This commit is contained in:
committed by
Android (Google) Code Review
commit
0ded8c8a56
@@ -228,6 +228,7 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
// completed.
|
// completed.
|
||||||
final Object mAgentConnectLock = new Object();
|
final Object mAgentConnectLock = new Object();
|
||||||
IBackupAgent mConnectedAgent;
|
IBackupAgent mConnectedAgent;
|
||||||
|
volatile boolean mBackupRunning;
|
||||||
volatile boolean mConnecting;
|
volatile boolean mConnecting;
|
||||||
volatile long mLastBackupPass;
|
volatile long mLastBackupPass;
|
||||||
volatile long mNextBackupPass;
|
volatile long mNextBackupPass;
|
||||||
@@ -434,6 +435,9 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
IBackupTransport transport = getTransport(mCurrentTransport);
|
IBackupTransport transport = getTransport(mCurrentTransport);
|
||||||
if (transport == null) {
|
if (transport == null) {
|
||||||
Slog.v(TAG, "Backup requested but no transport available");
|
Slog.v(TAG, "Backup requested but no transport available");
|
||||||
|
synchronized (mQueueLock) {
|
||||||
|
mBackupRunning = false;
|
||||||
|
}
|
||||||
mWakelock.release();
|
mWakelock.release();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -470,6 +474,9 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
sendMessage(pbtMessage);
|
sendMessage(pbtMessage);
|
||||||
} else {
|
} else {
|
||||||
Slog.v(TAG, "Backup requested but nothing pending");
|
Slog.v(TAG, "Backup requested but nothing pending");
|
||||||
|
synchronized (mQueueLock) {
|
||||||
|
mBackupRunning = false;
|
||||||
|
}
|
||||||
mWakelock.release();
|
mWakelock.release();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -804,14 +811,19 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
// Don't run backups now if we're disabled or not yet
|
// Don't run backups now if we're disabled or not yet
|
||||||
// fully set up.
|
// fully set up.
|
||||||
if (mEnabled && mProvisioned) {
|
if (mEnabled && mProvisioned) {
|
||||||
if (DEBUG) Slog.v(TAG, "Running a backup pass");
|
if (!mBackupRunning) {
|
||||||
|
if (DEBUG) Slog.v(TAG, "Running a backup pass");
|
||||||
|
|
||||||
// Acquire the wakelock and pass it to the backup thread. it will
|
// Acquire the wakelock and pass it to the backup thread. it will
|
||||||
// be released once backup concludes.
|
// be released once backup concludes.
|
||||||
mWakelock.acquire();
|
mBackupRunning = true;
|
||||||
|
mWakelock.acquire();
|
||||||
|
|
||||||
Message msg = mBackupHandler.obtainMessage(MSG_RUN_BACKUP);
|
Message msg = mBackupHandler.obtainMessage(MSG_RUN_BACKUP);
|
||||||
mBackupHandler.sendMessage(msg);
|
mBackupHandler.sendMessage(msg);
|
||||||
|
} else {
|
||||||
|
Slog.i(TAG, "Backup time but one already running");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Slog.w(TAG, "Backup pass but e=" + mEnabled + " p=" + mProvisioned);
|
Slog.w(TAG, "Backup pass but e=" + mEnabled + " p=" + mProvisioned);
|
||||||
}
|
}
|
||||||
@@ -1948,9 +1960,14 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
writeRestoreTokens();
|
writeRestoreTokens();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up the next backup pass
|
// Set up the next backup pass - at this point we can set mBackupRunning
|
||||||
if (mStatus == BackupConstants.TRANSPORT_NOT_INITIALIZED) {
|
// to false to allow another pass to fire, because we're done with the
|
||||||
backupNow();
|
// state machine sequence and the wakelock is refcounted.
|
||||||
|
synchronized (mQueueLock) {
|
||||||
|
mBackupRunning = false;
|
||||||
|
if (mStatus == BackupConstants.TRANSPORT_NOT_INITIALIZED) {
|
||||||
|
backupNow();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only once we're entirely finished do we release the wakelock
|
// Only once we're entirely finished do we release the wakelock
|
||||||
@@ -2400,8 +2417,8 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
mLatchObject.notifyAll();
|
mLatchObject.notifyAll();
|
||||||
}
|
}
|
||||||
sendEndBackup();
|
sendEndBackup();
|
||||||
mWakelock.release();
|
|
||||||
if (DEBUG) Slog.d(TAG, "Full backup pass complete.");
|
if (DEBUG) Slog.d(TAG, "Full backup pass complete.");
|
||||||
|
mWakelock.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2908,8 +2925,8 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
mLatchObject.notifyAll();
|
mLatchObject.notifyAll();
|
||||||
}
|
}
|
||||||
sendEndRestore();
|
sendEndRestore();
|
||||||
mWakelock.release();
|
|
||||||
Slog.d(TAG, "Full restore pass complete.");
|
Slog.d(TAG, "Full restore pass complete.");
|
||||||
|
mWakelock.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5630,7 +5647,8 @@ class BackupManagerService extends IBackupManager.Stub {
|
|||||||
+ " / " + (!mProvisioned ? "not " : "") + "provisioned / "
|
+ " / " + (!mProvisioned ? "not " : "") + "provisioned / "
|
||||||
+ (this.mPendingInits.size() == 0 ? "not " : "") + "pending init");
|
+ (this.mPendingInits.size() == 0 ? "not " : "") + "pending init");
|
||||||
pw.println("Auto-restore is " + (mAutoRestore ? "enabled" : "disabled"));
|
pw.println("Auto-restore is " + (mAutoRestore ? "enabled" : "disabled"));
|
||||||
pw.println("Last backup pass: " + mLastBackupPass
|
if (mBackupRunning) pw.println("Backup currently running");
|
||||||
|
pw.println("Last backup pass started: " + mLastBackupPass
|
||||||
+ " (now = " + System.currentTimeMillis() + ')');
|
+ " (now = " + System.currentTimeMillis() + ')');
|
||||||
pw.println(" next scheduled: " + mNextBackupPass);
|
pw.println(" next scheduled: " + mNextBackupPass);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user