From a10db39e59274a2abaa7e5b47d248069c2c853cf Mon Sep 17 00:00:00 2001 From: Piyush Mehrotra Date: Tue, 9 Jan 2024 20:15:16 +0000 Subject: 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 --- .../backup/fullbackup/PerformFullTransportBackupTask.java | 9 ++++++--- .../android/server/backup/restore/FullRestoreEngine.java | 10 ++++++++-- .../server/backup/restore/PerformUnifiedRestoreTask.java | 13 +++++++++++-- .../com/android/server/backup/utils/FullBackupUtils.java | 9 ++++++--- .../java/com/android/server/backup/utils/RestoreUtils.java | 8 +++++++- 5 files changed, 38 insertions(+), 11 deletions(-) (limited to 'services/backup/java') 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 6aed9aa15860..cca166b0939c 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 android.util.Slog; 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 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba // 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 ff72476d4bf1..2c9eb51972af 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.ApplicationThreadConstants; 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.LocalServices; 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 @@ public class FullRestoreEngine extends RestoreEngine { 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 316a16d9934c..2fbc3cd24d65 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 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { throws Exception { Set 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 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { 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 1c0cd87cec6f..843354e719bb 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 static com.android.server.backup.BackupManagerService.TAG; 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 @@ public class FullBackupUtils { // 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 0accb9fadd04..5a8533a2daee 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 android.util.Slog; 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 @@ public class RestoreUtils { 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; -- cgit v1.2.3-59-g8ed1b