Make usage of revocable fds for reads configurable.

Bug: 159374701
Test: atest --test-mapping apex/blobstore
Change-Id: If449197938fe457726bb5ec18663cfd7a500eb93
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 7e8c906..3153278 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 @@
             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 08ee244..d780d5d 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 @@
         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 @@
                         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 @@
             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 @@
                 < 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 77ca4aa..28f7e75 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 @@
                 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 @@
                 trackRevocableFdLocked(revocableFd);
                 return revocableFd.getRevocableFileDescriptor();
             }
-
         } catch (IOException e) {
             IoUtils.closeQuietly(fd);
             throw ExceptionUtils.wrap(e);