diff options
author | Sudheer Shanka <sudheersai@google.com> | 2020-02-27 15:17:43 -0800 |
---|---|---|
committer | Sudheer Shanka <sudheersai@google.com> | 2020-02-27 15:23:44 -0800 |
commit | b76f766df7accc388160daeca29477e7d7c1735d (patch) | |
tree | eb600901b3aa555ad42226686e7a029662410bde /apex/blobstore | |
parent | b629d69db047c40f2b110f2d73ad8ceb1b32ea68 (diff) |
Compute digest in BackgroundThread which is limited to little cores.
Bug: 149525109
Test: atest --test-mapping apex/blobstore
Change-Id: I70333e1d880c45db15e9e1fe730f3443626aab67
Diffstat (limited to 'apex/blobstore')
-rw-r--r-- | apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java | 17 | ||||
-rw-r--r-- | apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java | 14 |
2 files changed, 24 insertions, 7 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 91df1df0c5b5..05c661127eab 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java @@ -74,6 +74,7 @@ import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.BackgroundThread; import com.android.internal.util.CollectionUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastXmlSerializer; @@ -140,6 +141,7 @@ public class BlobStoreManagerService extends SystemService { private final Context mContext; private final Handler mHandler; + private final Handler mBackgroundHandler; private final Injector mInjector; private final SessionStateChangeListener mSessionStateChangeListener = new SessionStateChangeListener(); @@ -160,11 +162,12 @@ public class BlobStoreManagerService extends SystemService { mContext = context; mInjector = injector; mHandler = mInjector.initializeMessageHandler(); + mBackgroundHandler = mInjector.getBackgroundHandler(); } private static Handler initializeMessageHandler() { final HandlerThread handlerThread = new ServiceThread(TAG, - Process.THREAD_PRIORITY_BACKGROUND, true /* allowIo */); + Process.THREAD_PRIORITY_DEFAULT, true /* allowIo */); handlerThread.start(); final Handler handler = new Handler(handlerThread.getLooper()); Watchdog.getInstance().addThread(handler); @@ -418,7 +421,7 @@ public class BlobStoreManagerService extends SystemService { public void onStateChanged(@NonNull BlobStoreSession session) { mHandler.post(PooledLambda.obtainRunnable( BlobStoreManagerService::onStateChangedInternal, - BlobStoreManagerService.this, session)); + BlobStoreManagerService.this, session).recycleOnUse()); } } @@ -437,7 +440,11 @@ public class BlobStoreManagerService extends SystemService { } break; case STATE_COMMITTED: - session.verifyBlobData(); + mBackgroundHandler.post(() -> { + session.computeDigest(); + mHandler.post(PooledLambda.obtainRunnable( + BlobStoreSession::verifyBlobData, session).recycleOnUse()); + }); break; case STATE_VERIFIED_VALID: synchronized (mBlobsLock) { @@ -1412,5 +1419,9 @@ public class BlobStoreManagerService extends SystemService { public Handler initializeMessageHandler() { return BlobStoreManagerService.initializeMessageHandler(); } + + public Handler getBackgroundHandler() { + return BackgroundThread.getHandler(); + } } }
\ No newline at end of file diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java index d33a09f4351b..cc4044ed46b9 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java @@ -96,6 +96,10 @@ class BlobStoreSession extends IBlobStoreSession.Stub { @GuardedBy("mRevocableFds") private ArrayList<RevocableFileDescriptor> mRevocableFds = new ArrayList<>(); + // This will be accessed from only one thread at any point of time, so no need to grab + // a lock for this. + private byte[] mDataDigest; + @GuardedBy("mSessionLock") private int mState = STATE_CLOSED; @@ -381,19 +385,21 @@ class BlobStoreSession extends IBlobStoreSession.Stub { } } - void verifyBlobData() { - byte[] actualDigest = null; + void computeDigest() { try { Trace.traceBegin(TRACE_TAG_SYSTEM_SERVER, "computeBlobDigest-i" + mSessionId + "-l" + getSessionFile().length()); - actualDigest = FileUtils.digest(getSessionFile(), mBlobHandle.algorithm); + mDataDigest = FileUtils.digest(getSessionFile(), mBlobHandle.algorithm); } catch (IOException | NoSuchAlgorithmException e) { Slog.e(TAG, "Error computing the digest", e); } finally { Trace.traceEnd(TRACE_TAG_SYSTEM_SERVER); } + } + + void verifyBlobData() { synchronized (mSessionLock) { - if (actualDigest != null && Arrays.equals(actualDigest, mBlobHandle.digest)) { + if (mDataDigest != null && Arrays.equals(mDataDigest, mBlobHandle.digest)) { mState = STATE_VERIFIED_VALID; // Commit callback will be sent once the data is persisted. } else { |