From b0d11d1cc4d74f36a3034b04a99417966d96feeb Mon Sep 17 00:00:00 2001 From: "peter.zhang" Date: Thu, 13 Jun 2019 16:39:30 +0800 Subject: [PATCH] Fix StorageManagerService linkToDeath more than one time when vold/storaged died. Storaged and vold register Binder.linkToDeath in the same method, once one died, the other would register Binder.linkToDeath many times. Once the other died, it would receive binderDied callBack many times, then executing volume reset command many times in very short time, it's a bad user experience. Bug:135167044 Test:kill vold and storaged, just one time binderDied callBack, so just run one time volume reset. Change-Id: I881af5b6ce399dad39274fc2598e92a3b9f88a77 --- .../android/server/StorageManagerService.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 371e5177ede36..d46758c3dc391 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -1452,10 +1452,11 @@ class StorageManagerService extends IStorageManager.Stub } private void start() { - connect(); + connectStoraged(); + connectVold(); } - private void connect() { + private void connectStoraged() { IBinder binder = ServiceManager.getService("storaged"); if (binder != null) { try { @@ -1464,7 +1465,7 @@ class StorageManagerService extends IStorageManager.Stub public void binderDied() { Slog.w(TAG, "storaged died; reconnecting"); mStoraged = null; - connect(); + connectStoraged(); } }, 0); } catch (RemoteException e) { @@ -1478,7 +1479,17 @@ class StorageManagerService extends IStorageManager.Stub Slog.w(TAG, "storaged not found; trying again"); } - binder = ServiceManager.getService("vold"); + if (mStoraged == null) { + BackgroundThread.getHandler().postDelayed(() -> { + connectStoraged(); + }, DateUtils.SECOND_IN_MILLIS); + } else { + onDaemonConnected(); + } + } + + private void connectVold() { + IBinder binder = ServiceManager.getService("vold"); if (binder != null) { try { binder.linkToDeath(new DeathRecipient() { @@ -1486,7 +1497,7 @@ class StorageManagerService extends IStorageManager.Stub public void binderDied() { Slog.w(TAG, "vold died; reconnecting"); mVold = null; - connect(); + connectVold(); } }, 0); } catch (RemoteException e) { @@ -1506,9 +1517,9 @@ class StorageManagerService extends IStorageManager.Stub Slog.w(TAG, "vold not found; trying again"); } - if (mStoraged == null || mVold == null) { + if (mVold == null) { BackgroundThread.getHandler().postDelayed(() -> { - connect(); + connectVold(); }, DateUtils.SECOND_IN_MILLIS); } else { onDaemonConnected();