Ensure PacketHandler is removed from sockets
When MdnsMultinetworkSocketClient stops using a socket (when
isSocketActive starts returning false), the packet handler should be
removed from that socket. The code only removed it from the
mSocketPacketHandlers map without clearing it from the socket.
This caused packets to be handled potentially many times, affecting
performance.
Bug: 406623719
Bug: 408324621
Test: atest
Flag: EXEMPT bugfix
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:b5fbc0143af3409c5c8c660c3ecb34d4e964efdb)
Merged-In: I3d1117a4b847f3b95a01fc8a5997a53655ef608a
Change-Id: I3d1117a4b847f3b95a01fc8a5997a53655ef608a
diff --git a/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java b/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java
index 36fad31..4c760d6 100644
--- a/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java
+++ b/service-t/src/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClient.java
@@ -101,7 +101,7 @@
@NonNull MdnsInterfaceSocket socket) {
mActiveSockets.remove(socketKey);
mSocketCreationCallback.onSocketDestroyed(socketKey);
- maybeCleanupPacketHandler(socketKey);
+ maybeCleanupPacketHandler(socketKey, socket);
}
private void notifySocketDestroyed(@NonNull SocketKey socketKey) {
@@ -115,8 +115,9 @@
for (int i = mActiveSockets.size() - 1; i >= 0; i--) {
// Iterate from the end so the socket can be removed
final SocketKey socketKey = mActiveSockets.keyAt(i);
+ final MdnsInterfaceSocket socket = mActiveSockets.valueAt(i);
notifySocketDestroyed(socketKey);
- maybeCleanupPacketHandler(socketKey);
+ maybeCleanupPacketHandler(socketKey, socket);
}
}
}
@@ -143,9 +144,13 @@
return null;
}
- private void maybeCleanupPacketHandler(@NonNull SocketKey socketKey) {
+ private void maybeCleanupPacketHandler(@NonNull SocketKey socketKey,
+ @NonNull MdnsInterfaceSocket socket) {
if (isSocketActive(socketKey)) return;
- mSocketPacketHandlers.remove(socketKey);
+ final ReadPacketHandler handler = mSocketPacketHandlers.remove(socketKey);
+ if (handler != null) {
+ socket.removePacketHandler(handler);
+ }
}
private class ReadPacketHandler implements MulticastPacketReader.PacketHandler {
diff --git a/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java b/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java
index 4c71991..e115d5a8 100644
--- a/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java
+++ b/tests/unit/java/com/android/server/connectivity/mdns/MdnsMultinetworkSocketClientTest.java
@@ -357,6 +357,8 @@
verify(mProvider).unrequestSocket(callback);
verify(mSocketCreationCallback).onSocketDestroyed(mSocketKey);
verify(mSocketCreationCallback).onSocketDestroyed(otherSocketKey);
+ verify(mSocket).removePacketHandler(any());
+ verify(otherSocket).removePacketHandler(any());
}
@Test
@@ -375,8 +377,10 @@
// Notify socket destroyed
callback.onInterfaceDestroyed(mSocketKey, mSocket);
verify(mSocketCreationCallback).onSocketDestroyed(mSocketKey);
+ verify(mSocket).removePacketHandler(any());
callback.onInterfaceDestroyed(otherSocketKey, otherSocket);
verify(mSocketCreationCallback).onSocketDestroyed(otherSocketKey);
+ verify(otherSocket).removePacketHandler(any());
}
@Test
@@ -413,6 +417,7 @@
verify(creationCallback2).onSocketDestroyed(mSocketKey);
verify(creationCallback3).onSocketDestroyed(mSocketKey);
verify(creationCallback3, never()).onSocketDestroyed(socketKey2);
+ verify(mSocket).removePacketHandler(any());
}
@Test