Skip to content

Commit 409b86c

Browse files
authored
Cache MEF catalog in servicehub process (#78122)
Cache the MEF catalog created in the roslyn code analysis process. On my dev machine, the creation of the MEF catalog in our CA process takes about 500 ms. With this change, runs that were able to load from the cache saw that time reduced to about 150 ms. The high-level change here is to piggy back on the work that Joey did a while back to add MEF catalog caching to our VSCode language server. This PR just moves that code down to a layer where our service hub code can reference, and generalized it a bit to fit into what the service hub code can provide. One slight additional change in this PR was to add a new remote service to handle passing over the proper location to store the mef cache. I didn't feel comfortable fitting this into the previous first message sent across (IRemoteProcessTelemetryService), so I created IRemoteInitializationService to better fit what I wanted. This led to creating a separate type to handle the export provider creation (RemoteExportProvider) instead of tying this up into RemoteWorkspaceManager.
1 parent dd027d8 commit 409b86c

File tree

39 files changed

+640
-345
lines changed

39 files changed

+640
-345
lines changed

eng/targets/Services.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<ServiceHubService Include="Microsoft.VisualStudio.LanguageServices.MissingImportDiscovery" ClassName="Microsoft.CodeAnalysis.Remote.RemoteMissingImportDiscoveryService+Factory" />
3434
<ServiceHubService Include="Microsoft.VisualStudio.LanguageServices.NavigateToSearch" ClassName="Microsoft.CodeAnalysis.Remote.RemoteNavigateToSearchService+Factory" />
3535
<ServiceHubService Include="Microsoft.VisualStudio.LanguageServices.NavigationBarItem" ClassName="Microsoft.CodeAnalysis.Remote.RemoteNavigationBarItemService+Factory" />
36+
<ServiceHubService Include="Microsoft.VisualStudio.LanguageServices.Initialization" ClassName="Microsoft.CodeAnalysis.Remote.RemoteInitializationService+Factory" />
3637
<ServiceHubService Include="Microsoft.VisualStudio.LanguageServices.ProcessTelemetry" ClassName="Microsoft.CodeAnalysis.Remote.RemoteProcessTelemetryService+Factory" />
3738
<ServiceHubService Include="Microsoft.VisualStudio.LanguageServices.ProjectTelemetry" ClassName="Microsoft.CodeAnalysis.Remote.RemoteProjectTelemetryService+Factory" />
3839
<ServiceHubService Include="Microsoft.VisualStudio.LanguageServices.RelatedDocuments" ClassName="Microsoft.CodeAnalysis.Remote.RemoteRelatedDocumentsService+Factory" />

src/CodeStyle/Core/CodeFixes/Host/Mef/CodeStyleHostLanguageServices.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ private static ImmutableArray<Assembly> CreateAssemblies(string languageName)
4949
}
5050

5151
return MefHostServices.DefaultAssemblies.Concat(
52-
MefHostServicesHelpers.LoadNearbyAssemblies(assemblyNames));
52+
MefHostServicesHelpers.LoadNearbyAssemblies(assemblyNames.ToImmutableAndClear()));
5353
}
5454

5555
IEnumerable<Lazy<TExtension>> IMefHostExportProvider.GetExports<TExtension>()

src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer.UnitTests/ExportProviderBuilderTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,15 @@ public ImportType(ExportedType t) { }
148148

149149
private async Task AssertCacheWriteWasAttemptedAsync()
150150
{
151-
var cacheWriteTask = ExportProviderBuilder.TestAccessor.GetCacheWriteTask();
151+
var cacheWriteTask = LanguageServerExportProviderBuilder.TestAccessor.GetCacheWriteTask();
152152
Assert.NotNull(cacheWriteTask);
153153

154154
await cacheWriteTask;
155155
}
156156

157157
private void AssertNoCacheWriteWasAttempted()
158158
{
159-
var cacheWriteTask2 = ExportProviderBuilder.TestAccessor.GetCacheWriteTask();
159+
var cacheWriteTask2 = LanguageServerExportProviderBuilder.TestAccessor.GetCacheWriteTask();
160160
Assert.Null(cacheWriteTask2);
161161
}
162162

src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer.UnitTests/Utilities/LanguageServerTestComposition.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public static Task<ExportProvider> CreateExportProviderAsync(
3333
UseStdIo: false);
3434
var extensionManager = ExtensionAssemblyManager.Create(serverConfiguration, loggerFactory);
3535
assemblyLoader = new CustomExportAssemblyLoader(extensionManager, loggerFactory);
36-
return ExportProviderBuilder.CreateExportProviderAsync(extensionManager, assemblyLoader, devKitDependencyPath, cacheDirectory, loggerFactory);
36+
37+
return LanguageServerExportProviderBuilder.CreateExportProviderAsync(extensionManager, assemblyLoader, devKitDependencyPath, cacheDirectory, loggerFactory, CancellationToken.None);
3738
}
3839
}

src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/ExportProviderBuilder.cs

Lines changed: 0 additions & 229 deletions
This file was deleted.

0 commit comments

Comments
 (0)