From 27662f0cc3611be9c91a1bd45f61cad36205d11c Mon Sep 17 00:00:00 2001 From: Paul Hu Date: Thu, 16 Nov 2023 10:20:47 +0800 Subject: [PATCH] Fix the memory leak in nsd tests The NsdManager constructor creates a new thread, which is not intended to be closed. However, the test in NsdMangerTest and NsdServiceTest create a new NsdManager instance, resulting in a large number of threads running during the tests. This can lead to an out-of-memory error for the tests. To resolve this issue, use the common singleton thread ConnectivityThread to handle tasks from the various instances. Fix: 308544734 Test: atest ConnectivityCoverageTests --test-filter Nsd* Change-Id: I1908a2bb1bd20da8e0498353bca26f7e89e16626 --- framework-t/src/android/net/nsd/NsdManager.java | 9 ++++----- tests/unit/java/android/net/nsd/NsdManagerTest.java | 1 + tests/unit/java/com/android/server/NsdServiceTest.java | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/framework-t/src/android/net/nsd/NsdManager.java b/framework-t/src/android/net/nsd/NsdManager.java index ef0e34bfe7..dae891402a 100644 --- a/framework-t/src/android/net/nsd/NsdManager.java +++ b/framework-t/src/android/net/nsd/NsdManager.java @@ -34,10 +34,10 @@ import android.app.compat.CompatChanges; import android.content.Context; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; +import android.net.ConnectivityThread; import android.net.Network; import android.net.NetworkRequest; import android.os.Handler; -import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.RemoteException; @@ -632,10 +632,9 @@ public final class NsdManager { */ public NsdManager(Context context, INsdManager service) { mContext = context; - - HandlerThread t = new HandlerThread("NsdManager"); - t.start(); - mHandler = new ServiceHandler(t.getLooper()); + // Use a common singleton thread ConnectivityThread to be shared among all nsd tasks. + // Instead of launching separate threads to handle tasks from the various instances. + mHandler = new ServiceHandler(ConnectivityThread.getInstanceLooper()); try { mService = service.connect(new NsdCallbackImpl(mHandler), CompatChanges.isChangeEnabled( diff --git a/tests/unit/java/android/net/nsd/NsdManagerTest.java b/tests/unit/java/android/net/nsd/NsdManagerTest.java index 0965193c31..550a9ee26b 100644 --- a/tests/unit/java/android/net/nsd/NsdManagerTest.java +++ b/tests/unit/java/android/net/nsd/NsdManagerTest.java @@ -51,6 +51,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +@DevSdkIgnoreRunner.MonitorThreadLeak @RunWith(DevSdkIgnoreRunner.class) @SmallTest @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2) diff --git a/tests/unit/java/com/android/server/NsdServiceTest.java b/tests/unit/java/com/android/server/NsdServiceTest.java index 771edb27a0..ffc8aa1d46 100644 --- a/tests/unit/java/com/android/server/NsdServiceTest.java +++ b/tests/unit/java/com/android/server/NsdServiceTest.java @@ -145,6 +145,7 @@ import java.util.Queue; // TODOs: // - test client can send requests and receive replies // - test NSD_ON ENABLE/DISABLED listening +@DevSdkIgnoreRunner.MonitorThreadLeak @RunWith(DevSdkIgnoreRunner.class) @SmallTest @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2)