summaryrefslogtreecommitdiff
path: root/apex/blobstore
diff options
context:
space:
mode:
authorSudheer Shanka <sudheersai@google.com>2020-02-18 15:11:42 -0800
committerSudheer Shanka <sudheersai@google.com>2020-02-18 16:22:52 -0800
commitab4a8ae4dfa2a89cd7c0e5dc0a7ae798d8dd9eab (patch)
treeeeb4e5c3663d834aaa08bd5d29949fce5383bd98 /apex/blobstore
parent251c21df37937f301234e72ab295084e39c75901 (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.java37
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) {