diff --git a/service-t/src/com/android/server/net/NetworkStatsService.java b/service-t/src/com/android/server/net/NetworkStatsService.java index 7cf62937d6..a36149ef81 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()); @@ -881,7 +883,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)); } /** @@ -2912,6 +2915,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"); + } }