Add a 2.5 MB size limit to the text file storing BMM Events.
Test: atest CtsBackupHostTestCases, GtsBackupHostTestCases
atest BackupManagerMonitorDumpsysUtilsTest, UserBackupManagerServiceTest
Bug: 297163567
Change-Id: Ia1fdc0b465b960337f5e5c626460e305d96f4eb2
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index 2d80af9..38af61b 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -486,6 +486,13 @@
File baseStateDir,
File dataDir,
TransportManager transportManager) {
+ // check if we are past the retention period for BMM Events,
+ // if so delete expired events and do not print them to dumpsys
+ BackupManagerMonitorDumpsysUtils backupManagerMonitorDumpsysUtils =
+ new BackupManagerMonitorDumpsysUtils();
+ if (backupManagerMonitorDumpsysUtils.deleteExpiredBMMEvents() && DEBUG){
+ Slog.d(TAG, "BMM Events recorded for dumpsys have expired");
+ }
return new UserBackupManagerService(
userId,
context,
@@ -4197,6 +4204,9 @@
// We have not recorded BMMEvents yet.
pw.println("NO BACKUP MANAGER MONITOR EVENTS");
return;
+ } else if (bm.isFileLargerThanSizeLimit(events)){
+ pw.println("BACKUP MANAGER MONITOR EVENTS FILE OVER SIZE LIMIT - "
+ + "future events will not be recorded");
}
pw.println("START OF BACKUP MANAGER MONITOR EVENTS");
try (BufferedReader reader = new BufferedReader(new FileReader(events))) {
diff --git a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java
index 16da846..4b0d5a4 100644
--- a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java
@@ -57,11 +57,17 @@
// Retention period of 60 days (in millisec) for the BMM Events.
// After tha time has passed the text file containing the BMM events will be emptied
private static final long LOGS_RETENTION_PERIOD_MILLISEC = 60 * TimeUnit.DAYS.toMillis(1);
+ // Size limit for the text file containing the BMM events
+ private static final long BMM_FILE_SIZE_LIMIT_BYTES = 25 * 1024 * 1000; // 2.5 MB
+
// We cache the value of IsAfterRetentionPeriod() to avoid unnecessary disk I/O
// mIsAfterRetentionPeriodCached tracks if we have cached the value of IsAfterRetentionPeriod()
private boolean mIsAfterRetentionPeriodCached = false;
- // The cahched value of IsAfterRetentionPeriod()
+ // The cached value of IsAfterRetentionPeriod()
private boolean mIsAfterRetentionPeriod;
+ // If isFileLargerThanSizeLimit(bmmEvents) returns true we cache the value to avoid
+ // unnecessary disk I/O
+ private boolean mIsFileLargerThanSizeLimit = false;
/**
* Parses the BackupManagerMonitor bundle for a RESTORE event in a series of strings that
@@ -116,6 +122,11 @@
recordSetUpTimestamp();
}
+ if(isFileLargerThanSizeLimit(bmmEvents)){
+ // Do not write more events if the file is over size limit
+ return;
+ }
+
try (FileOutputStream out = new FileOutputStream(bmmEvents, /*append*/ true);
PrintWriter pw = new FastPrintWriter(out);) {
@@ -192,6 +203,13 @@
return fname;
}
+ public boolean isFileLargerThanSizeLimit(File events){
+ if (!mIsFileLargerThanSizeLimit) {
+ mIsFileLargerThanSizeLimit = events.length() > getBMMEventsFileSizeLimit();
+ }
+ return mIsFileLargerThanSizeLimit;
+ }
+
private String timestamp() {
long currentTime = System.currentTimeMillis();
Date date = new Date(currentTime);
@@ -402,6 +420,11 @@
return LOGS_RETENTION_PERIOD_MILLISEC;
}
+ @VisibleForTesting
+ long getBMMEventsFileSizeLimit(){
+ return BMM_FILE_SIZE_LIMIT_BYTES;
+ }
+
/**
* Delete the BMM Events file after the retention period has passed.
*
diff --git a/services/tests/mockingservicestests/src/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtilsTest.java b/services/tests/mockingservicestests/src/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtilsTest.java
index a45b17e..dcd5317 100644
--- a/services/tests/mockingservicestests/src/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtilsTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtilsTest.java
@@ -26,11 +26,14 @@
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
+import java.io.FileWriter;
public class BackupManagerMonitorDumpsysUtilsTest {
private long mRetentionPeriod;
private File mTempBMMEventsFile;
private File mTempSetUpDateFile;
+
+ private long mSizeLimit;
private TestBackupManagerMonitorDumpsysUtils mBackupManagerMonitorDumpsysUtils;
@Rule
public TemporaryFolder tmp = new TemporaryFolder();
@@ -38,6 +41,7 @@
@Before
public void setUp() throws Exception {
mRetentionPeriod = 30 * 60 * 1000;
+ mSizeLimit = 25 * 1024 * 1000;
mTempBMMEventsFile = tmp.newFile("testbmmevents.txt");
mTempSetUpDateFile = tmp.newFile("testSetUpDate.txt");
mBackupManagerMonitorDumpsysUtils = new TestBackupManagerMonitorDumpsysUtils();
@@ -111,6 +115,33 @@
@Test
+ public void parseBackupManagerMonitorEventForDumpsys_fileOverSizeLimit_doNotRecordEvents()
+ throws Exception {
+ assertTrue(mTempBMMEventsFile.length() == 0);
+ Bundle event = createRestoreBMMEvent();
+ mBackupManagerMonitorDumpsysUtils.parseBackupManagerMonitorRestoreEventForDumpsys(event);
+ long fileSizeBefore = mTempBMMEventsFile.length();
+
+ mBackupManagerMonitorDumpsysUtils.setTestSizeLimit(0);
+ mBackupManagerMonitorDumpsysUtils.parseBackupManagerMonitorRestoreEventForDumpsys(event);
+ long fileSizeAfter = mTempBMMEventsFile.length();
+ assertTrue(mBackupManagerMonitorDumpsysUtils.isFileLargerThanSizeLimit(mTempBMMEventsFile));
+ assertTrue(fileSizeBefore == fileSizeAfter);
+ }
+
+ @Test
+ public void parseBackupManagerMonitorEventForDumpsys_fileUnderSizeLimit_recordEvents()
+ throws Exception {
+ assertTrue(mTempBMMEventsFile.length() == 0);
+ Bundle event = createRestoreBMMEvent();
+
+ mBackupManagerMonitorDumpsysUtils.setTestSizeLimit(25 * 1024 * 1000);
+ mBackupManagerMonitorDumpsysUtils.parseBackupManagerMonitorRestoreEventForDumpsys(event);
+ assertFalse(mBackupManagerMonitorDumpsysUtils.isFileLargerThanSizeLimit(mTempBMMEventsFile));
+ assertTrue(mTempBMMEventsFile.length() != 0);
+ }
+
+ @Test
public void deleteExpiredBackupManagerMonitorEvent_eventsAreExpired_deleteEventsAndReturnTrue()
throws Exception {
Bundle event = createRestoreBMMEvent();
@@ -238,15 +269,20 @@
extends BackupManagerMonitorDumpsysUtils {
private long testRetentionPeriod;
+ private long testSizeLimit;
TestBackupManagerMonitorDumpsysUtils() {
super();
this.testRetentionPeriod = mRetentionPeriod;
+ this.testSizeLimit = mSizeLimit;
}
public void setTestRetentionPeriod(long testRetentionPeriod) {
this.testRetentionPeriod = testRetentionPeriod;
}
+ public void setTestSizeLimit(long testSizeLimit) {
+ this.testSizeLimit = testSizeLimit;
+ }
@Override
public File getBMMEventsFile() {
@@ -263,5 +299,11 @@
return testRetentionPeriod;
}
+ @Override
+ long getBMMEventsFileSizeLimit(){
+ return testSizeLimit;
+ }
+
+
}
}