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 {
String result = BackupTransport.this.name(); try {
resultFuture.complete(result); String result = BackupTransport.this.name();
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 {
Intent result = BackupTransport.this.configurationIntent(); try {
resultFuture.complete(result); Intent result = BackupTransport.this.configurationIntent();
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 {
String result = BackupTransport.this.currentDestinationString(); try {
resultFuture.complete(result); String result = BackupTransport.this.currentDestinationString();
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 {
Intent result = BackupTransport.this.dataManagementIntent(); try {
resultFuture.complete(result); Intent result = BackupTransport.this.dataManagementIntent();
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 {
CharSequence result = BackupTransport.this.dataManagementIntentLabel(); try {
resultFuture.complete(result); CharSequence result = BackupTransport.this.dataManagementIntentLabel();
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 {
String result = BackupTransport.this.transportDirName(); try {
resultFuture.complete(result); String result = BackupTransport.this.transportDirName();
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 {
long result = BackupTransport.this.requestBackupTime(); try {
resultFuture.complete(result); long result = BackupTransport.this.requestBackupTime();
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 {
int result = BackupTransport.this.initializeDevice(); try {
callback.onOperationCompleteWithStatus(result); int result = BackupTransport.this.initializeDevice();
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 {
int result = BackupTransport.this.performBackup(packageInfo, inFd, flags); try {
callback.onOperationCompleteWithStatus(result); int result = BackupTransport.this.performBackup(packageInfo, inFd, flags);
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 {
int result = BackupTransport.this.clearBackupData(packageInfo); try {
callback.onOperationCompleteWithStatus(result); int result = BackupTransport.this.clearBackupData(packageInfo);
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 {
int result = BackupTransport.this.finishBackup(); try {
callback.onOperationCompleteWithStatus(result); int result = BackupTransport.this.finishBackup();
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 {
RestoreSet[] result = BackupTransport.this.getAvailableRestoreSets(); try {
resultFuture.complete(Arrays.asList(result)); RestoreSet[] result = BackupTransport.this.getAvailableRestoreSets();
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 {
long result = BackupTransport.this.getCurrentRestoreSet(); try {
resultFuture.complete(result); long result = BackupTransport.this.getCurrentRestoreSet();
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 {
int result = BackupTransport.this.startRestore(token, packages); try {
callback.onOperationCompleteWithStatus(result); int result = BackupTransport.this.startRestore(token, packages);
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 {
RestoreDescription result = BackupTransport.this.nextRestorePackage(); try {
resultFuture.complete(result); RestoreDescription result = BackupTransport.this.nextRestorePackage();
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 {
int result = BackupTransport.this.getRestoreData(outFd); try {
callback.onOperationCompleteWithStatus(result); int result = BackupTransport.this.getRestoreData(outFd);
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 {
BackupTransport.this.finishRestore(); try {
callback.onOperationComplete(); BackupTransport.this.finishRestore();
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 {
long result = BackupTransport.this.requestFullBackupTime(); try {
resultFuture.complete(result); long result = BackupTransport.this.requestFullBackupTime();
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 {
int result = BackupTransport.this.performFullBackup(targetPackage, socket, flags); try {
callback.onOperationCompleteWithStatus(result); int result = BackupTransport.this.performFullBackup(targetPackage, socket, flags);
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 {
int result = BackupTransport.this.checkFullBackupSize(size); try {
callback.onOperationCompleteWithStatus(result); int result = BackupTransport.this.checkFullBackupSize(size);
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 {
int result = BackupTransport.this.sendBackupData(numBytes); try {
callback.onOperationCompleteWithStatus(result); int result = BackupTransport.this.sendBackupData(numBytes);
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 {
BackupTransport.this.cancelFullBackup(); try {
callback.onOperationComplete(); BackupTransport.this.cancelFullBackup();
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 {
boolean result = BackupTransport.this.isAppEligibleForBackup(targetPackage, try {
isFullBackup); boolean result = BackupTransport.this.isAppEligibleForBackup(targetPackage,
resultFuture.complete(result); isFullBackup);
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 {
long result = BackupTransport.this.getBackupQuota(packageName, isFullBackup); try {
resultFuture.complete(result); long result = BackupTransport.this.getBackupQuota(packageName, isFullBackup);
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 {
int result = BackupTransport.this.getTransportFlags(); try {
resultFuture.complete(result); int result = BackupTransport.this.getTransportFlags();
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 {
int result = BackupTransport.this.getNextFullRestoreDataChunk(socket); try {
callback.onOperationCompleteWithStatus(result); int result = BackupTransport.this.getNextFullRestoreDataChunk(socket);
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 {
int result = BackupTransport.this.abortFullRestore(); try {
callback.onOperationCompleteWithStatus(result); int result = BackupTransport.this.abortFullRestore();
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;