From b81243f52365bc2b6316b541fe76ec6947aca336 Mon Sep 17 00:00:00 2001 From: Michal Karpinski Date: Thu, 20 Apr 2017 17:00:31 +0100 Subject: [PATCH] Offload the mRunningFullBackupTask.handleCancel() call from the main thread to another thread The system_server process was being killed by Watchdog, as the main thread was waiting for the mCancelLock for over a minute. Bug: 35968123 Test: make gts -j40 && gts-tradefed run gts -m GtsGmscoreHostTestCases -t com.google.android.gts.backup.BackupManagerHostTest Change-Id: Ia146569d2c741b35a6f6c9bfc4c5ddf8539b6242 --- .../server/backup/BackupManagerService.java | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 930100627c2b..1b970e5656bd 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -5641,14 +5641,24 @@ public class BackupManagerService { // The job scheduler says our constraints don't hold any more, // so tear down any ongoing backup task right away. void endFullBackup() { - synchronized (mQueueLock) { - if (mRunningFullBackupTask != null) { - if (DEBUG_SCHEDULING) { - Slog.i(TAG, "Telling running backup to stop"); + // offload the mRunningFullBackupTask.handleCancel() call to another thread, + // as we might have to wait for mCancelLock + Runnable endFullBackupRunnable = new Runnable() { + @Override + public void run() { + PerformFullTransportBackupTask pftbt = null; + synchronized (mQueueLock) { + if (mRunningFullBackupTask != null) { + if (DEBUG_SCHEDULING) { + Slog.i(TAG, "Telling running backup to stop"); + } + pftbt = mRunningFullBackupTask; + } } - mRunningFullBackupTask.handleCancel(true); + pftbt.handleCancel(true); } - } + }; + new Thread(endFullBackupRunnable, "end-full-backup").start(); } // ----- Restore infrastructure ----- -- 2.11.0