Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1bbb6024 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Binding on-demand #2: PerformFullTransportBackupTask usage"

parents e3a80101 4719ed51
Loading
Loading
Loading
Loading
+22 −4
Original line number Original line Diff line number Diff line
@@ -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();
@@ -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();
+68 −19
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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();
@@ -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.
                }
                }
@@ -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,
@@ -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;
@@ -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;
@@ -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();
                            }
                            }
                        }
                        }
                    }
                    }
@@ -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);
                    }
                    }
@@ -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
@@ -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;
        }
        }
@@ -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 " +
@@ -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;
+5 −5
Original line number Original line Diff line number Diff line
@@ -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");
@@ -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);
+19 −0
Original line number Original line Diff line number Diff line
@@ -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{"
+1 −1
Original line number Original line Diff line number Diff line
@@ -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