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"); + } }