Index: runtime/bin/vmservice/server.dart |
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart |
index e659758fd4bd7c37d61580004c0d22c5646636ae..fb272607f56cdd08ebc904fa0e908ddb90f7b3a4 100644 |
--- a/runtime/bin/vmservice/server.dart |
+++ b/runtime/bin/vmservice/server.dart |
@@ -323,38 +323,58 @@ class Server { |
} |
// Startup HTTP server. |
- try { |
- var address; |
- if (Platform.isFuchsia) { |
- address = InternetAddress.ANY_IP_V4; |
- } else { |
- var addresses = await InternetAddress.lookup(_ip); |
- // Prefer IPv4 addresses. |
- for (var i = 0; i < addresses.length; i++) { |
- address = addresses[i]; |
- if (address.type == InternetAddressType.IP_V4) break; |
+ var pollError; |
+ var pollStack; |
+ Future<bool> poll() async { |
+ try { |
+ var address; |
+ if (Platform.isFuchsia) { |
+ address = InternetAddress.ANY_IP_V4; |
+ } else { |
+ var addresses = await InternetAddress.lookup(_ip); |
+ // Prefer IPv4 addresses. |
+ for (var i = 0; i < addresses.length; i++) { |
+ address = addresses[i]; |
+ if (address.type == InternetAddressType.IP_V4) break; |
+ } |
} |
+ _server = await HttpServer.bind(address, _port); |
+ return true; |
+ } catch (e, st) { |
+ pollError = e; |
+ pollStack = st; |
+ return false; |
} |
- _server = await HttpServer.bind(address, _port); |
- _server.listen(_requestHandler, cancelOnError: true); |
- serverPrint('Observatory listening on $serverAddress'); |
- if (Platform.isFuchsia) { |
- // Create a file with the port number. |
- String tmp = Directory.systemTemp.path; |
- String path = "$tmp/dart.services/${_server.port}"; |
- serverPrint("Creating $path"); |
- new File(path)..createSync(recursive: true); |
+ } |
+ |
+ // poll for the network for ~10 seconds. |
+ int attempts = 0; |
+ final int maxAttempts = 10; |
+ while (!await poll()) { |
+ attempts++; |
+ serverPrint("Observatory server failed to start after $attempts tries"); |
+ if (attempts > maxAttempts) { |
+ serverPrint('Could not start Observatory HTTP server:\n' |
+ '$pollError\n$pollStack\n'); |
+ _notifyServerState(""); |
+ onServerAddressChange(null); |
+ return this; |
} |
- // Server is up and running. |
- _notifyServerState(serverAddress.toString()); |
- onServerAddressChange('$serverAddress'); |
- return this; |
- } catch (e, st) { |
- serverPrint('Could not start Observatory HTTP server:\n$e\n$st\n'); |
- _notifyServerState(""); |
- onServerAddressChange(null); |
- return this; |
+ await new Future<Null>.delayed(const Duration(seconds: 1)); |
+ } |
+ _server.listen(_requestHandler, cancelOnError: true); |
+ serverPrint('Observatory listening on $serverAddress'); |
+ if (Platform.isFuchsia) { |
+ // Create a file with the port number. |
+ String tmp = Directory.systemTemp.path; |
+ String path = "$tmp/dart.services/${_server.port}"; |
+ serverPrint("Creating $path"); |
+ new File(path)..createSync(recursive: true); |
} |
+ // Server is up and running. |
+ _notifyServerState(serverAddress.toString()); |
+ onServerAddressChange('$serverAddress'); |
+ return this; |
} |
Future cleanup(bool force) { |