Revert "Revert "Record DiscoveryManager history logs for better ..."

Revert submission 2542434-revert-2535219-TAMNEZLAHT

Reason for revert: Prepare a fix for the original topic

Reverted changes: /q/submissionid:2542434-revert-2535219-TAMNEZLAHT

Change-Id: I718418e4499784255b177622e3c08a82d0b24640
This commit is contained in:
Paul Hu
2023-04-18 05:50:14 +00:00
parent c4732276d4
commit 24913d0e80
3 changed files with 45 additions and 25 deletions

View File

@@ -23,16 +23,16 @@ import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.RequiresPermission; import android.annotation.RequiresPermission;
import android.net.Network; import android.net.Network;
import android.text.TextUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.server.connectivity.mdns.util.MdnsLogger; import com.android.net.module.util.SharedLog;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -43,7 +43,7 @@ import java.util.List;
public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback { public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
private static final String TAG = MdnsDiscoveryManager.class.getSimpleName(); private static final String TAG = MdnsDiscoveryManager.class.getSimpleName();
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG); public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
private static final MdnsLogger LOGGER = new MdnsLogger("MdnsDiscoveryManager"); private static final SharedLog LOGGER = new SharedLog(TAG);
private final ExecutorProvider executorProvider; private final ExecutorProvider executorProvider;
private final MdnsSocketClientBase socketClient; private final MdnsSocketClientBase socketClient;
@@ -120,9 +120,7 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
@NonNull String serviceType, @NonNull String serviceType,
@NonNull MdnsServiceBrowserListener listener, @NonNull MdnsServiceBrowserListener listener,
@NonNull MdnsSearchOptions searchOptions) { @NonNull MdnsSearchOptions searchOptions) {
LOGGER.log( LOGGER.i("Registering listener for serviceType: " + serviceType);
"Registering listener for subtypes: %s",
TextUtils.join(",", searchOptions.getSubtypes()));
if (perNetworkServiceTypeClients.isEmpty()) { if (perNetworkServiceTypeClients.isEmpty()) {
// First listener. Starts the socket client. // First listener. Starts the socket client.
try { try {
@@ -157,8 +155,7 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
@RequiresPermission(permission.CHANGE_WIFI_MULTICAST_STATE) @RequiresPermission(permission.CHANGE_WIFI_MULTICAST_STATE)
public synchronized void unregisterListener( public synchronized void unregisterListener(
@NonNull String serviceType, @NonNull MdnsServiceBrowserListener listener) { @NonNull String serviceType, @NonNull MdnsServiceBrowserListener listener) {
LOGGER.log("Unregistering listener for service type: %s", serviceType); LOGGER.i("Unregistering listener for serviceType:" + serviceType);
if (DBG) Log.d(TAG, "Unregistering listener for serviceType:" + serviceType);
final List<MdnsServiceTypeClient> serviceTypeClients = final List<MdnsServiceTypeClient> serviceTypeClients =
perNetworkServiceTypeClients.getByServiceType(serviceType); perNetworkServiceTypeClients.getByServiceType(serviceType);
if (serviceTypeClients.isEmpty()) { if (serviceTypeClients.isEmpty()) {
@@ -198,11 +195,19 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
} }
} }
/** Dump info to dumpsys */
public void dump(PrintWriter pw) {
LOGGER.reverseDump(pw);
}
@VisibleForTesting @VisibleForTesting
MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType, MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
@Nullable Network network) { @Nullable Network network) {
LOGGER.log("createServiceTypeClient for serviceType:" + serviceType
+ " network:" + network);
return new MdnsServiceTypeClient( return new MdnsServiceTypeClient(
serviceType, socketClient, serviceType, socketClient,
executorProvider.newServiceTypeClientSchedulerExecutor(), network); executorProvider.newServiceTypeClientSchedulerExecutor(), network,
LOGGER.forSubComponent(serviceType + "-" + network));
} }
} }

View File

@@ -28,7 +28,7 @@ import android.util.Pair;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.server.connectivity.mdns.util.MdnsLogger; import com.android.net.module.util.SharedLog;
import java.net.Inet4Address; import java.net.Inet4Address;
import java.net.Inet6Address; import java.net.Inet6Address;
@@ -49,8 +49,6 @@ import java.util.concurrent.ScheduledExecutorService;
public class MdnsServiceTypeClient { public class MdnsServiceTypeClient {
private static final int DEFAULT_MTU = 1500; private static final int DEFAULT_MTU = 1500;
private static final MdnsLogger LOGGER = new MdnsLogger("MdnsServiceTypeClient");
private final String serviceType; private final String serviceType;
private final String[] serviceTypeLabels; private final String[] serviceTypeLabels;
@@ -58,6 +56,7 @@ public class MdnsServiceTypeClient {
private final MdnsResponseDecoder responseDecoder; private final MdnsResponseDecoder responseDecoder;
private final ScheduledExecutorService executor; private final ScheduledExecutorService executor;
@Nullable private final Network network; @Nullable private final Network network;
@NonNull private final SharedLog sharedLog;
private final Object lock = new Object(); private final Object lock = new Object();
private final ArrayMap<MdnsServiceBrowserListener, MdnsSearchOptions> listeners = private final ArrayMap<MdnsServiceBrowserListener, MdnsSearchOptions> listeners =
new ArrayMap<>(); new ArrayMap<>();
@@ -90,8 +89,10 @@ public class MdnsServiceTypeClient {
@NonNull String serviceType, @NonNull String serviceType,
@NonNull MdnsSocketClientBase socketClient, @NonNull MdnsSocketClientBase socketClient,
@NonNull ScheduledExecutorService executor, @NonNull ScheduledExecutorService executor,
@Nullable Network network) { @Nullable Network network,
this(serviceType, socketClient, executor, new MdnsResponseDecoder.Clock(), network); @NonNull SharedLog sharedLog) {
this(serviceType, socketClient, executor, new MdnsResponseDecoder.Clock(), network,
sharedLog);
} }
@VisibleForTesting @VisibleForTesting
@@ -100,7 +101,8 @@ public class MdnsServiceTypeClient {
@NonNull MdnsSocketClientBase socketClient, @NonNull MdnsSocketClientBase socketClient,
@NonNull ScheduledExecutorService executor, @NonNull ScheduledExecutorService executor,
@NonNull MdnsResponseDecoder.Clock clock, @NonNull MdnsResponseDecoder.Clock clock,
@Nullable Network network) { @Nullable Network network,
@NonNull SharedLog sharedLog) {
this.serviceType = serviceType; this.serviceType = serviceType;
this.socketClient = socketClient; this.socketClient = socketClient;
this.executor = executor; this.executor = executor;
@@ -108,6 +110,7 @@ public class MdnsServiceTypeClient {
this.responseDecoder = new MdnsResponseDecoder(clock, serviceTypeLabels); this.responseDecoder = new MdnsResponseDecoder(clock, serviceTypeLabels);
this.clock = clock; this.clock = clock;
this.network = network; this.network = network;
this.sharedLog = sharedLog;
} }
private static MdnsServiceInfo buildMdnsServiceInfoFromResponse( private static MdnsServiceInfo buildMdnsServiceInfoFromResponse(
@@ -261,20 +264,20 @@ public class MdnsServiceTypeClient {
} }
private void onResponseModified(@NonNull MdnsResponse response) { private void onResponseModified(@NonNull MdnsResponse response) {
final String serviceInstanceName = response.getServiceInstanceName();
final MdnsResponse currentResponse = final MdnsResponse currentResponse =
instanceNameToResponse.get(response.getServiceInstanceName()); instanceNameToResponse.get(serviceInstanceName);
boolean newServiceFound = false; boolean newServiceFound = false;
boolean serviceBecomesComplete = false; boolean serviceBecomesComplete = false;
if (currentResponse == null) { if (currentResponse == null) {
newServiceFound = true; newServiceFound = true;
String serviceInstanceName = response.getServiceInstanceName();
if (serviceInstanceName != null) { if (serviceInstanceName != null) {
instanceNameToResponse.put(serviceInstanceName, response); instanceNameToResponse.put(serviceInstanceName, response);
} }
} else { } else {
boolean before = currentResponse.isComplete(); boolean before = currentResponse.isComplete();
instanceNameToResponse.put(response.getServiceInstanceName(), response); instanceNameToResponse.put(serviceInstanceName, response);
boolean after = response.isComplete(); boolean after = response.isComplete();
serviceBecomesComplete = !before && after; serviceBecomesComplete = !before && after;
} }
@@ -285,13 +288,16 @@ public class MdnsServiceTypeClient {
if (!responseMatchesOptions(response, listeners.valueAt(i))) continue; if (!responseMatchesOptions(response, listeners.valueAt(i))) continue;
final MdnsServiceBrowserListener listener = listeners.keyAt(i); final MdnsServiceBrowserListener listener = listeners.keyAt(i);
if (newServiceFound) { if (newServiceFound) {
sharedLog.log("onServiceNameDiscovered: " + serviceInstanceName);
listener.onServiceNameDiscovered(serviceInfo); listener.onServiceNameDiscovered(serviceInfo);
} }
if (response.isComplete()) { if (response.isComplete()) {
if (newServiceFound || serviceBecomesComplete) { if (newServiceFound || serviceBecomesComplete) {
sharedLog.log("onServiceFound: " + serviceInstanceName);
listener.onServiceFound(serviceInfo); listener.onServiceFound(serviceInfo);
} else { } else {
sharedLog.log("onServiceUpdated: " + serviceInstanceName);
listener.onServiceUpdated(serviceInfo); listener.onServiceUpdated(serviceInfo);
} }
} }
@@ -309,8 +315,10 @@ public class MdnsServiceTypeClient {
final MdnsServiceInfo serviceInfo = final MdnsServiceInfo serviceInfo =
buildMdnsServiceInfoFromResponse(response, serviceTypeLabels); buildMdnsServiceInfoFromResponse(response, serviceTypeLabels);
if (response.isComplete()) { if (response.isComplete()) {
sharedLog.log("onServiceRemoved: " + serviceInstanceName);
listener.onServiceRemoved(serviceInfo); listener.onServiceRemoved(serviceInfo);
} }
sharedLog.log("onServiceNameRemoved: " + serviceInstanceName);
listener.onServiceNameRemoved(serviceInfo); listener.onServiceNameRemoved(serviceInfo);
} }
} }
@@ -485,7 +493,7 @@ public class MdnsServiceTypeClient {
servicesToResolve) servicesToResolve)
.call(); .call();
} catch (RuntimeException e) { } catch (RuntimeException e) {
LOGGER.e(String.format("Failed to run EnqueueMdnsQueryCallable for subtype: %s", sharedLog.e(String.format("Failed to run EnqueueMdnsQueryCallable for subtype: %s",
TextUtils.join(",", config.subtypes)), e); TextUtils.join(",", config.subtypes)), e);
result = null; result = null;
} }
@@ -534,8 +542,12 @@ public class MdnsServiceTypeClient {
buildMdnsServiceInfoFromResponse( buildMdnsServiceInfoFromResponse(
existingResponse, serviceTypeLabels); existingResponse, serviceTypeLabels);
if (existingResponse.isComplete()) { if (existingResponse.isComplete()) {
sharedLog.log("TTL expired. onServiceRemoved: "
+ serviceInstanceName);
listener.onServiceRemoved(serviceInfo); listener.onServiceRemoved(serviceInfo);
} }
sharedLog.log("TTL expired. onServiceNameRemoved: "
+ serviceInstanceName);
listener.onServiceNameRemoved(serviceInfo); listener.onServiceNameRemoved(serviceInfo);
} }
} }

View File

@@ -41,6 +41,7 @@ import android.net.InetAddresses;
import android.net.Network; import android.net.Network;
import android.text.TextUtils; import android.text.TextUtils;
import com.android.net.module.util.SharedLog;
import com.android.server.connectivity.mdns.MdnsServiceInfo.TextEntry; import com.android.server.connectivity.mdns.MdnsServiceInfo.TextEntry;
import com.android.server.connectivity.mdns.MdnsServiceTypeClient.QueryTaskConfig; import com.android.server.connectivity.mdns.MdnsServiceTypeClient.QueryTaskConfig;
import com.android.testutils.DevSdkIgnoreRule; import com.android.testutils.DevSdkIgnoreRule;
@@ -99,6 +100,8 @@ public class MdnsServiceTypeClientTests {
private Network mockNetwork; private Network mockNetwork;
@Mock @Mock
private MdnsResponseDecoder.Clock mockDecoderClock; private MdnsResponseDecoder.Clock mockDecoderClock;
@Mock
private SharedLog mockSharedLog;
@Captor @Captor
private ArgumentCaptor<MdnsServiceInfo> serviceInfoCaptor; private ArgumentCaptor<MdnsServiceInfo> serviceInfoCaptor;
@@ -166,7 +169,7 @@ public class MdnsServiceTypeClientTests {
client = client =
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor, new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
mockDecoderClock, mockNetwork) { mockDecoderClock, mockNetwork, mockSharedLog) {
@Override @Override
MdnsPacketWriter createMdnsPacketWriter() { MdnsPacketWriter createMdnsPacketWriter() {
return mockPacketWriter; return mockPacketWriter;
@@ -701,7 +704,7 @@ public class MdnsServiceTypeClientTests {
final String serviceInstanceName = "service-instance-1"; final String serviceInstanceName = "service-instance-1";
client = client =
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor, new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
mockDecoderClock, mockNetwork) { mockDecoderClock, mockNetwork, mockSharedLog) {
@Override @Override
MdnsPacketWriter createMdnsPacketWriter() { MdnsPacketWriter createMdnsPacketWriter() {
return mockPacketWriter; return mockPacketWriter;
@@ -740,7 +743,7 @@ public class MdnsServiceTypeClientTests {
final String serviceInstanceName = "service-instance-1"; final String serviceInstanceName = "service-instance-1";
client = client =
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor, new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
mockDecoderClock, mockNetwork) { mockDecoderClock, mockNetwork, mockSharedLog) {
@Override @Override
MdnsPacketWriter createMdnsPacketWriter() { MdnsPacketWriter createMdnsPacketWriter() {
return mockPacketWriter; return mockPacketWriter;
@@ -773,7 +776,7 @@ public class MdnsServiceTypeClientTests {
final String serviceInstanceName = "service-instance-1"; final String serviceInstanceName = "service-instance-1";
client = client =
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor, new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
mockDecoderClock, mockNetwork) { mockDecoderClock, mockNetwork, mockSharedLog) {
@Override @Override
MdnsPacketWriter createMdnsPacketWriter() { MdnsPacketWriter createMdnsPacketWriter() {
return mockPacketWriter; return mockPacketWriter;
@@ -898,7 +901,7 @@ public class MdnsServiceTypeClientTests {
@Test @Test
public void testProcessResponse_Resolve() throws Exception { public void testProcessResponse_Resolve() throws Exception {
client = new MdnsServiceTypeClient( client = new MdnsServiceTypeClient(
SERVICE_TYPE, mockSocketClient, currentThreadExecutor, mockNetwork); SERVICE_TYPE, mockSocketClient, currentThreadExecutor, mockNetwork, mockSharedLog);
final String instanceName = "service-instance"; final String instanceName = "service-instance";
final String[] hostname = new String[] { "testhost "}; final String[] hostname = new String[] { "testhost "};
@@ -995,7 +998,7 @@ public class MdnsServiceTypeClientTests {
@Test @Test
public void testProcessResponse_ResolveExcludesOtherServices() { public void testProcessResponse_ResolveExcludesOtherServices() {
client = new MdnsServiceTypeClient( client = new MdnsServiceTypeClient(
SERVICE_TYPE, mockSocketClient, currentThreadExecutor, mockNetwork); SERVICE_TYPE, mockSocketClient, currentThreadExecutor, mockNetwork, mockSharedLog);
final String requestedInstance = "instance1"; final String requestedInstance = "instance1";
final String otherInstance = "instance2"; final String otherInstance = "instance2";