From b8dd98e4d19d2f7c4a904a2564c95016bf9d251c Mon Sep 17 00:00:00 2001 From: Motomu Utsumi Date: Thu, 28 Jul 2022 05:58:41 +0000 Subject: [PATCH] Move app uid stats map dump to NetworkStatsService Map status dump will do access check if map is null. This could show different message from the current dump output. Information in map content dump does not change $ dumpsys connectivity trafficcontroller .... mAppUidStatsMap:: uid rxBytes rxPackets txBytes txPackets 0 135 1 3602 47 1001 2414 8 385 6 1021 76 1 76 1 1000 290 2 260 3 .... $ dumpsys netstats .... mAppUidStatsMap: uid rxBytes rxPackets txBytes txPackets 0 135 1 3602 47 1001 2414 8 385 6 1021 76 1 76 1 1000 290 2 260 3 .... Bug: 217624062 Test: dumpsys netstats, dumpstate, atest NetworkStatsServiceTest Change-Id: I71988117c6dc3033f710b26a15d15879b35d50a4 --- .../server/net/NetworkStatsService.java | 30 +++++++++++++++++++ service/native/TrafficController.cpp | 18 +---------- service/native/TrafficControllerTest.cpp | 4 --- .../server/net/NetworkStatsServiceTest.java | 10 +++++++ 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/service-t/src/com/android/server/net/NetworkStatsService.java b/service-t/src/com/android/server/net/NetworkStatsService.java index 8cf4f287df..a95aa850e8 100644 --- a/service-t/src/com/android/server/net/NetworkStatsService.java +++ b/service-t/src/com/android/server/net/NetworkStatsService.java @@ -2716,6 +2716,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { pw.increaseIndent(); dumpCookieTagMapLocked(pw); dumpUidCounterSetMapLocked(pw); + dumpAppUidStatsMapLocked(pw); pw.decreaseIndent(); } } @@ -2768,6 +2769,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { pw.println("mCookieTagMap: " + getMapStatus(mCookieTagMap, COOKIE_TAG_MAP_PATH)); pw.println("mUidCounterSetMap: " + getMapStatus(mUidCounterSetMap, UID_COUNTERSET_MAP_PATH)); + pw.println("mAppUidStatsMap: " + getMapStatus(mAppUidStatsMap, APP_UID_STATS_MAP_PATH)); } @GuardedBy("mStatsLock") @@ -2818,6 +2820,34 @@ public class NetworkStatsService extends INetworkStatsService.Stub { pw.decreaseIndent(); } + @GuardedBy("mStatsLock") + private void dumpAppUidStatsMapLocked(final IndentingPrintWriter pw) { + if (mAppUidStatsMap == null) { + return; + } + pw.println("mAppUidStatsMap:"); + pw.increaseIndent(); + pw.println("uid rxBytes rxPackets txBytes txPackets"); + try { + mAppUidStatsMap.forEach((key, value) -> { + // value could be null if there is a concurrent entry deletion. + // http://b/220084230. + if (value != null) { + pw.println(key.uid + " " + + value.rxBytes + " " + + value.rxPackets + " " + + value.txBytes + " " + + value.txPackets); + } else { + pw.println("Entry is deleted while dumping, iterating from first entry"); + } + }); + } catch (ErrnoException e) { + pw.println("mAppUidStatsMap dump end with error: " + Os.strerror(e.errno)); + } + pw.decreaseIndent(); + } + private NetworkStats readNetworkStatsSummaryDev() { try { return mStatsFactory.readNetworkStatsSummaryDev(); diff --git a/service/native/TrafficController.cpp b/service/native/TrafficController.cpp index 858c27073b..8f8c7879da 100644 --- a/service/native/TrafficController.cpp +++ b/service/native/TrafficController.cpp @@ -570,8 +570,6 @@ void TrafficController::dump(int fd, bool verbose) { ScopedIndent indentPreBpfModule(dw); dw.blankline(); - dw.println("mAppUidStatsMap status: %s", - getMapStatus(mAppUidStatsMap.getMap(), APP_UID_STATS_MAP_PATH).c_str()); dw.println("mStatsMapA status: %s", getMapStatus(mStatsMapA.getMap(), STATS_MAP_A_PATH).c_str()); dw.println("mStatsMapB status: %s", @@ -607,20 +605,6 @@ void TrafficController::dump(int fd, bool verbose) { ScopedIndent indentForMapContent(dw); - // Print AppUidStatsMap content. - std::string appUidStatsHeader = StringPrintf("uid rxBytes rxPackets txBytes txPackets"); - dumpBpfMap("mAppUidStatsMap:", dw, appUidStatsHeader); - auto printAppUidStatsInfo = [&dw](const uint32_t& key, const StatsValue& value, - const BpfMap&) { - dw.println("%u %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, key, value.rxBytes, - value.rxPackets, value.txBytes, value.txPackets); - return base::Result(); - }; - base::Result res = mAppUidStatsMap.iterateWithValue(printAppUidStatsInfo); - if (!res.ok()) { - dw.println("mAppUidStatsMap print end with error: %s", res.error().message().c_str()); - } - // Print uidStatsMap content. std::string statsHeader = StringPrintf("ifaceIndex ifaceName tag_hex uid_int cnt_set rxBytes" " rxPackets txBytes txPackets"); @@ -637,7 +621,7 @@ void TrafficController::dump(int fd, bool verbose) { value.rxPackets, value.txBytes, value.txPackets); return base::Result(); }; - res = mStatsMapA.iterateWithValue(printStatsInfo); + base::Result res = mStatsMapA.iterateWithValue(printStatsInfo); if (!res.ok()) { dw.println("mStatsMapA print end with error: %s", res.error().message().c_str()); } diff --git a/service/native/TrafficControllerTest.cpp b/service/native/TrafficControllerTest.cpp index 0c14b9b08e..256a2a0ec4 100644 --- a/service/native/TrafficControllerTest.cpp +++ b/service/native/TrafficControllerTest.cpp @@ -791,9 +791,6 @@ TEST_F(TrafficControllerTest, TestDumpsys) { // ifaceIndex ifaceName tag_hex uid_int cnt_set rxBytes rxPackets txBytes txPackets // 999 test0 0x2a 10086 1 100 1 0 0 std::vector expectedLines = { - "mAppUidStatsMap::", // TODO@: fix double colon - "uid rxBytes rxPackets txBytes txPackets", - fmt::format("{} {} {} {} {}", TEST_UID, RXBYTES, RXPACKETS, TXBYTES, TXPACKETS), "mStatsMapA", "ifaceIndex ifaceName tag_hex uid_int cnt_set rxBytes rxPackets txBytes txPackets", fmt::format("{} {} {:#x} {} {} {} {} {} {}", @@ -829,7 +826,6 @@ TEST_F(TrafficControllerTest, dumpsysInvalidMaps) { "Read value of map -1 failed: Bad file descriptor"; std::vector expectedLines = { - fmt::format("mAppUidStatsMap {}", kErrIterate), fmt::format("mStatsMapA {}", kErrIterate), fmt::format("mStatsMapB {}", kErrIterate), fmt::format("mIfaceIndexNameMap {}", kErrIterate), diff --git a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java index 7b4bba392a..18e074c019 100644 --- a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java @@ -2352,4 +2352,14 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { assertDumpContains(dump, "mUidCounterSetMap: OK"); assertDumpContains(dump, "uid=1002 set=1"); } + + @Test + public void testAppUidStatsMap() throws ErrnoException { + initBpfMapsWithTagData(UID_BLUE); + + final String dump = getDump(); + assertDumpContains(dump, "mAppUidStatsMap: OK"); + assertDumpContains(dump, "uid rxBytes rxPackets txBytes txPackets"); + assertDumpContains(dump, "1002 10000 10 6000 6"); + } }