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
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 d4ceabd..aff6fcfc 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 @@
     }
 
     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 @@
                     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) {