Merge "Make BackupTransport more resilient" into tm-dev

This commit is contained in:
Ruslan Tkhakokhov
2022-05-12 09:11:13 +00:00
committed by Android (Google) Code Review
2 changed files with 164 additions and 56 deletions

View File

@@ -665,184 +665,292 @@ public class BackupTransport {
@Override @Override
public void name(AndroidFuture<String> resultFuture) throws RemoteException { public void name(AndroidFuture<String> resultFuture) throws RemoteException {
try {
String result = BackupTransport.this.name(); String result = BackupTransport.this.name();
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void configurationIntent(AndroidFuture<Intent> resultFuture) public void configurationIntent(AndroidFuture<Intent> resultFuture)
throws RemoteException { throws RemoteException {
try {
Intent result = BackupTransport.this.configurationIntent(); Intent result = BackupTransport.this.configurationIntent();
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void currentDestinationString(AndroidFuture<String> resultFuture) public void currentDestinationString(AndroidFuture<String> resultFuture)
throws RemoteException { throws RemoteException {
try {
String result = BackupTransport.this.currentDestinationString(); String result = BackupTransport.this.currentDestinationString();
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void dataManagementIntent(AndroidFuture<Intent> resultFuture) public void dataManagementIntent(AndroidFuture<Intent> resultFuture)
throws RemoteException { throws RemoteException {
try {
Intent result = BackupTransport.this.dataManagementIntent(); Intent result = BackupTransport.this.dataManagementIntent();
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void dataManagementIntentLabel(AndroidFuture<CharSequence> resultFuture) public void dataManagementIntentLabel(AndroidFuture<CharSequence> resultFuture)
throws RemoteException { throws RemoteException {
try {
CharSequence result = BackupTransport.this.dataManagementIntentLabel(); CharSequence result = BackupTransport.this.dataManagementIntentLabel();
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void transportDirName(AndroidFuture<String> resultFuture) throws RemoteException { public void transportDirName(AndroidFuture<String> resultFuture) throws RemoteException {
try {
String result = BackupTransport.this.transportDirName(); String result = BackupTransport.this.transportDirName();
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void requestBackupTime(AndroidFuture<Long> resultFuture) throws RemoteException { public void requestBackupTime(AndroidFuture<Long> resultFuture) throws RemoteException {
try {
long result = BackupTransport.this.requestBackupTime(); long result = BackupTransport.this.requestBackupTime();
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void initializeDevice(ITransportStatusCallback callback) throws RemoteException { public void initializeDevice(ITransportStatusCallback callback) throws RemoteException {
try {
int result = BackupTransport.this.initializeDevice(); int result = BackupTransport.this.initializeDevice();
callback.onOperationCompleteWithStatus(result); callback.onOperationCompleteWithStatus(result);
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void performBackup(PackageInfo packageInfo, ParcelFileDescriptor inFd, int flags, public void performBackup(PackageInfo packageInfo, ParcelFileDescriptor inFd, int flags,
ITransportStatusCallback callback) throws RemoteException { ITransportStatusCallback callback) throws RemoteException {
try {
int result = BackupTransport.this.performBackup(packageInfo, inFd, flags); int result = BackupTransport.this.performBackup(packageInfo, inFd, flags);
callback.onOperationCompleteWithStatus(result); callback.onOperationCompleteWithStatus(result);
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void clearBackupData(PackageInfo packageInfo, ITransportStatusCallback callback) public void clearBackupData(PackageInfo packageInfo, ITransportStatusCallback callback)
throws RemoteException { throws RemoteException {
try {
int result = BackupTransport.this.clearBackupData(packageInfo); int result = BackupTransport.this.clearBackupData(packageInfo);
callback.onOperationCompleteWithStatus(result); callback.onOperationCompleteWithStatus(result);
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void finishBackup(ITransportStatusCallback callback) throws RemoteException { public void finishBackup(ITransportStatusCallback callback) throws RemoteException {
try {
int result = BackupTransport.this.finishBackup(); int result = BackupTransport.this.finishBackup();
callback.onOperationCompleteWithStatus(result); callback.onOperationCompleteWithStatus(result);
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void getAvailableRestoreSets(AndroidFuture<List<RestoreSet>> resultFuture) public void getAvailableRestoreSets(AndroidFuture<List<RestoreSet>> resultFuture)
throws RemoteException { throws RemoteException {
try {
RestoreSet[] result = BackupTransport.this.getAvailableRestoreSets(); RestoreSet[] result = BackupTransport.this.getAvailableRestoreSets();
resultFuture.complete(Arrays.asList(result)); resultFuture.complete(Arrays.asList(result));
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void getCurrentRestoreSet(AndroidFuture<Long> resultFuture) public void getCurrentRestoreSet(AndroidFuture<Long> resultFuture)
throws RemoteException { throws RemoteException {
try {
long result = BackupTransport.this.getCurrentRestoreSet(); long result = BackupTransport.this.getCurrentRestoreSet();
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void startRestore(long token, PackageInfo[] packages, public void startRestore(long token, PackageInfo[] packages,
ITransportStatusCallback callback) throws RemoteException { ITransportStatusCallback callback) throws RemoteException {
try {
int result = BackupTransport.this.startRestore(token, packages); int result = BackupTransport.this.startRestore(token, packages);
callback.onOperationCompleteWithStatus(result); callback.onOperationCompleteWithStatus(result);
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void nextRestorePackage(AndroidFuture<RestoreDescription> resultFuture) public void nextRestorePackage(AndroidFuture<RestoreDescription> resultFuture)
throws RemoteException { throws RemoteException {
try {
RestoreDescription result = BackupTransport.this.nextRestorePackage(); RestoreDescription result = BackupTransport.this.nextRestorePackage();
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void getRestoreData(ParcelFileDescriptor outFd, public void getRestoreData(ParcelFileDescriptor outFd,
ITransportStatusCallback callback) throws RemoteException { ITransportStatusCallback callback) throws RemoteException {
try {
int result = BackupTransport.this.getRestoreData(outFd); int result = BackupTransport.this.getRestoreData(outFd);
callback.onOperationCompleteWithStatus(result); callback.onOperationCompleteWithStatus(result);
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void finishRestore(ITransportStatusCallback callback) public void finishRestore(ITransportStatusCallback callback)
throws RemoteException { throws RemoteException {
try {
BackupTransport.this.finishRestore(); BackupTransport.this.finishRestore();
callback.onOperationComplete(); callback.onOperationComplete();
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void requestFullBackupTime(AndroidFuture<Long> resultFuture) public void requestFullBackupTime(AndroidFuture<Long> resultFuture)
throws RemoteException { throws RemoteException {
try {
long result = BackupTransport.this.requestFullBackupTime(); long result = BackupTransport.this.requestFullBackupTime();
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void performFullBackup(PackageInfo targetPackage, ParcelFileDescriptor socket, public void performFullBackup(PackageInfo targetPackage, ParcelFileDescriptor socket,
int flags, ITransportStatusCallback callback) throws RemoteException { int flags, ITransportStatusCallback callback) throws RemoteException {
try {
int result = BackupTransport.this.performFullBackup(targetPackage, socket, flags); int result = BackupTransport.this.performFullBackup(targetPackage, socket, flags);
callback.onOperationCompleteWithStatus(result); callback.onOperationCompleteWithStatus(result);
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void checkFullBackupSize(long size, ITransportStatusCallback callback) public void checkFullBackupSize(long size, ITransportStatusCallback callback)
throws RemoteException { throws RemoteException {
try {
int result = BackupTransport.this.checkFullBackupSize(size); int result = BackupTransport.this.checkFullBackupSize(size);
callback.onOperationCompleteWithStatus(result); callback.onOperationCompleteWithStatus(result);
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void sendBackupData(int numBytes, ITransportStatusCallback callback) public void sendBackupData(int numBytes, ITransportStatusCallback callback)
throws RemoteException { throws RemoteException {
try {
int result = BackupTransport.this.sendBackupData(numBytes); int result = BackupTransport.this.sendBackupData(numBytes);
callback.onOperationCompleteWithStatus(result); callback.onOperationCompleteWithStatus(result);
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void cancelFullBackup(ITransportStatusCallback callback) throws RemoteException { public void cancelFullBackup(ITransportStatusCallback callback) throws RemoteException {
try {
BackupTransport.this.cancelFullBackup(); BackupTransport.this.cancelFullBackup();
callback.onOperationComplete(); callback.onOperationComplete();
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void isAppEligibleForBackup(PackageInfo targetPackage, boolean isFullBackup, public void isAppEligibleForBackup(PackageInfo targetPackage, boolean isFullBackup,
AndroidFuture<Boolean> resultFuture) throws RemoteException { AndroidFuture<Boolean> resultFuture) throws RemoteException {
try {
boolean result = BackupTransport.this.isAppEligibleForBackup(targetPackage, boolean result = BackupTransport.this.isAppEligibleForBackup(targetPackage,
isFullBackup); isFullBackup);
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void getBackupQuota(String packageName, boolean isFullBackup, public void getBackupQuota(String packageName, boolean isFullBackup,
AndroidFuture<Long> resultFuture) throws RemoteException { AndroidFuture<Long> resultFuture) throws RemoteException {
try {
long result = BackupTransport.this.getBackupQuota(packageName, isFullBackup); long result = BackupTransport.this.getBackupQuota(packageName, isFullBackup);
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void getTransportFlags(AndroidFuture<Integer> resultFuture) throws RemoteException { public void getTransportFlags(AndroidFuture<Integer> resultFuture) throws RemoteException {
try {
int result = BackupTransport.this.getTransportFlags(); int result = BackupTransport.this.getTransportFlags();
resultFuture.complete(result); resultFuture.complete(result);
} catch (RuntimeException e) {
resultFuture.cancel(/* mayInterruptIfRunning */ true);
}
} }
@Override @Override
public void getNextFullRestoreDataChunk(ParcelFileDescriptor socket, public void getNextFullRestoreDataChunk(ParcelFileDescriptor socket,
ITransportStatusCallback callback) throws RemoteException { ITransportStatusCallback callback) throws RemoteException {
try {
int result = BackupTransport.this.getNextFullRestoreDataChunk(socket); int result = BackupTransport.this.getNextFullRestoreDataChunk(socket);
callback.onOperationCompleteWithStatus(result); callback.onOperationCompleteWithStatus(result);
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
@Override @Override
public void abortFullRestore(ITransportStatusCallback callback) throws RemoteException { public void abortFullRestore(ITransportStatusCallback callback) throws RemoteException {
try {
int result = BackupTransport.this.abortFullRestore(); int result = BackupTransport.this.abortFullRestore();
callback.onOperationCompleteWithStatus(result); callback.onOperationCompleteWithStatus(result);
} catch (RuntimeException e) {
callback.onOperationCompleteWithStatus(BackupTransport.TRANSPORT_ERROR);
}
} }
} }
} }

View File

@@ -26,7 +26,7 @@ import com.android.internal.backup.ITransportStatusCallback;
public class TransportStatusCallback extends ITransportStatusCallback.Stub { public class TransportStatusCallback extends ITransportStatusCallback.Stub {
private static final String TAG = "TransportStatusCallback"; private static final String TAG = "TransportStatusCallback";
private static final int TIMEOUT_MILLIS = 600 * 1000; // 10 minutes. private static final int TIMEOUT_MILLIS = 300 * 1000; // 5 minutes.
private static final int OPERATION_STATUS_DEFAULT = 0; private static final int OPERATION_STATUS_DEFAULT = 0;
private final int mOperationTimeout; private final int mOperationTimeout;