From 375d780c8eecceafc76544052a830ca8ad691a70 Mon Sep 17 00:00:00 2001 From: Ken Chen Date: Thu, 18 Jan 2024 13:41:40 +0800 Subject: [PATCH] Add SkDestroyListener log in dumpsys netstats When sockets are destroyed, the SkDestroyListener receives a NETLINK_INET_DIAG message informing it to delete the socket cookie from the BPF CookieTagMap. However, under unknown conditions, all 10,000 spaces on the map were still observed to be filled. SkDestroyListener and its parent classes, NetlinkMonitor, and FdEventsReader will log errors. But due to the time required to fill the 10,000 fields is long, traces in the device log are likely to have been overwritten and cannot be observed. This commit enables dumpsys netstats to print the last 20 traces of the SkDestroyListener. If the issue is caused by the SkDestroyListener, this will help in obtaining further clues when the issue is reported again. Bug: 306919485 Bug: 319348954 Test: atest FrameworksNetTests:android.net.connectivity.com.android.serv er.net.NetworkStatsServiceTest#testDumpSkDestroyListenerLogs Test: manually add mLog.e(...) in SkDestroyListener#processNetlinkMessage and check dumpsys netstats Change-Id: I5bbfe07e05cf959f809f28a7633ee5f99e29f641 --- .../android/server/net/NetworkStatsService.java | 11 ++++++++++- .../com/android/server/net/SkDestroyListener.java | 9 +++++++++ .../server/net/NetworkStatsServiceTest.java | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/service-t/src/com/android/server/net/NetworkStatsService.java b/service-t/src/com/android/server/net/NetworkStatsService.java index eb754616a6..95a477c2d9 100644 --- a/service-t/src/com/android/server/net/NetworkStatsService.java +++ b/service-t/src/com/android/server/net/NetworkStatsService.java @@ -481,6 +481,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub { @Nullable private final SkDestroyListener mSkDestroyListener; + private static final int MAX_SOCKET_DESTROY_LISTENER_LOGS = 20; + private static @NonNull Clock getDefaultClock() { return new BestClock(ZoneOffset.UTC, SystemClock.currentNetworkTimeClock(), Clock.systemUTC()); @@ -880,7 +882,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub { /** Create a new SkDestroyListener. */ public SkDestroyListener makeSkDestroyListener( IBpfMap cookieTagMap, Handler handler) { - return new SkDestroyListener(cookieTagMap, handler, new SharedLog(TAG)); + return new SkDestroyListener( + cookieTagMap, handler, new SharedLog(MAX_SOCKET_DESTROY_LISTENER_LOGS, TAG)); } /** @@ -2909,6 +2912,12 @@ public class NetworkStatsService extends INetworkStatsService.Stub { dumpStatsMapLocked(mStatsMapB, pw, "mStatsMapB"); dumpIfaceStatsMapLocked(pw); pw.decreaseIndent(); + + pw.println(); + pw.println("SkDestroyListener logs:"); + pw.increaseIndent(); + mSkDestroyListener.dump(pw); + pw.decreaseIndent(); } } diff --git a/service-t/src/com/android/server/net/SkDestroyListener.java b/service-t/src/com/android/server/net/SkDestroyListener.java index 7b68f8989a..a6cc2b58f6 100644 --- a/service-t/src/com/android/server/net/SkDestroyListener.java +++ b/service-t/src/com/android/server/net/SkDestroyListener.java @@ -30,6 +30,8 @@ import com.android.net.module.util.netlink.InetDiagMessage; import com.android.net.module.util.netlink.NetlinkMessage; import com.android.net.module.util.netlink.StructInetDiagSockId; +import java.io.PrintWriter; + /** * Monitor socket destroy and delete entry from cookie tag bpf map. */ @@ -72,4 +74,11 @@ public class SkDestroyListener extends NetlinkMonitor { mLog.e("Failed to delete CookieTagMap entry for " + sockId.cookie + ": " + e); } } + + /** + * Dump the contents of SkDestroyListener log. + */ + public void dump(PrintWriter pw) { + mLog.reverseDump(pw); + } } diff --git a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java index 1ee3f9dede..a5fee5b80c 100644 --- a/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/unit/java/com/android/server/net/NetworkStatsServiceTest.java @@ -85,6 +85,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -130,6 +131,7 @@ import android.system.ErrnoException; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArrayMap; +import android.util.IndentingPrintWriter; import android.util.Pair; import androidx.annotation.Nullable; @@ -2802,4 +2804,16 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { final String dump = getDump(); assertDumpContains(dump, pollReasonNameOf(POLL_REASON_RAT_CHANGED)); } + + @Test + public void testDumpSkDestroyListenerLogs() throws ErrnoException { + doAnswer((invocation) -> { + final IndentingPrintWriter ipw = (IndentingPrintWriter) invocation.getArgument(0); + ipw.println("Log for testing"); + return null; + }).when(mSkDestroyListener).dump(any()); + + final String dump = getDump(); + assertDumpContains(dump, "Log for testing"); + } }