Skip to content

Commit 58dde43

Browse files
MichaelRFairhurstcommit-bot@chromium.org
authored andcommitted
[analysis_server] don't create futures for stalled plugins.
Also looks like "cannot stop a plugin that's already running" occurred from this case, which was also an easy fix. Change-Id: I113170e65ced26d1113cdb4e0cf206c8b1b68d31 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/126405 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Mike Fairhurst <mfairhurst@google.com>
1 parent 5aa86eb commit 58dde43

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

pkg/analysis_server/lib/src/plugin/plugin_manager.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:analyzer/file_system/file_system.dart';
1313
import 'package:analyzer/instrumentation/instrumentation.dart';
1414
import 'package:analyzer/src/context/context_root.dart' as analyzer;
1515
import 'package:analyzer/src/generated/source.dart';
16+
import 'package:analyzer/src/generated/engine.dart';
1617
import 'package:analyzer/src/util/glob.dart';
1718
import 'package:analyzer/src/workspace/bazel.dart';
1819
import 'package:analyzer/src/workspace/gn.dart';
@@ -438,7 +439,11 @@ class PluginManager {
438439
Map<PluginInfo, Future<Response>> responseMap =
439440
<PluginInfo, Future<Response>>{};
440441
for (PluginInfo plugin in plugins) {
441-
responseMap[plugin] = plugin.currentSession?.sendRequest(params);
442+
final request = plugin.currentSession?.sendRequest(params);
443+
// Only add an entry to the map if we have sent a request.
444+
if (request != null) {
445+
responseMap[plugin] = request;
446+
}
442447
}
443448
return responseMap;
444449
}
@@ -675,7 +680,13 @@ class PluginManager {
675680
* Stop all of the plugins that are currently running.
676681
*/
677682
Future<List<void>> stopAll() {
678-
return Future.wait(_pluginMap.values.map((PluginInfo info) => info.stop()));
683+
return Future.wait(_pluginMap.values.map((PluginInfo info) async {
684+
try {
685+
await info.stop();
686+
} catch (e, st) {
687+
AnalysisEngine.instance.instrumentationService.logException(e, st);
688+
}
689+
}));
679690
}
680691

681692
/**

pkg/analysis_server/test/src/plugin/plugin_manager_test.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,31 @@ class PluginManagerFromDiskTest extends PluginTestSupport {
292292
pkg1Dir.deleteSync(recursive: true);
293293
}
294294

295+
@SkippedTest(
296+
reason: 'flaky timeouts',
297+
issue: 'https://github.com/dart-lang/sdk/issues/38629')
298+
test_broadcastRequest_noCurrentSession() async {
299+
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
300+
String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
301+
await withPlugin(
302+
pluginName: 'plugin1',
303+
content: '(invalid content here)',
304+
test: (String plugin1Path) async {
305+
ContextRoot contextRoot = _newContextRoot(pkgPath);
306+
await manager.addPluginToContextRoot(contextRoot, plugin1Path);
307+
308+
Map<PluginInfo, Future<Response>> responses =
309+
manager.broadcastRequest(
310+
new CompletionGetSuggestionsParams(
311+
'/pkg1/lib/pkg1.dart', 100),
312+
contextRoot: contextRoot);
313+
expect(responses, hasLength(0));
314+
315+
await manager.stopAll();
316+
});
317+
pkg1Dir.deleteSync(recursive: true);
318+
}
319+
295320
@SkippedTest(
296321
reason: 'flaky timeouts',
297322
issue: 'https://github.com/dart-lang/sdk/issues/38629')

0 commit comments

Comments
 (0)