summaryrefslogtreecommitdiff
path: root/apex/blobstore
diff options
context:
space:
mode:
authorSudheer Shanka <sudheersai@google.com>2020-06-18 16:46:36 -0700
committerSudheer Shanka <sudheersai@google.com>2020-06-18 16:46:36 -0700
commitd6f4794eed41f1891ff37b810671bc183a0606e0 (patch)
tree22853078a37c1762df9b6963441860587c0ffae9 /apex/blobstore
parent384982ef624aa2da3129455546978a3c18551c3a (diff)
Make usage of revocable fds for reads configurable.
Bug: 159374701 Test: atest --test-mapping apex/blobstore Change-Id: If449197938fe457726bb5ec18663cfd7a500eb93
Diffstat (limited to 'apex/blobstore')
-rw-r--r--apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java6
-rw-r--r--apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java22
-rw-r--r--apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java8
3 files changed, 34 insertions, 2 deletions
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java b/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java
index 7e8c90632fd9..31532788291c 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobMetadata.java
@@ -354,7 +354,11 @@ class BlobMetadata {
throw e.rethrowAsIOException();
}
try {
- return createRevocableFd(fd, callingPackage);
+ if (BlobStoreConfig.shouldUseRevocableFdForReads()) {
+ return createRevocableFd(fd, callingPackage);
+ } else {
+ return new ParcelFileDescriptor(fd);
+ }
} catch (IOException e) {
IoUtils.closeQuietly(fd);
throw e;
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 08ee24460722..d780d5dab14d 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreConfig.java
@@ -122,6 +122,15 @@ class BlobStoreConfig {
public static long COMMIT_COOL_OFF_DURATION_MS =
DEFAULT_COMMIT_COOL_OFF_DURATION_MS;
+ /**
+ * Denotes whether to use RevocableFileDescriptor when apps try to read session/blob data.
+ */
+ public static final String KEY_USE_REVOCABLE_FD_FOR_READS =
+ "use_revocable_fd_for_reads";
+ public static final boolean DEFAULT_USE_REVOCABLE_FD_FOR_READS = true;
+ public static boolean USE_REVOCABLE_FD_FOR_READS =
+ DEFAULT_USE_REVOCABLE_FD_FOR_READS;
+
static void refresh(Properties properties) {
if (!NAMESPACE_BLOBSTORE.equals(properties.getNamespace())) {
return;
@@ -151,6 +160,10 @@ class BlobStoreConfig {
COMMIT_COOL_OFF_DURATION_MS = properties.getLong(key,
DEFAULT_COMMIT_COOL_OFF_DURATION_MS);
break;
+ case KEY_USE_REVOCABLE_FD_FOR_READS:
+ USE_REVOCABLE_FD_FOR_READS = properties.getBoolean(key,
+ DEFAULT_USE_REVOCABLE_FD_FOR_READS);
+ break;
default:
Slog.wtf(TAG, "Unknown key in device config properties: " + key);
}
@@ -178,6 +191,8 @@ class BlobStoreConfig {
fout.println(String.format(dumpFormat, KEY_COMMIT_COOL_OFF_DURATION_MS,
TimeUtils.formatDuration(COMMIT_COOL_OFF_DURATION_MS),
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));
}
}
@@ -242,6 +257,13 @@ class BlobStoreConfig {
< System.currentTimeMillis();
}
+ /**
+ * Return whether to use RevocableFileDescriptor when apps try to read session/blob data.
+ */
+ public static boolean shouldUseRevocableFdForReads() {
+ return DeviceConfigProperties.USE_REVOCABLE_FD_FOR_READS;
+ }
+
@Nullable
public static File prepareBlobFile(long sessionId) {
final File blobsDir = prepareBlobsDir();
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 77ca4aa7a9e6..28f7e75fd0e8 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreSession.java
@@ -266,6 +266,13 @@ class BlobStoreSession extends IBlobStoreSession.Stub {
throw new IllegalStateException("Not allowed to read in state: "
+ stateToString(mState));
}
+ if (!BlobStoreConfig.shouldUseRevocableFdForReads()) {
+ try {
+ return new ParcelFileDescriptor(openReadInternal());
+ } catch (IOException e) {
+ throw ExceptionUtils.wrap(e);
+ }
+ }
}
FileDescriptor fd = null;
@@ -281,7 +288,6 @@ class BlobStoreSession extends IBlobStoreSession.Stub {
trackRevocableFdLocked(revocableFd);
return revocableFd.getRevocableFileDescriptor();
}
-
} catch (IOException e) {
IoUtils.closeQuietly(fd);
throw ExceptionUtils.wrap(e);