summaryrefslogtreecommitdiff
path: root/apex/blobstore
diff options
context:
space:
mode:
authorSudheer Shanka <sudheersai@google.com>2020-02-27 15:17:43 -0800
committerSudheer Shanka <sudheersai@google.com>2020-02-27 15:23:44 -0800
commitb76f766df7accc388160daeca29477e7d7c1735d (patch)
treeeb600901b3aa555ad42226686e7a029662410bde /apex/blobstore
parentb629d69db047c40f2b110f2d73ad8ceb1b32ea68 (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.java17
-rw-r--r--apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java14
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 {