diff options
author | Sudheer Shanka <sudheersai@google.com> | 2020-02-18 15:11:42 -0800 |
---|---|---|
committer | Sudheer Shanka <sudheersai@google.com> | 2020-02-18 16:22:52 -0800 |
commit | ab4a8ae4dfa2a89cd7c0e5dc0a7ae798d8dd9eab (patch) | |
tree | eeb4e5c3663d834aaa08bd5d29949fce5383bd98 /apex/blobstore | |
parent | 251c21df37937f301234e72ab295084e39c75901 (diff) |
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
Diffstat (limited to 'apex/blobstore')
-rw-r--r-- | apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java | 37 |
1 files 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 d4ceabda8acc..aff6fcfc1dd6 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<BlobHandle, BlobMetadata> userBlobs = getUserBlobsLocked(userId); + final ArrayMap<BlobHandle, BlobMetadata> 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) { |