Set buffer size to match Linux pipe internal buffer when reading/writing from/to pipes in Backup/Restore flow.
ag/21072118 used of feature flags to control buffer sizes, which are now deprecated. Those flags were also never used.
This change makes use of trunk-stable frozen flags to set the buffer size to match Linux pipe internal buffer when reading/writing from/to pipes in Backup/Restore flow.
See 'Pipe capacity' section in https://man7.org/linux/man-pages/man7/pipe.7.html
Bug: 265976737
Test: Ensure that the change builds (m -j frameworks/base)
Ensure CTS and GTS B&R tests pass
Change-Id: I8bb96e2e273b0c7eb4809af985fe322e49bb0268
diff --git a/services/backup/flags.aconfig b/services/backup/flags.aconfig
index d695d36..549fa36 100644
--- a/services/backup/flags.aconfig
+++ b/services/backup/flags.aconfig
@@ -7,4 +7,12 @@
"restore for apps that have been launched."
bug: "308401499"
is_fixed_read_only: true
+}
+
+flag {
+ name: "enable_max_size_writes_to_pipes"
+ namespace: "onboarding"
+ description: "Enables the write buffer to pipes to be of maximum size."
+ bug: "265976737"
+ is_fixed_read_only: true
}
\ No newline at end of file
diff --git a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
index 6aed9aa..cca166b 100644
--- a/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
+++ b/services/backup/java/com/android/server/backup/fullbackup/PerformFullTransportBackupTask.java
@@ -40,8 +40,8 @@
import com.android.server.EventLogTags;
import com.android.server.backup.BackupAgentTimeoutParameters;
-import com.android.server.backup.BackupAndRestoreFeatureFlags;
import com.android.server.backup.BackupRestoreTask;
+import com.android.server.backup.Flags;
import com.android.server.backup.FullBackupJob;
import com.android.server.backup.OperationStorage;
import com.android.server.backup.OperationStorage.OpState;
@@ -390,8 +390,11 @@
// Set up to send data to the transport
final int N = mPackages.size();
- final int chunkSizeInBytes =
- BackupAndRestoreFeatureFlags.getFullBackupWriteToTransportBufferSizeBytes();
+ int chunkSizeInBytes = 8 * 1024; // 8KB
+ if (Flags.enableMaxSizeWritesToPipes()) {
+ // Linux pipe capacity (buffer size) is 16 pages where each page is 4KB
+ chunkSizeInBytes = 64 * 1024; // 64KB
+ }
final byte[] buffer = new byte[chunkSizeInBytes];
for (int i = 0; i < N; i++) {
mBackupRunner = null;
diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
index ff72476..2c9eb51 100644
--- a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java
@@ -29,7 +29,6 @@
import android.app.IBackupAgent;
import android.app.backup.BackupAgent;
import android.app.backup.BackupAnnotations;
-import android.app.backup.BackupManager;
import android.app.backup.FullBackup;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IFullBackupRestoreObserver;
@@ -51,6 +50,7 @@
import com.android.server.backup.BackupAgentTimeoutParameters;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.FileMetadata;
+import com.android.server.backup.Flags;
import com.android.server.backup.KeyValueAdbRestoreEngine;
import com.android.server.backup.OperationStorage;
import com.android.server.backup.OperationStorage.OpType;
@@ -157,13 +157,19 @@
mMonitor = monitor;
mOnlyPackage = onlyPackage;
mAllowApks = allowApks;
- mBuffer = new byte[32 * 1024];
mAgentTimeoutParameters = Objects.requireNonNull(
backupManagerService.getAgentTimeoutParameters(),
"Timeout parameters cannot be null");
mIsAdbRestore = isAdbRestore;
mUserId = backupManagerService.getUserId();
mBackupEligibilityRules = backupEligibilityRules;
+
+ if (Flags.enableMaxSizeWritesToPipes()) {
+ // Linux pipe capacity (buffer size) is 16 pages where each page is 4KB
+ mBuffer = new byte[64 * 1024]; // 64KB
+ } else {
+ mBuffer = new byte[32 * 1024];
+ }
}
@VisibleForTesting
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index 316a16d..2fbc3cd 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -968,7 +968,12 @@
throws Exception {
Set<String> excludedKeysForPackage = getExcludedKeysForPackage(packageName);
- byte[] buffer = new byte[8192]; // will grow when needed
+ int bufferSize = 8192; // 8KB
+ if (Flags.enableMaxSizeWritesToPipes()) {
+ // Linux pipe capacity (buffer size) is 16 pages where each page is 4KB
+ bufferSize = 64 * 1024; // 64KB
+ }
+ byte[] buffer = new byte[bufferSize]; // will grow when needed
while (in.readNextHeader()) {
final String key = in.getKey();
final int size = in.getDataSize();
@@ -1116,7 +1121,11 @@
ParcelFileDescriptor tReadEnd = mTransportPipes[0];
ParcelFileDescriptor tWriteEnd = mTransportPipes[1];
- int bufferSize = 32 * 1024;
+ int bufferSize = 32 * 1024; // 32KB
+ if (Flags.enableMaxSizeWritesToPipes()) {
+ // Linux pipe capacity (buffer size) is 16 pages where each page is 4KB
+ bufferSize = 64 * 1024; // 64KB
+ }
byte[] buffer = new byte[bufferSize];
FileOutputStream engineOut = new FileOutputStream(eWriteEnd.getFileDescriptor());
FileInputStream transportIn = new FileInputStream(tReadEnd.getFileDescriptor());
diff --git a/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java b/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java
index 1c0cd87..843354e 100644
--- a/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java
@@ -21,7 +21,7 @@
import android.os.ParcelFileDescriptor;
import android.util.Slog;
-import com.android.server.backup.BackupAndRestoreFeatureFlags;
+import com.android.server.backup.Flags;
import java.io.DataInputStream;
import java.io.EOFException;
@@ -46,8 +46,11 @@
// We do not take close() responsibility for the pipe FD
FileInputStream raw = new FileInputStream(inPipe.getFileDescriptor());
DataInputStream in = new DataInputStream(raw);
- final int chunkSizeInBytes =
- BackupAndRestoreFeatureFlags.getFullBackupUtilsRouteBufferSizeBytes();
+ int chunkSizeInBytes = 32 * 1024; // 32KB
+ if (Flags.enableMaxSizeWritesToPipes()) {
+ // Linux pipe capacity (buffer size) is 16 pages where each page is 4KB
+ chunkSizeInBytes = 64 * 1024; // 64KB
+ }
byte[] buffer = new byte[chunkSizeInBytes];
int chunkTotal;
while ((chunkTotal = in.readInt()) > 0) {
diff --git a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
index 0accb9f..5a8533a 100644
--- a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java
@@ -40,6 +40,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.server.LocalServices;
import com.android.server.backup.FileMetadata;
+import com.android.server.backup.Flags;
import com.android.server.backup.restore.RestoreDeleteObserver;
import com.android.server.backup.restore.RestorePolicy;
@@ -93,7 +94,12 @@
try (Session session = installer.openSession(sessionId)) {
try (OutputStream apkStream = session.openWrite(info.packageName, 0,
info.size)) {
- byte[] buffer = new byte[32 * 1024];
+ int bufferSize = 32 * 1024; // 32KB
+ if (Flags.enableMaxSizeWritesToPipes()) {
+ // Linux pipe capacity (buffer size) is 16 pages where each page is 4KB
+ bufferSize = 64 * 1024; // 64KB
+ }
+ byte[] buffer = new byte[bufferSize];
long size = info.size;
while (size > 0) {
long toRead = (buffer.length < size) ? buffer.length : size;