diff options
author | Sudheer Shanka <sudheersai@google.com> | 2020-06-17 05:01:38 -0700 |
---|---|---|
committer | Sudheer Shanka <sudheersai@google.com> | 2020-06-19 15:49:15 -0700 |
commit | fbda8d707849ee3ea2eb19a15040526786f66658 (patch) | |
tree | 2cb2f2376e626425f031e01738dcb719e5c01f9a /apex/blobstore | |
parent | 14849cfbd4df62a0b305f72d008e4a847f47a5bb (diff) |
Delay deleting the blob after the last lease is released.
Bug: 159485704
Test: atest --test-mapping apex/blobstore
Change-Id: Iab153ae00107ee35705d7c17a3e51e7308e2e823
Diffstat (limited to 'apex/blobstore')
-rw-r--r-- | apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java | 24 | ||||
-rw-r--r-- | apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java | 19 |
2 files changed, 40 insertions, 3 deletions
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java index d780d5dab14d..265479f7c533 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java @@ -131,6 +131,16 @@ class BlobStoreConfig { public static boolean USE_REVOCABLE_FD_FOR_READS = DEFAULT_USE_REVOCABLE_FD_FOR_READS; + /** + * Denotes how long before a blob is deleted, once the last lease on it is released. + */ + public static final String KEY_DELETE_ON_LAST_LEASE_DELAY_MS = + "delete_on_last_lease_delay_ms"; + public static final long DEFAULT_DELETE_ON_LAST_LEASE_DELAY_MS = + TimeUnit.HOURS.toMillis(6); + public static long DELETE_ON_LAST_LEASE_DELAY_MS = + DEFAULT_DELETE_ON_LAST_LEASE_DELAY_MS; + static void refresh(Properties properties) { if (!NAMESPACE_BLOBSTORE.equals(properties.getNamespace())) { return; @@ -164,6 +174,10 @@ class BlobStoreConfig { USE_REVOCABLE_FD_FOR_READS = properties.getBoolean(key, DEFAULT_USE_REVOCABLE_FD_FOR_READS); break; + case KEY_DELETE_ON_LAST_LEASE_DELAY_MS: + DELETE_ON_LAST_LEASE_DELAY_MS = properties.getLong(key, + DEFAULT_DELETE_ON_LAST_LEASE_DELAY_MS); + break; default: Slog.wtf(TAG, "Unknown key in device config properties: " + key); } @@ -193,6 +207,9 @@ class BlobStoreConfig { TimeUtils.formatDuration(DEFAULT_COMMIT_COOL_OFF_DURATION_MS))); fout.println(String.format(dumpFormat, KEY_USE_REVOCABLE_FD_FOR_READS, USE_REVOCABLE_FD_FOR_READS, DEFAULT_USE_REVOCABLE_FD_FOR_READS)); + fout.println(String.format(dumpFormat, KEY_DELETE_ON_LAST_LEASE_DELAY_MS, + TimeUtils.formatDuration(DELETE_ON_LAST_LEASE_DELAY_MS), + TimeUtils.formatDuration(DEFAULT_DELETE_ON_LAST_LEASE_DELAY_MS))); } } @@ -264,6 +281,13 @@ class BlobStoreConfig { return DeviceConfigProperties.USE_REVOCABLE_FD_FOR_READS; } + /** + * Returns the duration to wait before a blob is deleted, once the last lease on it is released. + */ + public static long getDeletionOnLastLeaseDelayMs() { + return DeviceConfigProperties.DELETE_ON_LAST_LEASE_DELAY_MS; + } + @Nullable public static File prepareBlobFile(long sessionId) { final File blobsDir = prepareBlobsDir(); 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 78eab0b0a21e..a90536fee904 100644 --- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java +++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java @@ -34,6 +34,7 @@ import static com.android.server.blob.BlobStoreConfig.LOGV; import static com.android.server.blob.BlobStoreConfig.TAG; import static com.android.server.blob.BlobStoreConfig.XML_VERSION_CURRENT; import static com.android.server.blob.BlobStoreConfig.getAdjustedCommitTimeMs; +import static com.android.server.blob.BlobStoreConfig.getDeletionOnLastLeaseDelayMs; import static com.android.server.blob.BlobStoreSession.STATE_ABANDONED; import static com.android.server.blob.BlobStoreSession.STATE_COMMITTED; import static com.android.server.blob.BlobStoreSession.STATE_VERIFIED_INVALID; @@ -488,9 +489,21 @@ public class BlobStoreManagerService extends SystemService { Slog.v(TAG, "Released lease on " + blobHandle + "; callingUid=" + callingUid + ", callingPackage=" + callingPackage); } - if (blobMetadata.shouldBeDeleted(true /* respectLeaseWaitTime */)) { - deleteBlobLocked(blobMetadata); - userBlobs.remove(blobHandle); + if (!blobMetadata.hasLeases()) { + mHandler.postDelayed(() -> { + synchronized (mBlobsLock) { + // Check if blobMetadata object is still valid. If it is not, then + // it means that it was already deleted and nothing else to do here. + if (!Objects.equals(userBlobs.get(blobHandle), blobMetadata)) { + return; + } + if (blobMetadata.shouldBeDeleted(true /* respectLeaseWaitTime */)) { + deleteBlobLocked(blobMetadata); + userBlobs.remove(blobHandle); + } + writeBlobsInfoAsync(); + } + }, getDeletionOnLastLeaseDelayMs()); } writeBlobsInfoAsync(); } |