From bffd58b3a6586f4f3eaa7b5921070b6ad77c4df9 Mon Sep 17 00:00:00 2001 From: Andrey Goncharov Date: Wed, 3 Nov 2021 08:09:43 -0700 Subject: [PATCH] Fix idb device duplicates Summary: idb sometimes returns duplicates when we query targets. It leads us to removing valid devices and reconnecting to them again. Eventually, it starves the idb thread pool. This diff removes the duplicates from the idb output. Reviewed By: jknoxville Differential Revision: D32099320 fbshipit-source-id: 7d8b756360f82557000ea5aa037a249b33be9961 --- .../src/devices/ios/iOSContainerUtility.tsx | 11 ++++++++++- .../src/devices/ios/iOSDeviceManager.tsx | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/desktop/flipper-server-core/src/devices/ios/iOSContainerUtility.tsx b/desktop/flipper-server-core/src/devices/ios/iOSContainerUtility.tsx index 313e65638..21a1b8809 100644 --- a/desktop/flipper-server-core/src/devices/ios/iOSContainerUtility.tsx +++ b/desktop/flipper-server-core/src/devices/ios/iOSContainerUtility.tsx @@ -97,7 +97,7 @@ export async function queryTargetsWithoutXcodeDependency( } function parseIdbTargets(lines: string): Array { - return lines + const parsedIdbTargets = lines .trim() .split('\n') .map((line) => line.trim()) @@ -113,6 +113,15 @@ function parseIdbTargets(lines: string): Array { type: target.type as DeviceType, name: target.name, })); + + // For some reason, idb can return duplicates + // TODO: Raise the issue with idb + const dedupedIdbTargets: Record = {}; + for (const idbTarget of parsedIdbTargets) { + dedupedIdbTargets[idbTarget.udid] = + dedupedIdbTargets[idbTarget.udid] ?? idbTarget; + } + return Object.values(dedupedIdbTargets); } export async function idbListTargets( diff --git a/desktop/flipper-server-core/src/devices/ios/iOSDeviceManager.tsx b/desktop/flipper-server-core/src/devices/ios/iOSDeviceManager.tsx index 5ea8bf48f..58855b609 100644 --- a/desktop/flipper-server-core/src/devices/ios/iOSDeviceManager.tsx +++ b/desktop/flipper-server-core/src/devices/ios/iOSDeviceManager.tsx @@ -133,12 +133,16 @@ export class IOSDeviceManager { const config = getFlipperServerConfig(); const isXcodeInstalled = await iosUtil.isXcodeDetected(); const isIdbAvailable = await iosUtil.isAvailable(config.idbPath); + console.debug( + `[conn] queryDevices. isXcodeInstalled ${isXcodeInstalled}, isIdbAvailable ${isIdbAvailable}`, + ); return Promise.all( this.getAllPromisesForQueryingDevices(isXcodeInstalled, isIdbAvailable), ); } private processDevices(activeDevices: IOSDeviceParams[]) { + console.debug('[conn] processDevices', activeDevices); if (!this.iosBridge) { throw new Error('iOS bridge not yet initialized'); } @@ -148,6 +152,10 @@ export class IOSDeviceManager { .filter((device) => device.info.os === 'iOS') .map((device) => device.serial), ); + console.debug( + '[conn] processDevices -> currentDeviceIDs', + currentDeviceIDs, + ); for (const activeDevice of activeDevices) { const {udid, type, name} = activeDevice;