Loading apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java +14 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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()); } } Loading @@ -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) { Loading Loading @@ -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 apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java +10 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading services/tests/mockingservicestests/src/com/android/server/blob/BlobStoreManagerServiceTest.java +5 −0 Original line number Diff line number Diff line Loading @@ -343,5 +343,10 @@ public class BlobStoreManagerServiceTest { public Handler initializeMessageHandler() { return mHandler; } @Override public Handler getBackgroundHandler() { return mHandler; } } } Loading
apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java +14 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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()); } } Loading @@ -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) { Loading Loading @@ -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
apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java +10 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading
services/tests/mockingservicestests/src/com/android/server/blob/BlobStoreManagerServiceTest.java +5 −0 Original line number Diff line number Diff line Loading @@ -343,5 +343,10 @@ public class BlobStoreManagerServiceTest { public Handler initializeMessageHandler() { return mHandler; } @Override public Handler getBackgroundHandler() { return mHandler; } } }