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
This commit is contained in:
Motomu Utsumi
2022-07-28 05:58:41 +00:00
parent 7013b92a22
commit b8dd98e4d1
4 changed files with 41 additions and 21 deletions

View File

@@ -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();

View File

@@ -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<uint32_t, StatsValue>&) {
dw.println("%u %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64, key, value.rxBytes,
value.rxPackets, value.txBytes, value.txPackets);
return base::Result<void>();
};
base::Result<void> 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<void>();
};
res = mStatsMapA.iterateWithValue(printStatsInfo);
base::Result<void> res = mStatsMapA.iterateWithValue(printStatsInfo);
if (!res.ok()) {
dw.println("mStatsMapA print end with error: %s", res.error().message().c_str());
}

View File

@@ -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<std::string> 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<std::string> expectedLines = {
fmt::format("mAppUidStatsMap {}", kErrIterate),
fmt::format("mStatsMapA {}", kErrIterate),
fmt::format("mStatsMapB {}", kErrIterate),
fmt::format("mIfaceIndexNameMap {}", kErrIterate),

View File

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