From 807a7f37f096514ea5ed7cf0620f5e081e7ae424 Mon Sep 17 00:00:00 2001 From: junyulai Date: Wed, 13 Apr 2022 16:04:19 +0800 Subject: [PATCH 1/2] [MS82.2] Add a rewriteSingle method that takes two timestamps This CL provides a public method in FileRotator to allow caller to write data to a specified standalone file. This CL also fix a file name generatign error in platform tools. Test: NetworkStatsServiceTest NetworkStatsCollectionTest Bug: 230289468 Change-Id: I17558f349cb2a33062972fe1af96a19356798692 Merged-In: I17558f349cb2a33062972fe1af96a19356798692 (pure cherry-picked from ag/18408306) --- .../netstats/NetworkStatsDataMigrationUtils.java | 2 +- .../com/android/internal/util/FileRotator.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core/java/android/net/netstats/NetworkStatsDataMigrationUtils.java b/core/java/android/net/netstats/NetworkStatsDataMigrationUtils.java index 5c9989e9d981c..de2f10b86a77a 100644 --- a/core/java/android/net/netstats/NetworkStatsDataMigrationUtils.java +++ b/core/java/android/net/netstats/NetworkStatsDataMigrationUtils.java @@ -161,7 +161,7 @@ public class NetworkStatsDataMigrationUtils { @NonNull private static ArrayList getPlatformFileListForPrefix(@NonNull @Prefix String prefix) { final ArrayList list = new ArrayList<>(); - final File platformFiles = new File(getPlatformBaseDir(), "netstats"); + final File platformFiles = getPlatformBaseDir(); if (platformFiles.exists()) { for (String name : platformFiles.list()) { // Skip when prefix doesn't match. diff --git a/core/java/com/android/internal/util/FileRotator.java b/core/java/com/android/internal/util/FileRotator.java index 4b3af15361750..5bc48c5172f0d 100644 --- a/core/java/com/android/internal/util/FileRotator.java +++ b/core/java/com/android/internal/util/FileRotator.java @@ -16,6 +16,7 @@ package com.android.internal.util; +import android.annotation.NonNull; import android.os.FileUtils; import android.util.Log; @@ -281,6 +282,20 @@ public class FileRotator { } } + /** + * Process a single file atomically, with the given start and end timestamps. + * If a file with these exact start and end timestamps does not exist, a new + * empty file will be written. + */ + public void rewriteSingle(@NonNull Rewriter rewriter, long startTimeMillis, long endTimeMillis) + throws IOException { + final FileInfo info = new FileInfo(mPrefix); + + info.startMillis = startTimeMillis; + info.endMillis = endTimeMillis; + rewriteSingle(rewriter, info.build()); + } + /** * Read any rotated data that overlap the requested time range. */ From ad2be9ef85f76a882153988be392205a2e5b5e33 Mon Sep 17 00:00:00 2001 From: Junyu Lai Date: Thu, 19 May 2022 01:35:11 +0800 Subject: [PATCH 2/2] Add null check when list directory This change protect getPlatformFileListForPrefix from crashing when the directory exist but cannot be listed. This generally happens when the caller doesn't have enough permission to list. Test: atest CtsNetTestCases:android.net.cts.NetworkStatsManagerTest#testDataMigrationUtils Ignore-AOSP-First: in a topic with internal-only changes Bug: 230289468 Change-Id: I4177a8229cc9db18d76cb90c54a1b8d12ef8d98f Merged-In: I4177a8229cc9db18d76cb90c54a1b8d12ef8d98f (pure cherry-picked from ag/18457684) --- .../net/netstats/NetworkStatsDataMigrationUtils.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/java/android/net/netstats/NetworkStatsDataMigrationUtils.java b/core/java/android/net/netstats/NetworkStatsDataMigrationUtils.java index de2f10b86a77a..76ee097c8c935 100644 --- a/core/java/android/net/netstats/NetworkStatsDataMigrationUtils.java +++ b/core/java/android/net/netstats/NetworkStatsDataMigrationUtils.java @@ -52,6 +52,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.net.ProtocolException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Set; @@ -163,7 +164,10 @@ public class NetworkStatsDataMigrationUtils { final ArrayList list = new ArrayList<>(); final File platformFiles = getPlatformBaseDir(); if (platformFiles.exists()) { - for (String name : platformFiles.list()) { + final String[] files = platformFiles.list(); + if (files == null) return list; + Arrays.sort(files); + for (String name : files) { // Skip when prefix doesn't match. if (!name.startsWith(prefix + ".")) continue;