Merge "DO NOT MERGE Update references to backup/restore agent timeouts" into pi-dev
This commit is contained in:
@@ -215,13 +215,6 @@ public class BackupManagerService implements BackupManagerServiceInterface {
|
||||
// Timeout interval for deciding that a bind or clear-data has taken too long
|
||||
private static final long TIMEOUT_INTERVAL = 10 * 1000;
|
||||
|
||||
// Timeout intervals for agent backup & restore operations
|
||||
public static final long TIMEOUT_BACKUP_INTERVAL = 30 * 1000;
|
||||
public static final long TIMEOUT_FULL_BACKUP_INTERVAL = 5 * 60 * 1000;
|
||||
public static final long TIMEOUT_SHARED_BACKUP_INTERVAL = 30 * 60 * 1000;
|
||||
public static final long TIMEOUT_RESTORE_INTERVAL = 60 * 1000;
|
||||
public static final long TIMEOUT_RESTORE_FINISHED_INTERVAL = 30 * 1000;
|
||||
|
||||
// User confirmation timeout for a full backup/restore operation. It's this long in
|
||||
// order to give them time to enter the backup password.
|
||||
private static final long TIMEOUT_FULL_CONFIRMATION = 60 * 1000;
|
||||
@@ -232,6 +225,7 @@ public class BackupManagerService implements BackupManagerServiceInterface {
|
||||
private static final int BUSY_BACKOFF_FUZZ = 1000 * 60 * 60 * 2; // two hours
|
||||
|
||||
private BackupManagerConstants mConstants;
|
||||
private BackupAgentTimeoutParameters mAgentTimeoutParameters;
|
||||
private Context mContext;
|
||||
private PackageManager mPackageManager;
|
||||
private IPackageManager mPackageManagerBinder;
|
||||
@@ -315,6 +309,10 @@ public class BackupManagerService implements BackupManagerServiceInterface {
|
||||
return mConstants;
|
||||
}
|
||||
|
||||
public BackupAgentTimeoutParameters getAgentTimeoutParameters() {
|
||||
return mAgentTimeoutParameters;
|
||||
}
|
||||
|
||||
public Context getContext() {
|
||||
return mContext;
|
||||
}
|
||||
@@ -856,6 +854,10 @@ public class BackupManagerService implements BackupManagerServiceInterface {
|
||||
// require frequent starting and stopping.
|
||||
mConstants.start();
|
||||
|
||||
mAgentTimeoutParameters = new
|
||||
BackupAgentTimeoutParameters(mBackupHandler, mContext.getContentResolver());
|
||||
mAgentTimeoutParameters.start();
|
||||
|
||||
// Set up the various sorts of package tracking we do
|
||||
mFullBackupScheduleFile = new File(mBaseStateDir, "fb-schedule");
|
||||
initPackageTracking();
|
||||
@@ -3407,7 +3409,7 @@ public class BackupManagerService implements BackupManagerServiceInterface {
|
||||
}
|
||||
mActiveRestoreSession = new ActiveRestoreSession(this, packageName, transport);
|
||||
mBackupHandler.sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT,
|
||||
TIMEOUT_RESTORE_INTERVAL);
|
||||
mAgentTimeoutParameters.getRestoreAgentTimeoutMillis());
|
||||
}
|
||||
return mActiveRestoreSession;
|
||||
}
|
||||
|
||||
@@ -191,4 +191,7 @@ public interface BackupManagerServiceInterface {
|
||||
void dump(FileDescriptor fd, PrintWriter pw, String[] args);
|
||||
|
||||
IBackupManager getBackupManagerBinder();
|
||||
|
||||
// Gets access to the backup/restore agent timeout parameters.
|
||||
BackupAgentTimeoutParameters getAgentTimeoutParameters();
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@ import static android.os.ParcelFileDescriptor.MODE_CREATE;
|
||||
import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
|
||||
import static android.os.ParcelFileDescriptor.MODE_READ_WRITE;
|
||||
import static android.os.ParcelFileDescriptor.MODE_TRUNCATE;
|
||||
|
||||
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
|
||||
import static com.android.server.backup.BackupManagerService.TIMEOUT_BACKUP_INTERVAL;
|
||||
|
||||
import android.app.ApplicationThreadConstants;
|
||||
import android.app.IBackupAgent;
|
||||
@@ -59,6 +59,7 @@ public class KeyValueAdbBackupEngine {
|
||||
private ParcelFileDescriptor mSavedState;
|
||||
private ParcelFileDescriptor mBackupData;
|
||||
private ParcelFileDescriptor mNewState;
|
||||
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
|
||||
|
||||
public KeyValueAdbBackupEngine(OutputStream output, PackageInfo packageInfo,
|
||||
BackupManagerServiceInterface backupManagerService, PackageManager packageManager,
|
||||
@@ -81,6 +82,7 @@ public class KeyValueAdbBackupEngine {
|
||||
pkg + BACKUP_KEY_VALUE_NEW_STATE_FILENAME_SUFFIX);
|
||||
|
||||
mManifestFile = new File(mDataDir, BackupManagerService.BACKUP_MANIFEST_FILENAME);
|
||||
mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
|
||||
}
|
||||
|
||||
public void backupOnePackage() throws IOException {
|
||||
@@ -148,8 +150,9 @@ public class KeyValueAdbBackupEngine {
|
||||
// Return true on backup success, false otherwise
|
||||
private boolean invokeAgentForAdbBackup(String packageName, IBackupAgent agent) {
|
||||
int token = mBackupManagerService.generateRandomIntegerToken();
|
||||
long kvBackupAgentTimeoutMillis = mAgentTimeoutParameters.getKvBackupAgentTimeoutMillis();
|
||||
try {
|
||||
mBackupManagerService.prepareOperationTimeout(token, TIMEOUT_BACKUP_INTERVAL, null,
|
||||
mBackupManagerService.prepareOperationTimeout(token, kvBackupAgentTimeoutMillis, null,
|
||||
OP_TYPE_BACKUP_WAIT);
|
||||
|
||||
// Start backup and wait for BackupManagerService to get callback for success or timeout
|
||||
@@ -231,14 +234,14 @@ public class KeyValueAdbBackupEngine {
|
||||
}
|
||||
|
||||
private void writeBackupData() throws IOException {
|
||||
|
||||
int token = mBackupManagerService.generateRandomIntegerToken();
|
||||
long kvBackupAgentTimeoutMillis = mAgentTimeoutParameters.getKvBackupAgentTimeoutMillis();
|
||||
|
||||
ParcelFileDescriptor[] pipes = null;
|
||||
try {
|
||||
pipes = ParcelFileDescriptor.createPipe();
|
||||
|
||||
mBackupManagerService.prepareOperationTimeout(token, TIMEOUT_BACKUP_INTERVAL, null,
|
||||
mBackupManagerService.prepareOperationTimeout(token, kvBackupAgentTimeoutMillis, null,
|
||||
OP_TYPE_BACKUP_WAIT);
|
||||
|
||||
// We will have to create a runnable that will read the manifest and backup data we
|
||||
|
||||
@@ -25,9 +25,6 @@ import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
|
||||
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
|
||||
import static com.android.server.backup.BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
|
||||
import static com.android.server.backup.BackupManagerService.TAG;
|
||||
import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
|
||||
import static com.android.server.backup.BackupManagerService
|
||||
.TIMEOUT_SHARED_BACKUP_INTERVAL;
|
||||
|
||||
import android.app.ApplicationThreadConstants;
|
||||
import android.app.IBackupAgent;
|
||||
@@ -45,8 +42,9 @@ import android.util.Slog;
|
||||
import android.util.StringBuilderPrinter;
|
||||
|
||||
import com.android.server.AppWidgetBackupBridge;
|
||||
import com.android.server.backup.BackupRestoreTask;
|
||||
import com.android.server.backup.BackupAgentTimeoutParameters;
|
||||
import com.android.server.backup.BackupManagerService;
|
||||
import com.android.server.backup.BackupRestoreTask;
|
||||
import com.android.server.backup.utils.FullBackupUtils;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
@@ -75,6 +73,7 @@ public class FullBackupEngine {
|
||||
private final long mQuota;
|
||||
private final int mOpToken;
|
||||
private final int mTransportFlags;
|
||||
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
|
||||
|
||||
class FullBackupRunner implements Runnable {
|
||||
|
||||
@@ -137,8 +136,8 @@ public class FullBackupEngine {
|
||||
final boolean isSharedStorage =
|
||||
mPackage.packageName.equals(SHARED_BACKUP_AGENT_PACKAGE);
|
||||
final long timeout = isSharedStorage ?
|
||||
TIMEOUT_SHARED_BACKUP_INTERVAL :
|
||||
TIMEOUT_FULL_BACKUP_INTERVAL;
|
||||
mAgentTimeoutParameters.getSharedBackupAgentTimeoutMillis() :
|
||||
mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
|
||||
|
||||
if (DEBUG) {
|
||||
Slog.d(TAG, "Calling doFullBackup() on " + mPackage.packageName);
|
||||
@@ -180,6 +179,7 @@ public class FullBackupEngine {
|
||||
mQuota = quota;
|
||||
mOpToken = opToken;
|
||||
mTransportFlags = transportFlags;
|
||||
mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
|
||||
}
|
||||
|
||||
public int preflightCheck() throws RemoteException {
|
||||
|
||||
@@ -19,7 +19,6 @@ package com.android.server.backup.fullbackup;
|
||||
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
|
||||
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
|
||||
import static com.android.server.backup.BackupManagerService.TAG;
|
||||
import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
|
||||
|
||||
import android.app.backup.IBackupManager;
|
||||
import android.content.ComponentName;
|
||||
@@ -33,6 +32,7 @@ import android.os.UserHandle;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.internal.backup.IObbBackupService;
|
||||
import com.android.server.backup.BackupAgentTimeoutParameters;
|
||||
import com.android.server.backup.BackupManagerService;
|
||||
import com.android.server.backup.utils.FullBackupUtils;
|
||||
|
||||
@@ -46,10 +46,12 @@ public class FullBackupObbConnection implements ServiceConnection {
|
||||
|
||||
private BackupManagerService backupManagerService;
|
||||
volatile IObbBackupService mService;
|
||||
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
|
||||
|
||||
public FullBackupObbConnection(BackupManagerService backupManagerService) {
|
||||
this.backupManagerService = backupManagerService;
|
||||
mService = null;
|
||||
mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
|
||||
}
|
||||
|
||||
public void establish() {
|
||||
@@ -75,8 +77,10 @@ public class FullBackupObbConnection implements ServiceConnection {
|
||||
try {
|
||||
pipes = ParcelFileDescriptor.createPipe();
|
||||
int token = backupManagerService.generateRandomIntegerToken();
|
||||
long fullBackupAgentTimeoutMillis =
|
||||
mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
|
||||
backupManagerService.prepareOperationTimeout(
|
||||
token, TIMEOUT_FULL_BACKUP_INTERVAL, null, OP_TYPE_BACKUP_WAIT);
|
||||
token, fullBackupAgentTimeoutMillis, null, OP_TYPE_BACKUP_WAIT);
|
||||
mService.backupObbs(pkg.packageName, pipes[1], token,
|
||||
backupManagerService.getBackupManagerBinder());
|
||||
FullBackupUtils.routeSocketDataToOutput(pipes[0], out);
|
||||
|
||||
@@ -22,7 +22,6 @@ import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
|
||||
import static com.android.server.backup.BackupManagerService.OP_PENDING;
|
||||
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP;
|
||||
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
|
||||
import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.app.IBackupAgent;
|
||||
@@ -44,6 +43,7 @@ import android.util.Slog;
|
||||
|
||||
import com.android.internal.backup.IBackupTransport;
|
||||
import com.android.server.EventLogTags;
|
||||
import com.android.server.backup.BackupAgentTimeoutParameters;
|
||||
import com.android.server.backup.BackupRestoreTask;
|
||||
import com.android.server.backup.FullBackupJob;
|
||||
import com.android.server.backup.BackupManagerService;
|
||||
@@ -146,6 +146,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
|
||||
private volatile boolean mIsDoingBackup;
|
||||
private volatile boolean mCancelAll;
|
||||
private final int mCurrentOpToken;
|
||||
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
|
||||
|
||||
public PerformFullTransportBackupTask(BackupManagerService backupManagerService,
|
||||
TransportClient transportClient,
|
||||
@@ -167,6 +168,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
|
||||
mUserInitiated = userInitiated;
|
||||
mCurrentOpToken = backupManagerService.generateRandomIntegerToken();
|
||||
mBackupRunnerOpToken = backupManagerService.generateRandomIntegerToken();
|
||||
mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
|
||||
|
||||
if (backupManagerService.isBackupOperationInProgress()) {
|
||||
if (DEBUG) {
|
||||
@@ -698,9 +700,11 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
|
||||
@Override
|
||||
public int preflightFullBackup(PackageInfo pkg, IBackupAgent agent) {
|
||||
int result;
|
||||
long fullBackupAgentTimeoutMillis =
|
||||
mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
|
||||
try {
|
||||
backupManagerService.prepareOperationTimeout(
|
||||
mCurrentOpToken, TIMEOUT_FULL_BACKUP_INTERVAL, this, OP_TYPE_BACKUP_WAIT);
|
||||
mCurrentOpToken, fullBackupAgentTimeoutMillis, this, OP_TYPE_BACKUP_WAIT);
|
||||
backupManagerService.addBackupTrace("preflighting");
|
||||
if (MORE_DEBUG) {
|
||||
Slog.d(TAG, "Preflighting full payload of " + pkg.packageName);
|
||||
@@ -713,7 +717,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
|
||||
// timeout had been produced. In case of a real backstop timeout, mResult
|
||||
// will still contain the value it was constructed with, AGENT_ERROR, which
|
||||
// intentionaly falls into the "just report failure" code.
|
||||
mLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
|
||||
mLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
|
||||
|
||||
long totalSize = mResult.get();
|
||||
// If preflight timed out, mResult will contain error code as int.
|
||||
@@ -769,8 +773,10 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
|
||||
|
||||
@Override
|
||||
public long getExpectedSizeOrErrorCode() {
|
||||
long fullBackupAgentTimeoutMillis =
|
||||
mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
|
||||
try {
|
||||
mLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
|
||||
mLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
|
||||
return mResult.get();
|
||||
} catch (InterruptedException e) {
|
||||
return BackupTransport.NO_MORE_DATA;
|
||||
@@ -863,8 +869,10 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
|
||||
// If preflight succeeded, returns positive number - preflight size,
|
||||
// otherwise return negative error code.
|
||||
long getPreflightResultBlocking() {
|
||||
long fullBackupAgentTimeoutMillis =
|
||||
mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
|
||||
try {
|
||||
mPreflightLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
|
||||
mPreflightLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
|
||||
if (mIsCancelled) {
|
||||
return BackupManager.ERROR_BACKUP_CANCELLED;
|
||||
}
|
||||
@@ -879,8 +887,10 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
|
||||
}
|
||||
|
||||
int getBackupResultBlocking() {
|
||||
long fullBackupAgentTimeoutMillis =
|
||||
mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
|
||||
try {
|
||||
mBackupLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
|
||||
mBackupLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
|
||||
if (mIsCancelled) {
|
||||
return BackupManager.ERROR_BACKUP_CANCELLED;
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ package com.android.server.backup.internal;
|
||||
import static com.android.server.backup.BackupManagerService.DEBUG;
|
||||
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
|
||||
import static com.android.server.backup.BackupManagerService.TAG;
|
||||
import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
|
||||
|
||||
import android.app.backup.RestoreSet;
|
||||
import android.content.Intent;
|
||||
@@ -34,6 +33,7 @@ import android.util.Slog;
|
||||
|
||||
import com.android.internal.backup.IBackupTransport;
|
||||
import com.android.server.EventLogTags;
|
||||
import com.android.server.backup.BackupAgentTimeoutParameters;
|
||||
import com.android.server.backup.BackupManagerService;
|
||||
import com.android.server.backup.BackupRestoreTask;
|
||||
import com.android.server.backup.DataChangedJournal;
|
||||
@@ -81,10 +81,12 @@ public class BackupHandler extends Handler {
|
||||
public static final int MSG_OP_COMPLETE = 21;
|
||||
|
||||
private final BackupManagerService backupManagerService;
|
||||
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
|
||||
|
||||
public BackupHandler(BackupManagerService backupManagerService, Looper looper) {
|
||||
super(looper);
|
||||
this.backupManagerService = backupManagerService;
|
||||
mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
|
||||
}
|
||||
|
||||
public void handleMessage(Message msg) {
|
||||
@@ -322,7 +324,8 @@ public class BackupHandler extends Handler {
|
||||
|
||||
// Done: reset the session timeout clock
|
||||
removeMessages(MSG_RESTORE_SESSION_TIMEOUT);
|
||||
sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT, TIMEOUT_RESTORE_INTERVAL);
|
||||
sendEmptyMessageDelayed(MSG_RESTORE_SESSION_TIMEOUT,
|
||||
mAgentTimeoutParameters.getRestoreAgentTimeoutMillis());
|
||||
|
||||
params.listener.onFinished(callerLogString);
|
||||
}
|
||||
|
||||
@@ -24,7 +24,6 @@ import static com.android.server.backup.BackupManagerService.OP_PENDING;
|
||||
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP;
|
||||
import static com.android.server.backup.BackupManagerService.OP_TYPE_BACKUP_WAIT;
|
||||
import static com.android.server.backup.BackupManagerService.PACKAGE_MANAGER_SENTINEL;
|
||||
import static com.android.server.backup.BackupManagerService.TIMEOUT_BACKUP_INTERVAL;
|
||||
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_OPERATION_TIMEOUT;
|
||||
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_RESTORE_STEP;
|
||||
|
||||
@@ -57,6 +56,7 @@ import com.android.internal.annotations.GuardedBy;
|
||||
import com.android.internal.backup.IBackupTransport;
|
||||
import com.android.server.AppWidgetBackupBridge;
|
||||
import com.android.server.EventLogTags;
|
||||
import com.android.server.backup.BackupAgentTimeoutParameters;
|
||||
import com.android.server.backup.BackupRestoreTask;
|
||||
import com.android.server.backup.DataChangedJournal;
|
||||
import com.android.server.backup.KeyValueBackupJob;
|
||||
@@ -142,6 +142,7 @@ public class PerformBackupTask implements BackupRestoreTask {
|
||||
private boolean mFinished;
|
||||
private final boolean mUserInitiated;
|
||||
private final boolean mNonIncremental;
|
||||
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
|
||||
|
||||
private volatile boolean mCancelAll;
|
||||
|
||||
@@ -162,6 +163,7 @@ public class PerformBackupTask implements BackupRestoreTask {
|
||||
mPendingFullBackups = pendingFullBackups;
|
||||
mUserInitiated = userInitiated;
|
||||
mNonIncremental = nonIncremental;
|
||||
mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
|
||||
|
||||
mStateDir = new File(backupManagerService.getBaseStateDir(), dirName);
|
||||
mCurrentOpToken = backupManagerService.generateRandomIntegerToken();
|
||||
@@ -711,8 +713,10 @@ public class PerformBackupTask implements BackupRestoreTask {
|
||||
|
||||
// Initiate the target's backup pass
|
||||
backupManagerService.addBackupTrace("setting timeout");
|
||||
long kvBackupAgentTimeoutMillis =
|
||||
mAgentTimeoutParameters.getKvBackupAgentTimeoutMillis();
|
||||
backupManagerService.prepareOperationTimeout(
|
||||
mEphemeralOpToken, TIMEOUT_BACKUP_INTERVAL, this, OP_TYPE_BACKUP_WAIT);
|
||||
mEphemeralOpToken, kvBackupAgentTimeoutMillis, this, OP_TYPE_BACKUP_WAIT);
|
||||
backupManagerService.addBackupTrace("calling agent doBackup()");
|
||||
|
||||
agent.doBackup(
|
||||
|
||||
@@ -18,10 +18,10 @@ package com.android.server.backup.restore;
|
||||
|
||||
import static com.android.server.backup.BackupManagerService.DEBUG;
|
||||
import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
|
||||
import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
|
||||
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.backup.BackupAgentTimeoutParameters;
|
||||
import com.android.server.backup.BackupManagerService;
|
||||
import com.android.server.backup.BackupRestoreTask;
|
||||
|
||||
@@ -37,18 +37,22 @@ public class AdbRestoreFinishedLatch implements BackupRestoreTask {
|
||||
private BackupManagerService backupManagerService;
|
||||
final CountDownLatch mLatch;
|
||||
private final int mCurrentOpToken;
|
||||
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
|
||||
|
||||
public AdbRestoreFinishedLatch(BackupManagerService backupManagerService,
|
||||
int currentOpToken) {
|
||||
this.backupManagerService = backupManagerService;
|
||||
mLatch = new CountDownLatch(1);
|
||||
mCurrentOpToken = currentOpToken;
|
||||
mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
|
||||
}
|
||||
|
||||
void await() {
|
||||
boolean latched = false;
|
||||
long fullBackupAgentTimeoutMillis =
|
||||
mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
|
||||
try {
|
||||
latched = mLatch.await(TIMEOUT_FULL_BACKUP_INTERVAL, TimeUnit.MILLISECONDS);
|
||||
latched = mLatch.await(fullBackupAgentTimeoutMillis, TimeUnit.MILLISECONDS);
|
||||
} catch (InterruptedException e) {
|
||||
Slog.w(TAG, "Interrupted!");
|
||||
}
|
||||
|
||||
@@ -23,9 +23,6 @@ import static com.android.server.backup.BackupManagerService.MORE_DEBUG;
|
||||
import static com.android.server.backup.BackupManagerService.OP_TYPE_RESTORE_WAIT;
|
||||
import static com.android.server.backup.BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
|
||||
import static com.android.server.backup.BackupManagerService.TAG;
|
||||
import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
|
||||
import static com.android.server.backup.BackupManagerService
|
||||
.TIMEOUT_SHARED_BACKUP_INTERVAL;
|
||||
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_OPERATION_TIMEOUT;
|
||||
|
||||
import android.app.ApplicationThreadConstants;
|
||||
@@ -43,10 +40,11 @@ import android.os.RemoteException;
|
||||
import android.util.Slog;
|
||||
|
||||
import com.android.server.LocalServices;
|
||||
import com.android.server.backup.BackupAgentTimeoutParameters;
|
||||
import com.android.server.backup.BackupManagerService;
|
||||
import com.android.server.backup.BackupRestoreTask;
|
||||
import com.android.server.backup.FileMetadata;
|
||||
import com.android.server.backup.KeyValueAdbRestoreEngine;
|
||||
import com.android.server.backup.BackupManagerService;
|
||||
import com.android.server.backup.fullbackup.FullBackupObbConnection;
|
||||
import com.android.server.backup.utils.BytesReadListener;
|
||||
import com.android.server.backup.utils.FullBackupRestoreObserverUtils;
|
||||
@@ -121,6 +119,8 @@ public class FullRestoreEngine extends RestoreEngine {
|
||||
|
||||
final int mEphemeralOpToken;
|
||||
|
||||
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
|
||||
|
||||
public FullRestoreEngine(BackupManagerService backupManagerService,
|
||||
BackupRestoreTask monitorTask, IFullBackupRestoreObserver observer,
|
||||
IBackupManagerMonitor monitor, PackageInfo onlyPackage, boolean allowApks,
|
||||
@@ -135,6 +135,7 @@ public class FullRestoreEngine extends RestoreEngine {
|
||||
mAllowObbs = allowObbs;
|
||||
mBuffer = new byte[32 * 1024];
|
||||
mBytes = 0;
|
||||
mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
|
||||
}
|
||||
|
||||
public IBackupAgent getAgent() {
|
||||
@@ -381,8 +382,8 @@ public class FullRestoreEngine extends RestoreEngine {
|
||||
long toCopy = info.size;
|
||||
final boolean isSharedStorage = pkg.equals(SHARED_BACKUP_AGENT_PACKAGE);
|
||||
final long timeout = isSharedStorage ?
|
||||
TIMEOUT_SHARED_BACKUP_INTERVAL :
|
||||
TIMEOUT_RESTORE_INTERVAL;
|
||||
mAgentTimeoutParameters.getSharedBackupAgentTimeoutMillis() :
|
||||
mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
|
||||
try {
|
||||
mBackupManagerService.prepareOperationTimeout(token,
|
||||
timeout,
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
|
||||
package com.android.server.backup.restore;
|
||||
|
||||
import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT;
|
||||
import static com.android.server.backup.BackupPasswordManager.PBKDF_FALLBACK;
|
||||
import static com.android.server.backup.BackupManagerService.BACKUP_FILE_HEADER_MAGIC;
|
||||
import static com.android.server.backup.BackupManagerService.BACKUP_FILE_VERSION;
|
||||
import static com.android.server.backup.BackupManagerService.BACKUP_MANIFEST_FILENAME;
|
||||
@@ -28,8 +26,8 @@ import static com.android.server.backup.BackupManagerService.OP_TYPE_RESTORE_WAI
|
||||
import static com.android.server.backup.BackupManagerService.SETTINGS_PACKAGE;
|
||||
import static com.android.server.backup.BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE;
|
||||
import static com.android.server.backup.BackupManagerService.TAG;
|
||||
import static com.android.server.backup.BackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL;
|
||||
import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
|
||||
import static com.android.server.backup.BackupPasswordManager.PBKDF_CURRENT;
|
||||
import static com.android.server.backup.BackupPasswordManager.PBKDF_FALLBACK;
|
||||
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_OPERATION_TIMEOUT;
|
||||
|
||||
import android.app.ApplicationThreadConstants;
|
||||
@@ -49,6 +47,7 @@ import android.util.Slog;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.server.LocalServices;
|
||||
import com.android.server.backup.BackupAgentTimeoutParameters;
|
||||
import com.android.server.backup.BackupManagerService;
|
||||
import com.android.server.backup.FileMetadata;
|
||||
import com.android.server.backup.KeyValueAdbRestoreEngine;
|
||||
@@ -101,6 +100,7 @@ public class PerformAdbRestoreTask implements Runnable {
|
||||
private byte[] mWidgetData = null;
|
||||
|
||||
private long mBytes;
|
||||
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
|
||||
|
||||
// Runner that can be placed on a separate thread to do in-process invocation
|
||||
// of the "restore finished" API asynchronously. Used by adb restore.
|
||||
@@ -155,6 +155,7 @@ public class PerformAdbRestoreTask implements Runnable {
|
||||
mAgentPackage = null;
|
||||
mTargetApp = null;
|
||||
mObbConnection = new FullBackupObbConnection(backupManagerService);
|
||||
mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
|
||||
|
||||
// Which packages we've already wiped data on. We prepopulate this
|
||||
// with a whitelist of packages known to be unclearable.
|
||||
@@ -643,9 +644,11 @@ public class PerformAdbRestoreTask implements Runnable {
|
||||
if (okay) {
|
||||
boolean agentSuccess = true;
|
||||
long toCopy = info.size;
|
||||
long restoreAgentTimeoutMillis =
|
||||
mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
|
||||
try {
|
||||
mBackupManagerService.prepareOperationTimeout(
|
||||
token, TIMEOUT_RESTORE_INTERVAL, null, OP_TYPE_RESTORE_WAIT);
|
||||
token, restoreAgentTimeoutMillis, null, OP_TYPE_RESTORE_WAIT);
|
||||
|
||||
if (FullBackup.OBB_TREE_TOKEN.equals(info.domain)) {
|
||||
if (DEBUG) {
|
||||
@@ -820,10 +823,12 @@ public class PerformAdbRestoreTask implements Runnable {
|
||||
// In the adb restore case, we do restore-finished here
|
||||
if (doRestoreFinished) {
|
||||
final int token = mBackupManagerService.generateRandomIntegerToken();
|
||||
long fullBackupAgentTimeoutMillis =
|
||||
mAgentTimeoutParameters.getFullBackupAgentTimeoutMillis();
|
||||
final AdbRestoreFinishedLatch latch = new AdbRestoreFinishedLatch(
|
||||
mBackupManagerService, token);
|
||||
mBackupManagerService.prepareOperationTimeout(
|
||||
token, TIMEOUT_FULL_BACKUP_INTERVAL, latch, OP_TYPE_RESTORE_WAIT);
|
||||
token, fullBackupAgentTimeoutMillis, latch, OP_TYPE_RESTORE_WAIT);
|
||||
if (mTargetApp.processName.equals("system")) {
|
||||
if (MORE_DEBUG) {
|
||||
Slog.d(TAG, "system agent - restoreFinished on thread");
|
||||
|
||||
@@ -23,9 +23,6 @@ import static com.android.server.backup.BackupManagerService.OP_TYPE_RESTORE_WAI
|
||||
import static com.android.server.backup.BackupManagerService.PACKAGE_MANAGER_SENTINEL;
|
||||
import static com.android.server.backup.BackupManagerService.SETTINGS_PACKAGE;
|
||||
import static com.android.server.backup.BackupManagerService.TAG;
|
||||
import static com.android.server.backup.BackupManagerService
|
||||
.TIMEOUT_RESTORE_FINISHED_INTERVAL;
|
||||
import static com.android.server.backup.BackupManagerService.TIMEOUT_RESTORE_INTERVAL;
|
||||
import static com.android.server.backup.internal.BackupHandler.MSG_BACKUP_RESTORE_STEP;
|
||||
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_OPERATION_TIMEOUT;
|
||||
import static com.android.server.backup.internal.BackupHandler.MSG_RESTORE_SESSION_TIMEOUT;
|
||||
@@ -59,6 +56,7 @@ import com.android.internal.backup.IBackupTransport;
|
||||
import com.android.server.AppWidgetBackupBridge;
|
||||
import com.android.server.EventLogTags;
|
||||
import com.android.server.LocalServices;
|
||||
import com.android.server.backup.BackupAgentTimeoutParameters;
|
||||
import com.android.server.backup.BackupRestoreTask;
|
||||
import com.android.server.backup.BackupUtils;
|
||||
import com.android.server.backup.PackageManagerBackupAgent;
|
||||
@@ -160,6 +158,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
|
||||
ParcelFileDescriptor mNewState;
|
||||
|
||||
private final int mEphemeralOpToken;
|
||||
private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
|
||||
|
||||
// This task can assume that the wakelock is properly held for it and doesn't have to worry
|
||||
// about releasing it.
|
||||
@@ -190,6 +189,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
|
||||
mFinished = false;
|
||||
mDidLaunch = false;
|
||||
mListener = listener;
|
||||
mAgentTimeoutParameters = backupManagerService.getAgentTimeoutParameters();
|
||||
|
||||
if (targetPackage != null) {
|
||||
// Single package restore
|
||||
@@ -760,8 +760,9 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
|
||||
// Kick off the restore, checking for hung agents. The timeout or
|
||||
// the operationComplete() callback will schedule the next step,
|
||||
// so we do not do that here.
|
||||
long restoreAgentTimeoutMillis = mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
|
||||
backupManagerService.prepareOperationTimeout(
|
||||
mEphemeralOpToken, TIMEOUT_RESTORE_INTERVAL, this, OP_TYPE_RESTORE_WAIT);
|
||||
mEphemeralOpToken, restoreAgentTimeoutMillis, this, OP_TYPE_RESTORE_WAIT);
|
||||
mAgent.doRestore(mBackupData, appVersionCode, mNewState,
|
||||
mEphemeralOpToken, backupManagerService.getBackupManagerBinder());
|
||||
} catch (Exception e) {
|
||||
@@ -813,9 +814,11 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
|
||||
Slog.d(TAG, "restoreFinished packageName=" + mCurrentPackage.packageName);
|
||||
}
|
||||
try {
|
||||
long restoreAgentFinishedTimeoutMillis =
|
||||
mAgentTimeoutParameters.getRestoreAgentFinishedTimeoutMillis();
|
||||
backupManagerService
|
||||
.prepareOperationTimeout(mEphemeralOpToken,
|
||||
TIMEOUT_RESTORE_FINISHED_INTERVAL, this,
|
||||
restoreAgentFinishedTimeoutMillis, this,
|
||||
OP_TYPE_RESTORE_WAIT);
|
||||
mAgent.doRestoreFinished(mEphemeralOpToken,
|
||||
backupManagerService.getBackupManagerBinder());
|
||||
@@ -1109,9 +1112,10 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask {
|
||||
} else {
|
||||
// We were invoked via an active restore session, not by the Package
|
||||
// Manager, so start up the session timeout again.
|
||||
long restoreAgentTimeoutMillis = mAgentTimeoutParameters.getRestoreAgentTimeoutMillis();
|
||||
backupManagerService.getBackupHandler().sendEmptyMessageDelayed(
|
||||
MSG_RESTORE_SESSION_TIMEOUT,
|
||||
TIMEOUT_RESTORE_INTERVAL);
|
||||
restoreAgentTimeoutMillis);
|
||||
}
|
||||
|
||||
// Kick off any work that may be needed regarding app widget restores
|
||||
|
||||
@@ -148,16 +148,22 @@ public class PerformBackupTaskTest {
|
||||
Looper backupLooper = startBackupThreadAndGetLooper();
|
||||
mShadowBackupLooper = shadowOf(backupLooper);
|
||||
mBackupHandler = new BackupHandler(mBackupManagerService, backupLooper);
|
||||
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||
|
||||
mBackupManager = spy(FakeIBackupManager.class);
|
||||
|
||||
BackupAgentTimeoutParameters agentTimeoutParameters =
|
||||
new BackupAgentTimeoutParameters(mainHandler, application.getContentResolver());
|
||||
agentTimeoutParameters.start();
|
||||
|
||||
setUpBackupManagerServiceBasics(
|
||||
mBackupManagerService,
|
||||
application,
|
||||
mTransportManager,
|
||||
packageManager,
|
||||
mBackupHandler,
|
||||
mWakeLock);
|
||||
mWakeLock,
|
||||
agentTimeoutParameters);
|
||||
when(mBackupManagerService.getBaseStateDir()).thenReturn(mBaseStateDir);
|
||||
when(mBackupManagerService.getDataDir()).thenReturn(dataDir);
|
||||
when(mBackupManagerService.getBackupManagerBinder()).thenReturn(mBackupManager);
|
||||
|
||||
@@ -41,12 +41,14 @@ import android.app.backup.IRestoreSession;
|
||||
import android.app.backup.RestoreSet;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.PowerManager;
|
||||
import android.os.RemoteException;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
|
||||
import com.android.server.EventLogTags;
|
||||
import com.android.server.backup.BackupAgentTimeoutParameters;
|
||||
import com.android.server.backup.BackupManagerService;
|
||||
import com.android.server.backup.TransportManager;
|
||||
import com.android.server.backup.internal.BackupHandler;
|
||||
@@ -115,6 +117,15 @@ public class ActiveRestoreSessionTest {
|
||||
|
||||
Looper backupLooper = startBackupThreadAndGetLooper();
|
||||
mShadowBackupLooper = shadowOf(backupLooper);
|
||||
|
||||
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||
BackupAgentTimeoutParameters agentTimeoutParameters =
|
||||
new BackupAgentTimeoutParameters(mainHandler, application.getContentResolver());
|
||||
agentTimeoutParameters.start();
|
||||
|
||||
// We need to mock BMS timeout parameters before initializing the BackupHandler since
|
||||
// the constructor of BackupHandler relies on the timeout parameters.
|
||||
when(mBackupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters);
|
||||
BackupHandler backupHandler = new BackupHandler(mBackupManagerService, backupLooper);
|
||||
|
||||
mWakeLock = createBackupWakeLock(application);
|
||||
@@ -125,7 +136,8 @@ public class ActiveRestoreSessionTest {
|
||||
mTransportManager,
|
||||
application.getPackageManager(),
|
||||
backupHandler,
|
||||
mWakeLock);
|
||||
mWakeLock,
|
||||
agentTimeoutParameters);
|
||||
when(mBackupManagerService.getPendingRestores()).thenReturn(new ArrayDeque<>());
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ import android.os.Looper;
|
||||
import android.os.PowerManager;
|
||||
import android.util.SparseArray;
|
||||
|
||||
import com.android.server.backup.BackupAgentTimeoutParameters;
|
||||
import com.android.server.backup.BackupManagerService;
|
||||
import com.android.server.backup.TransportManager;
|
||||
import com.android.server.backup.internal.BackupHandler;
|
||||
@@ -43,7 +44,8 @@ public class BackupManagerServiceTestUtils {
|
||||
TransportManager transportManager,
|
||||
PackageManager packageManager,
|
||||
BackupHandler backupHandler,
|
||||
PowerManager.WakeLock wakeLock) {
|
||||
PowerManager.WakeLock wakeLock,
|
||||
BackupAgentTimeoutParameters agentTimeoutParameters) {
|
||||
when(backupManagerService.getContext()).thenReturn(context);
|
||||
when(backupManagerService.getTransportManager()).thenReturn(transportManager);
|
||||
when(backupManagerService.getPackageManager()).thenReturn(packageManager);
|
||||
@@ -53,6 +55,7 @@ public class BackupManagerServiceTestUtils {
|
||||
when(backupManagerService.getCurrentOperations()).thenReturn(new SparseArray<>());
|
||||
when(backupManagerService.getActivityManager()).thenReturn(mock(IActivityManager.class));
|
||||
when(backupManagerService.getWakelock()).thenReturn(wakeLock);
|
||||
when(backupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters);
|
||||
}
|
||||
|
||||
public static PowerManager.WakeLock createBackupWakeLock(Application application) {
|
||||
|
||||
Reference in New Issue
Block a user