summaryrefslogtreecommitdiff
path: root/apex/blobstore/service/java
diff options
context:
space:
mode:
authorSudheer Shanka <sudheersai@google.com>2020-02-16 19:46:17 -0800
committerSudheer Shanka <sudheersai@google.com>2020-02-17 16:33:38 -0800
commit285848d88f0b3926e13c0f9aba2af44acf66f84d (patch)
treec7e0f6c602500f8ac4a4756c4a9535658f5cc3bb /apex/blobstore/service/java
parentcce9df2afc3edc9a58a97dbd3746c5d2acb217a9 (diff)
Re-enable BlobStorePerfTests.
+ Add a shell command to delete a blob. Bug: 149324953 Test: atest apct-tests/perftests/blobstore/src/com/android/perftests/blob/BlobStorePerfTests.java Change-Id: Id83086614bd71335fdd461387a84f761b0d9edb7
Diffstat (limited to 'apex/blobstore/service/java')
-rw-r--r--apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java14
-rw-r--r--apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerShellCommand.java58
2 files changed, 70 insertions, 2 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 1efdbda97fe5..d4ceabda8acc 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
@@ -874,6 +874,20 @@ public class BlobStoreManagerService extends SystemService {
}
}
+ void deleteBlob(@NonNull BlobHandle blobHandle, @UserIdInt int userId) {
+ synchronized (mBlobsLock) {
+ final ArrayMap<BlobHandle, BlobMetadata> userBlobs = getUserBlobsLocked(userId);
+ final BlobMetadata blobMetadata = userBlobs.get(blobHandle);
+ if (blobMetadata == null) {
+ return;
+ }
+ blobMetadata.getBlobFile().delete();
+ userBlobs.remove(blobHandle);
+ mKnownBlobIds.remove(blobMetadata.getBlobId());
+ writeBlobsInfoAsync();
+ }
+ }
+
@GuardedBy("mBlobsLock")
private void dumpSessionsLocked(IndentingPrintWriter fout, DumpArgs dumpArgs) {
for (int i = 0, userCount = mSessions.size(); i < userCount; ++i) {
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerShellCommand.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerShellCommand.java
index 3ac30f8fff6c..d58294b8b941 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerShellCommand.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerShellCommand.java
@@ -15,10 +15,13 @@
*/
package com.android.server.blob;
+import android.app.ActivityManager;
+import android.app.blob.BlobHandle;
import android.os.ShellCommand;
import android.os.UserHandle;
import java.io.PrintWriter;
+import java.util.Base64;
class BlobStoreManagerShellCommand extends ShellCommand {
@@ -39,6 +42,8 @@ class BlobStoreManagerShellCommand extends ShellCommand {
return runClearAllSessions(pw);
case "clear-all-blobs":
return runClearAllBlobs(pw);
+ case "delete-blob":
+ return runDeleteBlob(pw);
default:
return handleDefaultCommands(cmd);
}
@@ -68,6 +73,17 @@ class BlobStoreManagerShellCommand extends ShellCommand {
return 0;
}
+ private int runDeleteBlob(PrintWriter pw) {
+ final ParsedArgs args = new ParsedArgs();
+
+ if (parseOptions(pw, args) < 0) {
+ return -1;
+ }
+
+ mService.deleteBlob(args.getBlobHandle(), args.userId);
+ return 0;
+ }
+
@Override
public void onHelp() {
final PrintWriter pw = getOutPrintWriter();
@@ -78,14 +94,24 @@ class BlobStoreManagerShellCommand extends ShellCommand {
pw.println("clear-all-sessions [-u | --user USER_ID]");
pw.println(" Remove all sessions.");
pw.println(" Options:");
- pw.println(" -u or --user: specify which user's sessions to be removed;");
+ pw.println(" -u or --user: specify which user's sessions to be removed.");
pw.println(" If not specified, sessions in all users are removed.");
pw.println();
pw.println("clear-all-blobs [-u | --user USER_ID]");
pw.println(" Remove all blobs.");
pw.println(" Options:");
+ pw.println(" -u or --user: specify which user's blobs to be removed.");
+ pw.println(" If not specified, blobs in all users are removed.");
+ pw.println("delete-blob [-u | --user USER_ID] [--digest DIGEST] [--expiry EXPIRY_TIME] "
+ + "[--label LABEL] [--tag TAG]");
+ pw.println(" Delete a blob.");
+ pw.println(" Options:");
pw.println(" -u or --user: specify which user's blobs to be removed;");
pw.println(" If not specified, blobs in all users are removed.");
+ pw.println(" --digest: Base64 encoded digest of the blob to delete.");
+ pw.println(" --expiry: Expiry time of the blob to delete, in milliseconds.");
+ pw.println(" --label: Label of the blob to delete.");
+ pw.println(" --tag: Tag of the blob to delete.");
pw.println();
}
@@ -97,15 +123,43 @@ class BlobStoreManagerShellCommand extends ShellCommand {
case "--user":
args.userId = Integer.parseInt(getNextArgRequired());
break;
+ case "--algo":
+ args.algorithm = getNextArgRequired();
+ break;
+ case "--digest":
+ args.digest = Base64.getDecoder().decode(getNextArgRequired());
+ break;
+ case "--label":
+ args.label = getNextArgRequired();
+ break;
+ case "--expiry":
+ args.expiryTimeMillis = Long.parseLong(getNextArgRequired());
+ break;
+ case "--tag":
+ args.tag = getNextArgRequired();
+ break;
default:
pw.println("Error: unknown option '" + opt + "'");
return -1;
}
}
+ if (args.userId == UserHandle.USER_CURRENT) {
+ args.userId = ActivityManager.getCurrentUser();
+ }
return 0;
}
private static class ParsedArgs {
- public int userId;
+ public int userId = UserHandle.USER_CURRENT;
+
+ public String algorithm = BlobHandle.ALGO_SHA_256;
+ public byte[] digest;
+ public long expiryTimeMillis;
+ public CharSequence label;
+ public String tag;
+
+ public BlobHandle getBlobHandle() {
+ return BlobHandle.create(algorithm, digest, label, expiryTimeMillis, tag);
+ }
}
}