From 6ab8172b6938c48864f4e9beef6a313d785824fe 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 --- .../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 a9eceb80ccdecf9d228249a6e077a4c761f3b859 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 --- .../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;