Loading services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java +22 −4 Original line number Original line Diff line number Diff line Loading @@ -2158,8 +2158,17 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter mFullBackupQueue.remove(0); mFullBackupQueue.remove(0); CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1); String[] pkg = new String[]{entry.packageName}; String[] pkg = new String[]{entry.packageName}; mRunningFullBackupTask = new PerformFullTransportBackupTask(this, null, pkg, true, mRunningFullBackupTask = PerformFullTransportBackupTask.newWithCurrentTransport( scheduledJob, latch, null, null, false /* userInitiated */); this, /* observer */ null, pkg, /* updateSchedule */ true, scheduledJob, latch, /* backupObserver */ null, /* monitor */ null, /* userInitiated */ false, "BMS.beginFullBackup()"); // Acquiring wakelock for PerformFullTransportBackupTask before its start. // Acquiring wakelock for PerformFullTransportBackupTask before its start. mWakelock.acquire(); mWakelock.acquire(); (new Thread(mRunningFullBackupTask)).start(); (new Thread(mRunningFullBackupTask)).start(); Loading Loading @@ -2513,8 +2522,17 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter final long oldId = Binder.clearCallingIdentity(); final long oldId = Binder.clearCallingIdentity(); try { try { CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1); PerformFullTransportBackupTask task = new PerformFullTransportBackupTask(this, null, Runnable task = PerformFullTransportBackupTask.newWithCurrentTransport( pkgNames, false, null, latch, null, null, false /* userInitiated */); this, /* observer */ null, pkgNames, /* updateSchedule */ false, /* runningJob */ null, latch, /* backupObserver */ null, /* monitor */ null, /* userInitiated */ false, "BMS.fullTransportBackup()"); // Acquiring wakelock for PerformFullTransportBackupTask before its start. // Acquiring wakelock for PerformFullTransportBackupTask before its start. mWakelock.acquire(); mWakelock.acquire(); (new Thread(task, "full-transport-master")).start(); (new Thread(task, "full-transport-master")).start(); Loading services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java +68 −19 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static com.android.server.backup.RefactoredBackupManagerService.OP_TYPE_B import static com.android.server.backup.RefactoredBackupManagerService.OP_TYPE_BACKUP_WAIT; import static com.android.server.backup.RefactoredBackupManagerService.OP_TYPE_BACKUP_WAIT; import static com.android.server.backup.RefactoredBackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL; import static com.android.server.backup.RefactoredBackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL; import android.annotation.Nullable; import android.app.IBackupAgent; import android.app.IBackupAgent; import android.app.backup.BackupManager; import android.app.backup.BackupManager; import android.app.backup.BackupManagerMonitor; import android.app.backup.BackupManagerMonitor; Loading @@ -46,7 +47,11 @@ import com.android.server.EventLogTags; import com.android.server.backup.BackupRestoreTask; import com.android.server.backup.BackupRestoreTask; import com.android.server.backup.FullBackupJob; import com.android.server.backup.FullBackupJob; import com.android.server.backup.RefactoredBackupManagerService; import com.android.server.backup.RefactoredBackupManagerService; import com.android.server.backup.TransportManager; import com.android.server.backup.internal.OnTaskFinishedListener; import com.android.server.backup.internal.Operation; import com.android.server.backup.internal.Operation; import com.android.server.backup.transport.TransportClient; import com.android.server.backup.transport.TransportNotAvailableException; import com.android.server.backup.utils.AppBackupUtils; import com.android.server.backup.utils.AppBackupUtils; import com.android.server.backup.utils.BackupManagerMonitorUtils; import com.android.server.backup.utils.BackupManagerMonitorUtils; import com.android.server.backup.utils.BackupObserverUtils; import com.android.server.backup.utils.BackupObserverUtils; Loading Loading @@ -89,6 +94,36 @@ import java.util.concurrent.atomic.AtomicLong; * mBackupRunner.getBackupResultBlocking(). * mBackupRunner.getBackupResultBlocking(). */ */ public class PerformFullTransportBackupTask extends FullBackupTask implements BackupRestoreTask { public class PerformFullTransportBackupTask extends FullBackupTask implements BackupRestoreTask { public static PerformFullTransportBackupTask newWithCurrentTransport( RefactoredBackupManagerService backupManagerService, IFullBackupRestoreObserver observer, String[] whichPackages, boolean updateSchedule, FullBackupJob runningJob, CountDownLatch latch, IBackupObserver backupObserver, IBackupManagerMonitor monitor, boolean userInitiated, String caller) { TransportManager transportManager = backupManagerService.getTransportManager(); TransportClient transportClient = transportManager.getCurrentTransportClient(caller); OnTaskFinishedListener listener = listenerCaller -> transportManager.disposeOfTransportClient(transportClient, listenerCaller); return new PerformFullTransportBackupTask( backupManagerService, transportClient, observer, whichPackages, updateSchedule, runningJob, latch, backupObserver, monitor, listener, userInitiated); } private static final String TAG = "PFTBT"; private static final String TAG = "PFTBT"; private RefactoredBackupManagerService backupManagerService; private RefactoredBackupManagerService backupManagerService; Loading @@ -102,9 +137,10 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba IBackupObserver mBackupObserver; IBackupObserver mBackupObserver; IBackupManagerMonitor mMonitor; IBackupManagerMonitor mMonitor; boolean mUserInitiated; boolean mUserInitiated; private volatile IBackupTransport mTransport; SinglePackageBackupRunner mBackupRunner; SinglePackageBackupRunner mBackupRunner; private final int mBackupRunnerOpToken; private final int mBackupRunnerOpToken; private final OnTaskFinishedListener mListener; private final TransportClient mTransportClient; // This is true when a backup operation for some package is in progress. // This is true when a backup operation for some package is in progress. private volatile boolean mIsDoingBackup; private volatile boolean mIsDoingBackup; Loading @@ -112,18 +148,22 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba private final int mCurrentOpToken; private final int mCurrentOpToken; public PerformFullTransportBackupTask(RefactoredBackupManagerService backupManagerService, public PerformFullTransportBackupTask(RefactoredBackupManagerService backupManagerService, TransportClient transportClient, IFullBackupRestoreObserver observer, IFullBackupRestoreObserver observer, String[] whichPackages, boolean updateSchedule, String[] whichPackages, boolean updateSchedule, FullBackupJob runningJob, CountDownLatch latch, IBackupObserver backupObserver, FullBackupJob runningJob, CountDownLatch latch, IBackupObserver backupObserver, IBackupManagerMonitor monitor, boolean userInitiated) { IBackupManagerMonitor monitor, @Nullable OnTaskFinishedListener listener, boolean userInitiated) { super(observer); super(observer); this.backupManagerService = backupManagerService; this.backupManagerService = backupManagerService; mTransportClient = transportClient; mUpdateSchedule = updateSchedule; mUpdateSchedule = updateSchedule; mLatch = latch; mLatch = latch; mJob = runningJob; mJob = runningJob; mPackages = new ArrayList<>(whichPackages.length); mPackages = new ArrayList<>(whichPackages.length); mBackupObserver = backupObserver; mBackupObserver = backupObserver; mMonitor = monitor; mMonitor = monitor; mListener = (listener != null) ? listener : OnTaskFinishedListener.NOP; mUserInitiated = userInitiated; mUserInitiated = userInitiated; mCurrentOpToken = backupManagerService.generateRandomIntegerToken(); mCurrentOpToken = backupManagerService.generateRandomIntegerToken(); mBackupRunnerOpToken = backupManagerService.generateRandomIntegerToken(); mBackupRunnerOpToken = backupManagerService.generateRandomIntegerToken(); Loading Loading @@ -241,8 +281,11 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba if (mIsDoingBackup) { if (mIsDoingBackup) { backupManagerService.handleCancel(mBackupRunnerOpToken, cancelAll); backupManagerService.handleCancel(mBackupRunnerOpToken, cancelAll); try { try { mTransport.cancelFullBackup(); // If we're running a backup we should be connected to a transport } catch (RemoteException e) { IBackupTransport transport = mTransportClient.getConnectedTransport("PFTBT.handleCancel()"); transport.cancelFullBackup(); } catch (RemoteException | TransportNotAvailableException e) { Slog.w(TAG, "Error calling cancelFullBackup() on transport: " + e); Slog.w(TAG, "Error calling cancelFullBackup() on transport: " + e); // Can't do much. // Can't do much. } } Loading Loading @@ -291,8 +334,8 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba return; return; } } mTransport = backupManagerService.getTransportManager().getCurrentTransportBinder(); IBackupTransport transport = mTransportClient.connect("PFTBT.run()"); if (mTransport == null) { if (transport == null) { Slog.w(TAG, "Transport not present; full data backup not performed"); Slog.w(TAG, "Transport not present; full data backup not performed"); backupRunStatus = BackupManager.ERROR_TRANSPORT_ABORTED; backupRunStatus = BackupManager.ERROR_TRANSPORT_ABORTED; mMonitor = BackupManagerMonitorUtils.monitorEvent(mMonitor, mMonitor = BackupManagerMonitorUtils.monitorEvent(mMonitor, Loading Loading @@ -325,17 +368,17 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba if (mCancelAll) { if (mCancelAll) { break; break; } } backupPackageStatus = mTransport.performFullBackup(currentPackage, backupPackageStatus = transport.performFullBackup(currentPackage, transportPipes[0], flags); transportPipes[0], flags); if (backupPackageStatus == BackupTransport.TRANSPORT_OK) { if (backupPackageStatus == BackupTransport.TRANSPORT_OK) { quota = mTransport.getBackupQuota(currentPackage.packageName, quota = transport.getBackupQuota(currentPackage.packageName, true /* isFullBackup */); true /* isFullBackup */); // Now set up the backup engine / data source end of things // Now set up the backup engine / data source end of things enginePipes = ParcelFileDescriptor.createPipe(); enginePipes = ParcelFileDescriptor.createPipe(); mBackupRunner = mBackupRunner = new SinglePackageBackupRunner(enginePipes[1], currentPackage, new SinglePackageBackupRunner(enginePipes[1], currentPackage, mTransport, quota, mBackupRunnerOpToken); mTransportClient, quota, mBackupRunnerOpToken); // The runner dup'd the pipe half, so we close it here // The runner dup'd the pipe half, so we close it here enginePipes[1].close(); enginePipes[1].close(); enginePipes[1] = null; enginePipes[1] = null; Loading Loading @@ -389,7 +432,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba out.write(buffer, 0, nRead); out.write(buffer, 0, nRead); synchronized (mCancelLock) { synchronized (mCancelLock) { if (!mCancelAll) { if (!mCancelAll) { backupPackageStatus = mTransport.sendBackupData(nRead); backupPackageStatus = transport.sendBackupData(nRead); } } } } totalRead += nRead; totalRead += nRead; Loading Loading @@ -425,12 +468,12 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba // result based on what finishBackup() returns. If we're in a // result based on what finishBackup() returns. If we're in a // failure case already, preserve that result and ignore whatever // failure case already, preserve that result and ignore whatever // finishBackup() reports. // finishBackup() reports. final int finishResult = mTransport.finishBackup(); final int finishResult = transport.finishBackup(); if (backupPackageStatus == BackupTransport.TRANSPORT_OK) { if (backupPackageStatus == BackupTransport.TRANSPORT_OK) { backupPackageStatus = finishResult; backupPackageStatus = finishResult; } } } else { } else { mTransport.cancelFullBackup(); transport.cancelFullBackup(); } } } } } } Loading Loading @@ -469,7 +512,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba // Also ask the transport how long it wants us to wait before // Also ask the transport how long it wants us to wait before // moving on to the next package, if any. // moving on to the next package, if any. backoff = mTransport.requestFullBackupTime(); backoff = transport.requestFullBackupTime(); if (DEBUG_SCHEDULING) { if (DEBUG_SCHEDULING) { Slog.i(TAG, "Transport suggested backoff=" + backoff); Slog.i(TAG, "Transport suggested backoff=" + backoff); } } Loading Loading @@ -591,6 +634,8 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba backupManagerService.setRunningFullBackupTask(null); backupManagerService.setRunningFullBackupTask(null); } } mListener.onFinished("PFTBT.run()"); mLatch.countDown(); mLatch.countDown(); // Now that we're actually done with schedule-driven work, reschedule // Now that we're actually done with schedule-driven work, reschedule Loading Loading @@ -633,12 +678,13 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba class SinglePackageBackupPreflight implements BackupRestoreTask, FullBackupPreflight { class SinglePackageBackupPreflight implements BackupRestoreTask, FullBackupPreflight { final AtomicLong mResult = new AtomicLong(BackupTransport.AGENT_ERROR); final AtomicLong mResult = new AtomicLong(BackupTransport.AGENT_ERROR); final CountDownLatch mLatch = new CountDownLatch(1); final CountDownLatch mLatch = new CountDownLatch(1); final IBackupTransport mTransport; final TransportClient mTransportClient; final long mQuota; final long mQuota; private final int mCurrentOpToken; private final int mCurrentOpToken; SinglePackageBackupPreflight(IBackupTransport transport, long quota, int currentOpToken) { SinglePackageBackupPreflight( mTransport = transport; TransportClient transportClient, long quota, int currentOpToken) { mTransportClient = transportClient; mQuota = quota; mQuota = quota; mCurrentOpToken = currentOpToken; mCurrentOpToken = currentOpToken; } } Loading Loading @@ -672,7 +718,9 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba Slog.v(TAG, "Got preflight response; size=" + totalSize); Slog.v(TAG, "Got preflight response; size=" + totalSize); } } result = mTransport.checkFullBackupSize(totalSize); IBackupTransport transport = mTransportClient.connectOrThrow("PFTBT$SPBP.preflightFullBackup()"); result = transport.checkFullBackupSize(totalSize); if (result == BackupTransport.TRANSPORT_QUOTA_EXCEEDED) { if (result == BackupTransport.TRANSPORT_QUOTA_EXCEEDED) { if (MORE_DEBUG) { if (MORE_DEBUG) { Slog.d(TAG, "Package hit quota limit on preflight " + Slog.d(TAG, "Package hit quota limit on preflight " + Loading Loading @@ -739,12 +787,13 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba private volatile boolean mIsCancelled; private volatile boolean mIsCancelled; SinglePackageBackupRunner(ParcelFileDescriptor output, PackageInfo target, SinglePackageBackupRunner(ParcelFileDescriptor output, PackageInfo target, IBackupTransport transport, long quota, int currentOpToken) throws IOException { TransportClient transportClient, long quota, int currentOpToken) throws IOException { mOutput = ParcelFileDescriptor.dup(output.getFileDescriptor()); mOutput = ParcelFileDescriptor.dup(output.getFileDescriptor()); mTarget = target; mTarget = target; mCurrentOpToken = currentOpToken; mCurrentOpToken = currentOpToken; mEphemeralToken = backupManagerService.generateRandomIntegerToken(); mEphemeralToken = backupManagerService.generateRandomIntegerToken(); mPreflight = new SinglePackageBackupPreflight(transport, quota, mEphemeralToken); mPreflight = new SinglePackageBackupPreflight(transportClient, quota, mEphemeralToken); mPreflightLatch = new CountDownLatch(1); mPreflightLatch = new CountDownLatch(1); mBackupLatch = new CountDownLatch(1); mBackupLatch = new CountDownLatch(1); mPreflightResult = BackupTransport.AGENT_ERROR; mPreflightResult = BackupTransport.AGENT_ERROR; Loading services/backup/java/com/android/server/backup/internal/PerformBackupTask.java +5 −5 Original line number Original line Diff line number Diff line Loading @@ -184,11 +184,11 @@ public class PerformBackupTask implements BackupRestoreTask { mPendingFullBackups.toArray(new String[mPendingFullBackups.size()]); mPendingFullBackups.toArray(new String[mPendingFullBackups.size()]); mFullBackupTask = mFullBackupTask = new PerformFullTransportBackupTask(backupManagerService, new PerformFullTransportBackupTask(backupManagerService, /*fullBackupRestoreObserver*/ transportClient, null, /*fullBackupRestoreObserver*/ null, fullBackups, /*updateSchedule*/ false, /*runningJob*/ null, fullBackups, /*updateSchedule*/ false, /*runningJob*/ null, latch, latch, mObserver, mMonitor, mUserInitiated); mObserver, mMonitor, mListener, mUserInitiated); registerTask(); registerTask(); backupManagerService.addBackupTrace("STATE => INITIAL"); backupManagerService.addBackupTrace("STATE => INITIAL"); Loading Loading @@ -585,11 +585,11 @@ public class PerformBackupTask implements BackupRestoreTask { if (!mCancelAll && mStatus == BackupTransport.TRANSPORT_OK && if (!mCancelAll && mStatus == BackupTransport.TRANSPORT_OK && mPendingFullBackups != null && !mPendingFullBackups.isEmpty()) { mPendingFullBackups != null && !mPendingFullBackups.isEmpty()) { // TODO(brufino): Move the onFinish() call to the full-backup task mListener.onFinished(callerLogString); Slog.d(TAG, "Starting full backups for: " + mPendingFullBackups); Slog.d(TAG, "Starting full backups for: " + mPendingFullBackups); // Acquiring wakelock for PerformFullTransportBackupTask before its start. // Acquiring wakelock for PerformFullTransportBackupTask before its start. backupManagerService.getWakelock().acquire(); backupManagerService.getWakelock().acquire(); // The full-backup task is now responsible for calling onFinish() on mListener, which // was the listener we passed it. (new Thread(mFullBackupTask, "full-transport-requested")).start(); (new Thread(mFullBackupTask, "full-transport-requested")).start(); } else if (mCancelAll) { } else if (mCancelAll) { mListener.onFinished(callerLogString); mListener.onFinished(callerLogString); Loading services/backup/java/com/android/server/backup/transport/TransportClient.java +19 −0 Original line number Original line Diff line number Diff line Loading @@ -367,6 +367,25 @@ public class TransportClient { return transport; return transport; } } /** * If the {@link TransportClient} is already connected to the transport, returns the transport, * otherwise throws {@link TransportNotAvailableException}. * * @param caller A {@link String} identifying the caller for logging/debugging purposes. Check * {@link #connectAsync(TransportConnectionListener, String)} for more details. * @return A {@link IBackupTransport} transport binder instance. * @throws TransportNotAvailableException if not connected. */ public IBackupTransport getConnectedTransport(String caller) throws TransportNotAvailableException { IBackupTransport transport = mTransport; if (transport == null) { log(Log.ERROR, caller, "Transport not connected"); throw new TransportNotAvailableException(); } return transport; } @Override @Override public String toString() { public String toString() { return "TransportClient{" return "TransportClient{" Loading services/backup/java/com/android/server/backup/transport/TransportNotAvailableException.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -25,7 +25,7 @@ import com.android.internal.backup.IBackupTransport; * * * @see TransportClient#connectAsync(TransportConnectionListener, String) * @see TransportClient#connectAsync(TransportConnectionListener, String) */ */ class TransportNotAvailableException extends Exception { public class TransportNotAvailableException extends Exception { TransportNotAvailableException() { TransportNotAvailableException() { super("Transport not available"); super("Transport not available"); } } Loading Loading
services/backup/java/com/android/server/backup/RefactoredBackupManagerService.java +22 −4 Original line number Original line Diff line number Diff line Loading @@ -2158,8 +2158,17 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter mFullBackupQueue.remove(0); mFullBackupQueue.remove(0); CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1); String[] pkg = new String[]{entry.packageName}; String[] pkg = new String[]{entry.packageName}; mRunningFullBackupTask = new PerformFullTransportBackupTask(this, null, pkg, true, mRunningFullBackupTask = PerformFullTransportBackupTask.newWithCurrentTransport( scheduledJob, latch, null, null, false /* userInitiated */); this, /* observer */ null, pkg, /* updateSchedule */ true, scheduledJob, latch, /* backupObserver */ null, /* monitor */ null, /* userInitiated */ false, "BMS.beginFullBackup()"); // Acquiring wakelock for PerformFullTransportBackupTask before its start. // Acquiring wakelock for PerformFullTransportBackupTask before its start. mWakelock.acquire(); mWakelock.acquire(); (new Thread(mRunningFullBackupTask)).start(); (new Thread(mRunningFullBackupTask)).start(); Loading Loading @@ -2513,8 +2522,17 @@ public class RefactoredBackupManagerService implements BackupManagerServiceInter final long oldId = Binder.clearCallingIdentity(); final long oldId = Binder.clearCallingIdentity(); try { try { CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1); PerformFullTransportBackupTask task = new PerformFullTransportBackupTask(this, null, Runnable task = PerformFullTransportBackupTask.newWithCurrentTransport( pkgNames, false, null, latch, null, null, false /* userInitiated */); this, /* observer */ null, pkgNames, /* updateSchedule */ false, /* runningJob */ null, latch, /* backupObserver */ null, /* monitor */ null, /* userInitiated */ false, "BMS.fullTransportBackup()"); // Acquiring wakelock for PerformFullTransportBackupTask before its start. // Acquiring wakelock for PerformFullTransportBackupTask before its start. mWakelock.acquire(); mWakelock.acquire(); (new Thread(task, "full-transport-master")).start(); (new Thread(task, "full-transport-master")).start(); Loading
services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java +68 −19 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static com.android.server.backup.RefactoredBackupManagerService.OP_TYPE_B import static com.android.server.backup.RefactoredBackupManagerService.OP_TYPE_BACKUP_WAIT; import static com.android.server.backup.RefactoredBackupManagerService.OP_TYPE_BACKUP_WAIT; import static com.android.server.backup.RefactoredBackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL; import static com.android.server.backup.RefactoredBackupManagerService.TIMEOUT_FULL_BACKUP_INTERVAL; import android.annotation.Nullable; import android.app.IBackupAgent; import android.app.IBackupAgent; import android.app.backup.BackupManager; import android.app.backup.BackupManager; import android.app.backup.BackupManagerMonitor; import android.app.backup.BackupManagerMonitor; Loading @@ -46,7 +47,11 @@ import com.android.server.EventLogTags; import com.android.server.backup.BackupRestoreTask; import com.android.server.backup.BackupRestoreTask; import com.android.server.backup.FullBackupJob; import com.android.server.backup.FullBackupJob; import com.android.server.backup.RefactoredBackupManagerService; import com.android.server.backup.RefactoredBackupManagerService; import com.android.server.backup.TransportManager; import com.android.server.backup.internal.OnTaskFinishedListener; import com.android.server.backup.internal.Operation; import com.android.server.backup.internal.Operation; import com.android.server.backup.transport.TransportClient; import com.android.server.backup.transport.TransportNotAvailableException; import com.android.server.backup.utils.AppBackupUtils; import com.android.server.backup.utils.AppBackupUtils; import com.android.server.backup.utils.BackupManagerMonitorUtils; import com.android.server.backup.utils.BackupManagerMonitorUtils; import com.android.server.backup.utils.BackupObserverUtils; import com.android.server.backup.utils.BackupObserverUtils; Loading Loading @@ -89,6 +94,36 @@ import java.util.concurrent.atomic.AtomicLong; * mBackupRunner.getBackupResultBlocking(). * mBackupRunner.getBackupResultBlocking(). */ */ public class PerformFullTransportBackupTask extends FullBackupTask implements BackupRestoreTask { public class PerformFullTransportBackupTask extends FullBackupTask implements BackupRestoreTask { public static PerformFullTransportBackupTask newWithCurrentTransport( RefactoredBackupManagerService backupManagerService, IFullBackupRestoreObserver observer, String[] whichPackages, boolean updateSchedule, FullBackupJob runningJob, CountDownLatch latch, IBackupObserver backupObserver, IBackupManagerMonitor monitor, boolean userInitiated, String caller) { TransportManager transportManager = backupManagerService.getTransportManager(); TransportClient transportClient = transportManager.getCurrentTransportClient(caller); OnTaskFinishedListener listener = listenerCaller -> transportManager.disposeOfTransportClient(transportClient, listenerCaller); return new PerformFullTransportBackupTask( backupManagerService, transportClient, observer, whichPackages, updateSchedule, runningJob, latch, backupObserver, monitor, listener, userInitiated); } private static final String TAG = "PFTBT"; private static final String TAG = "PFTBT"; private RefactoredBackupManagerService backupManagerService; private RefactoredBackupManagerService backupManagerService; Loading @@ -102,9 +137,10 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba IBackupObserver mBackupObserver; IBackupObserver mBackupObserver; IBackupManagerMonitor mMonitor; IBackupManagerMonitor mMonitor; boolean mUserInitiated; boolean mUserInitiated; private volatile IBackupTransport mTransport; SinglePackageBackupRunner mBackupRunner; SinglePackageBackupRunner mBackupRunner; private final int mBackupRunnerOpToken; private final int mBackupRunnerOpToken; private final OnTaskFinishedListener mListener; private final TransportClient mTransportClient; // This is true when a backup operation for some package is in progress. // This is true when a backup operation for some package is in progress. private volatile boolean mIsDoingBackup; private volatile boolean mIsDoingBackup; Loading @@ -112,18 +148,22 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba private final int mCurrentOpToken; private final int mCurrentOpToken; public PerformFullTransportBackupTask(RefactoredBackupManagerService backupManagerService, public PerformFullTransportBackupTask(RefactoredBackupManagerService backupManagerService, TransportClient transportClient, IFullBackupRestoreObserver observer, IFullBackupRestoreObserver observer, String[] whichPackages, boolean updateSchedule, String[] whichPackages, boolean updateSchedule, FullBackupJob runningJob, CountDownLatch latch, IBackupObserver backupObserver, FullBackupJob runningJob, CountDownLatch latch, IBackupObserver backupObserver, IBackupManagerMonitor monitor, boolean userInitiated) { IBackupManagerMonitor monitor, @Nullable OnTaskFinishedListener listener, boolean userInitiated) { super(observer); super(observer); this.backupManagerService = backupManagerService; this.backupManagerService = backupManagerService; mTransportClient = transportClient; mUpdateSchedule = updateSchedule; mUpdateSchedule = updateSchedule; mLatch = latch; mLatch = latch; mJob = runningJob; mJob = runningJob; mPackages = new ArrayList<>(whichPackages.length); mPackages = new ArrayList<>(whichPackages.length); mBackupObserver = backupObserver; mBackupObserver = backupObserver; mMonitor = monitor; mMonitor = monitor; mListener = (listener != null) ? listener : OnTaskFinishedListener.NOP; mUserInitiated = userInitiated; mUserInitiated = userInitiated; mCurrentOpToken = backupManagerService.generateRandomIntegerToken(); mCurrentOpToken = backupManagerService.generateRandomIntegerToken(); mBackupRunnerOpToken = backupManagerService.generateRandomIntegerToken(); mBackupRunnerOpToken = backupManagerService.generateRandomIntegerToken(); Loading Loading @@ -241,8 +281,11 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba if (mIsDoingBackup) { if (mIsDoingBackup) { backupManagerService.handleCancel(mBackupRunnerOpToken, cancelAll); backupManagerService.handleCancel(mBackupRunnerOpToken, cancelAll); try { try { mTransport.cancelFullBackup(); // If we're running a backup we should be connected to a transport } catch (RemoteException e) { IBackupTransport transport = mTransportClient.getConnectedTransport("PFTBT.handleCancel()"); transport.cancelFullBackup(); } catch (RemoteException | TransportNotAvailableException e) { Slog.w(TAG, "Error calling cancelFullBackup() on transport: " + e); Slog.w(TAG, "Error calling cancelFullBackup() on transport: " + e); // Can't do much. // Can't do much. } } Loading Loading @@ -291,8 +334,8 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba return; return; } } mTransport = backupManagerService.getTransportManager().getCurrentTransportBinder(); IBackupTransport transport = mTransportClient.connect("PFTBT.run()"); if (mTransport == null) { if (transport == null) { Slog.w(TAG, "Transport not present; full data backup not performed"); Slog.w(TAG, "Transport not present; full data backup not performed"); backupRunStatus = BackupManager.ERROR_TRANSPORT_ABORTED; backupRunStatus = BackupManager.ERROR_TRANSPORT_ABORTED; mMonitor = BackupManagerMonitorUtils.monitorEvent(mMonitor, mMonitor = BackupManagerMonitorUtils.monitorEvent(mMonitor, Loading Loading @@ -325,17 +368,17 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba if (mCancelAll) { if (mCancelAll) { break; break; } } backupPackageStatus = mTransport.performFullBackup(currentPackage, backupPackageStatus = transport.performFullBackup(currentPackage, transportPipes[0], flags); transportPipes[0], flags); if (backupPackageStatus == BackupTransport.TRANSPORT_OK) { if (backupPackageStatus == BackupTransport.TRANSPORT_OK) { quota = mTransport.getBackupQuota(currentPackage.packageName, quota = transport.getBackupQuota(currentPackage.packageName, true /* isFullBackup */); true /* isFullBackup */); // Now set up the backup engine / data source end of things // Now set up the backup engine / data source end of things enginePipes = ParcelFileDescriptor.createPipe(); enginePipes = ParcelFileDescriptor.createPipe(); mBackupRunner = mBackupRunner = new SinglePackageBackupRunner(enginePipes[1], currentPackage, new SinglePackageBackupRunner(enginePipes[1], currentPackage, mTransport, quota, mBackupRunnerOpToken); mTransportClient, quota, mBackupRunnerOpToken); // The runner dup'd the pipe half, so we close it here // The runner dup'd the pipe half, so we close it here enginePipes[1].close(); enginePipes[1].close(); enginePipes[1] = null; enginePipes[1] = null; Loading Loading @@ -389,7 +432,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba out.write(buffer, 0, nRead); out.write(buffer, 0, nRead); synchronized (mCancelLock) { synchronized (mCancelLock) { if (!mCancelAll) { if (!mCancelAll) { backupPackageStatus = mTransport.sendBackupData(nRead); backupPackageStatus = transport.sendBackupData(nRead); } } } } totalRead += nRead; totalRead += nRead; Loading Loading @@ -425,12 +468,12 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba // result based on what finishBackup() returns. If we're in a // result based on what finishBackup() returns. If we're in a // failure case already, preserve that result and ignore whatever // failure case already, preserve that result and ignore whatever // finishBackup() reports. // finishBackup() reports. final int finishResult = mTransport.finishBackup(); final int finishResult = transport.finishBackup(); if (backupPackageStatus == BackupTransport.TRANSPORT_OK) { if (backupPackageStatus == BackupTransport.TRANSPORT_OK) { backupPackageStatus = finishResult; backupPackageStatus = finishResult; } } } else { } else { mTransport.cancelFullBackup(); transport.cancelFullBackup(); } } } } } } Loading Loading @@ -469,7 +512,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba // Also ask the transport how long it wants us to wait before // Also ask the transport how long it wants us to wait before // moving on to the next package, if any. // moving on to the next package, if any. backoff = mTransport.requestFullBackupTime(); backoff = transport.requestFullBackupTime(); if (DEBUG_SCHEDULING) { if (DEBUG_SCHEDULING) { Slog.i(TAG, "Transport suggested backoff=" + backoff); Slog.i(TAG, "Transport suggested backoff=" + backoff); } } Loading Loading @@ -591,6 +634,8 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba backupManagerService.setRunningFullBackupTask(null); backupManagerService.setRunningFullBackupTask(null); } } mListener.onFinished("PFTBT.run()"); mLatch.countDown(); mLatch.countDown(); // Now that we're actually done with schedule-driven work, reschedule // Now that we're actually done with schedule-driven work, reschedule Loading Loading @@ -633,12 +678,13 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba class SinglePackageBackupPreflight implements BackupRestoreTask, FullBackupPreflight { class SinglePackageBackupPreflight implements BackupRestoreTask, FullBackupPreflight { final AtomicLong mResult = new AtomicLong(BackupTransport.AGENT_ERROR); final AtomicLong mResult = new AtomicLong(BackupTransport.AGENT_ERROR); final CountDownLatch mLatch = new CountDownLatch(1); final CountDownLatch mLatch = new CountDownLatch(1); final IBackupTransport mTransport; final TransportClient mTransportClient; final long mQuota; final long mQuota; private final int mCurrentOpToken; private final int mCurrentOpToken; SinglePackageBackupPreflight(IBackupTransport transport, long quota, int currentOpToken) { SinglePackageBackupPreflight( mTransport = transport; TransportClient transportClient, long quota, int currentOpToken) { mTransportClient = transportClient; mQuota = quota; mQuota = quota; mCurrentOpToken = currentOpToken; mCurrentOpToken = currentOpToken; } } Loading Loading @@ -672,7 +718,9 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba Slog.v(TAG, "Got preflight response; size=" + totalSize); Slog.v(TAG, "Got preflight response; size=" + totalSize); } } result = mTransport.checkFullBackupSize(totalSize); IBackupTransport transport = mTransportClient.connectOrThrow("PFTBT$SPBP.preflightFullBackup()"); result = transport.checkFullBackupSize(totalSize); if (result == BackupTransport.TRANSPORT_QUOTA_EXCEEDED) { if (result == BackupTransport.TRANSPORT_QUOTA_EXCEEDED) { if (MORE_DEBUG) { if (MORE_DEBUG) { Slog.d(TAG, "Package hit quota limit on preflight " + Slog.d(TAG, "Package hit quota limit on preflight " + Loading Loading @@ -739,12 +787,13 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba private volatile boolean mIsCancelled; private volatile boolean mIsCancelled; SinglePackageBackupRunner(ParcelFileDescriptor output, PackageInfo target, SinglePackageBackupRunner(ParcelFileDescriptor output, PackageInfo target, IBackupTransport transport, long quota, int currentOpToken) throws IOException { TransportClient transportClient, long quota, int currentOpToken) throws IOException { mOutput = ParcelFileDescriptor.dup(output.getFileDescriptor()); mOutput = ParcelFileDescriptor.dup(output.getFileDescriptor()); mTarget = target; mTarget = target; mCurrentOpToken = currentOpToken; mCurrentOpToken = currentOpToken; mEphemeralToken = backupManagerService.generateRandomIntegerToken(); mEphemeralToken = backupManagerService.generateRandomIntegerToken(); mPreflight = new SinglePackageBackupPreflight(transport, quota, mEphemeralToken); mPreflight = new SinglePackageBackupPreflight(transportClient, quota, mEphemeralToken); mPreflightLatch = new CountDownLatch(1); mPreflightLatch = new CountDownLatch(1); mBackupLatch = new CountDownLatch(1); mBackupLatch = new CountDownLatch(1); mPreflightResult = BackupTransport.AGENT_ERROR; mPreflightResult = BackupTransport.AGENT_ERROR; Loading
services/backup/java/com/android/server/backup/internal/PerformBackupTask.java +5 −5 Original line number Original line Diff line number Diff line Loading @@ -184,11 +184,11 @@ public class PerformBackupTask implements BackupRestoreTask { mPendingFullBackups.toArray(new String[mPendingFullBackups.size()]); mPendingFullBackups.toArray(new String[mPendingFullBackups.size()]); mFullBackupTask = mFullBackupTask = new PerformFullTransportBackupTask(backupManagerService, new PerformFullTransportBackupTask(backupManagerService, /*fullBackupRestoreObserver*/ transportClient, null, /*fullBackupRestoreObserver*/ null, fullBackups, /*updateSchedule*/ false, /*runningJob*/ null, fullBackups, /*updateSchedule*/ false, /*runningJob*/ null, latch, latch, mObserver, mMonitor, mUserInitiated); mObserver, mMonitor, mListener, mUserInitiated); registerTask(); registerTask(); backupManagerService.addBackupTrace("STATE => INITIAL"); backupManagerService.addBackupTrace("STATE => INITIAL"); Loading Loading @@ -585,11 +585,11 @@ public class PerformBackupTask implements BackupRestoreTask { if (!mCancelAll && mStatus == BackupTransport.TRANSPORT_OK && if (!mCancelAll && mStatus == BackupTransport.TRANSPORT_OK && mPendingFullBackups != null && !mPendingFullBackups.isEmpty()) { mPendingFullBackups != null && !mPendingFullBackups.isEmpty()) { // TODO(brufino): Move the onFinish() call to the full-backup task mListener.onFinished(callerLogString); Slog.d(TAG, "Starting full backups for: " + mPendingFullBackups); Slog.d(TAG, "Starting full backups for: " + mPendingFullBackups); // Acquiring wakelock for PerformFullTransportBackupTask before its start. // Acquiring wakelock for PerformFullTransportBackupTask before its start. backupManagerService.getWakelock().acquire(); backupManagerService.getWakelock().acquire(); // The full-backup task is now responsible for calling onFinish() on mListener, which // was the listener we passed it. (new Thread(mFullBackupTask, "full-transport-requested")).start(); (new Thread(mFullBackupTask, "full-transport-requested")).start(); } else if (mCancelAll) { } else if (mCancelAll) { mListener.onFinished(callerLogString); mListener.onFinished(callerLogString); Loading
services/backup/java/com/android/server/backup/transport/TransportClient.java +19 −0 Original line number Original line Diff line number Diff line Loading @@ -367,6 +367,25 @@ public class TransportClient { return transport; return transport; } } /** * If the {@link TransportClient} is already connected to the transport, returns the transport, * otherwise throws {@link TransportNotAvailableException}. * * @param caller A {@link String} identifying the caller for logging/debugging purposes. Check * {@link #connectAsync(TransportConnectionListener, String)} for more details. * @return A {@link IBackupTransport} transport binder instance. * @throws TransportNotAvailableException if not connected. */ public IBackupTransport getConnectedTransport(String caller) throws TransportNotAvailableException { IBackupTransport transport = mTransport; if (transport == null) { log(Log.ERROR, caller, "Transport not connected"); throw new TransportNotAvailableException(); } return transport; } @Override @Override public String toString() { public String toString() { return "TransportClient{" return "TransportClient{" Loading
services/backup/java/com/android/server/backup/transport/TransportNotAvailableException.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -25,7 +25,7 @@ import com.android.internal.backup.IBackupTransport; * * * @see TransportClient#connectAsync(TransportConnectionListener, String) * @see TransportClient#connectAsync(TransportConnectionListener, String) */ */ class TransportNotAvailableException extends Exception { public class TransportNotAvailableException extends Exception { TransportNotAvailableException() { TransportNotAvailableException() { super("Transport not available"); super("Transport not available"); } } Loading