Ensure VmService instance is disposed after failed direct connection attempt (#66123)

_attemptServiceConnection in FallbackDiscovery would fail if the root
library URI was not a package URI even if the VM service connection
attempt was successful. This resulted in a VM service connection being
left alive, causing DDS to fail its connection to the VM service.

Updated _attemptServiceConnection to ensure the VM service instance is
disposed after a non-connection related failure and to allow for root
library URIs with a file scheme.
This commit is contained in:
Ben Konyi 2020-09-18 14:20:35 -07:00 committed by GitHub
parent 78929661fb
commit 409e994cd0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -156,9 +156,10 @@ class FallbackDiscovery {
// Attempt to connect to the VM service 5 times.
int attempts = 0;
Exception firstException;
VmService vmService;
while (attempts < 5) {
try {
final VmService vmService = await _vmServiceConnectUri(
vmService = await _vmServiceConnectUri(
assumedWsUri.toString(),
);
final VM vm = await vmService.getVM();
@ -167,15 +168,17 @@ class FallbackDiscovery {
isolateRefs.id,
);
final LibraryRef library = isolateResponse.rootLib;
if (library != null && library.uri.startsWith('package:$packageName')) {
if (library != null &&
(library.uri.startsWith('package:$packageName') ||
library.uri.startsWith(RegExp(r'file:\/\/\/.*\/' + packageName)))) {
UsageEvent(
_kEventName,
'success',
flutterUsage: _flutterUsage,
).send();
// We absolutely must dispose this vmService instance, otherwise
// DDS will fail to start.
// This vmService instance must be disposed of, otherwise DDS will
// fail to start.
vmService.dispose();
return Uri.parse('http://localhost:$hostPort');
}
@ -184,6 +187,10 @@ class FallbackDiscovery {
// No action, we might have failed to connect.
firstException ??= err;
_logger.printTrace(err.toString());
} finally {
// This vmService instance must be disposed of, otherwise DDS will
// fail to start.
vmService?.dispose();
}
// No exponential backoff is used here to keep the amount of time the