From ab4a8ae4dfa2a89cd7c0e5dc0a7ae798d8dd9eab Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Tue, 18 Feb 2020 15:11:42 -0800 Subject: [PATCH] Don't hold any locks while computing the blob digest. Computing the digest could take long and there is no need to hold any locks for this. Test: atest --test-mapping apex/blobstore Change-Id: If986e90743a6fc244f3afb7615d6167790077d23 --- .../server/blob/BlobStoreManagerService.java | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java index d4ceabda8accc..aff6fcfc1dd6e 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java @@ -384,24 +384,27 @@ public class BlobStoreManagerService extends SystemService { } private void onStateChangedInternal(@NonNull BlobStoreSession session) { - synchronized (mBlobsLock) { - switch (session.getState()) { - case STATE_ABANDONED: - case STATE_VERIFIED_INVALID: - session.getSessionFile().delete(); + switch (session.getState()) { + case STATE_ABANDONED: + case STATE_VERIFIED_INVALID: + session.getSessionFile().delete(); + synchronized (mBlobsLock) { getUserSessionsLocked(UserHandle.getUserId(session.getOwnerUid())) .remove(session.getSessionId()); mKnownBlobIds.remove(session.getSessionId()); if (LOGV) { Slog.v(TAG, "Session is invalid; deleted " + session); } - break; - case STATE_COMMITTED: - session.verifyBlobData(); - break; - case STATE_VERIFIED_VALID: + } + break; + case STATE_COMMITTED: + session.verifyBlobData(); + break; + case STATE_VERIFIED_VALID: + synchronized (mBlobsLock) { final int userId = UserHandle.getUserId(session.getOwnerUid()); - final ArrayMap userBlobs = getUserBlobsLocked(userId); + final ArrayMap userBlobs = getUserBlobsLocked( + userId); BlobMetadata blob = userBlobs.get(session.getBlobHandle()); if (blob == null) { blob = new BlobMetadata(mContext, @@ -424,11 +427,13 @@ public class BlobStoreManagerService extends SystemService { if (LOGV) { Slog.v(TAG, "Successfully committed session " + session); } - break; - default: - Slog.wtf(TAG, "Invalid session state: " - + stateToString(session.getState())); - } + } + break; + default: + Slog.wtf(TAG, "Invalid session state: " + + stateToString(session.getState())); + } + synchronized (mBlobsLock) { try { writeBlobSessionsLocked(); } catch (Exception e) {