From f86ebae9b8f53e21c76fb4b1be2327074b9b1f76 Mon Sep 17 00:00:00 2001 From: Hai Cao Date: Sun, 11 Dec 2022 00:05:33 -0800 Subject: [PATCH] Re-enable parallel message processing (#1741) * add flag to handler * cleanup * concurrency control * add flag for handler setters * update service flags * fix event handlers * more handlers * make sure behavior is unchanged if flag is off * cleanup * add test case for parallel processing * comments * stop dispatcher in test * add log for request lifespan * cleanup and add comments * correctly release semaphore * remove deleted file from merge * use await for semaphore release * move handler invocation to await and adjust test * cleanup exception handling and wrapper * space * loose assertion condition to make test stable --- .../Hosting/Protocol/Channel/ChannelBase.cs | 2 +- .../Hosting/Protocol/IProtocolEndpoint.cs | 38 +++++-- .../Hosting/Protocol/MessageDispatcher.cs | 101 +++++++++--------- .../Hosting/Protocol/MessageReader.cs | 3 +- .../Hosting/Protocol/ProtocolEndpoint.cs | 35 +++--- .../Admin/AdminService.cs | 8 +- .../Agent/AgentService.cs | 76 ++++++------- .../AzureBlob/BlobService.cs | 2 +- .../AzureFunctions/AzureFunctionsService.cs | 4 +- .../Cms/CmsService.cs | 12 +-- .../Connection/ConnectionService.cs | 16 +-- .../DacFx/DacFxService.cs | 24 ++--- .../DisasterRecoveryService.cs | 12 +-- .../EditData/EditDataService.cs | 18 ++-- .../ExecutionPlan/ExecutionPlanService.cs | 4 +- .../FileBrowser/FileBrowserService.cs | 8 +- .../Formatter/TSqlFormatterService.cs | 4 +- .../ExternalLanguageService.cs | 8 +- .../LanguageServices/LanguageService.cs | 1 + .../Metadata/MetadataService.cs | 6 +- .../Migration/MigrationService.cs | 20 ++-- .../ModelManagement/ModelManagementService.cs | 14 +-- .../NotebookConvert/NotebookConvertService.cs | 4 +- .../ObjectExplorer/ObjectExplorerService.cs | 1 + .../ObjectManagementService.cs | 2 +- .../Profiler/ProfilerService.cs | 12 +-- .../QueryExecution/QueryExecutionService.cs | 28 ++--- .../QueryExecution/SerializationService.cs | 4 +- .../SchemaCompare/SchemaCompareService.cs | 18 ++-- .../Scripting/ScriptingService.cs | 6 +- .../Security/SecurityService.cs | 8 +- .../ServerConfigService.cs | 6 +- .../SqlAssessment/SqlAssessmentService.cs | 6 +- .../TableDesigner/TableDesignerService.cs | 12 +-- .../TaskServices/TaskService.cs | 4 +- .../Workspace/WorkspaceService.cs | 1 + .../Messaging/MessageDispatcherTests.cs | 67 ++++++++++++ 37 files changed, 350 insertions(+), 245 deletions(-) diff --git a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/Channel/ChannelBase.cs b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/Channel/ChannelBase.cs index d625d10e..7e8330a3 100644 --- a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/Channel/ChannelBase.cs +++ b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/Channel/ChannelBase.cs @@ -23,7 +23,7 @@ namespace Microsoft.SqlTools.Hosting.Protocol.Channel /// /// Gets the MessageReader for reading messages from the channel. /// - public MessageReader MessageReader { get; protected set; } + public virtual MessageReader MessageReader { get; protected set; } // mark as virtual for mocking ChannelBase in UT /// /// Gets the MessageWriter for writing messages to the channel. diff --git a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/IProtocolEndpoint.cs b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/IProtocolEndpoint.cs index e0adefab..85d9318c 100644 --- a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/IProtocolEndpoint.cs +++ b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/IProtocolEndpoint.cs @@ -16,17 +16,43 @@ namespace Microsoft.SqlTools.Hosting.Protocol /// public interface IProtocolEndpoint : IEventSender, IRequestSender { + /// + /// Set a request handler + /// + /// type of parameter + /// type of result + /// request type + /// request handler + /// whether this handler supports parallel processing void SetRequestHandler( RequestType requestType, - Func, Task> requestHandler); - - void SetEventHandler( - EventType eventType, - Func eventHandler); + Func, Task> requestHandler, + bool isParallelProcessingSupported = false); + /// + /// Set an request handler + /// + /// type of parameter + /// type of event + /// event handler + /// whether this handler supports parallel processing void SetEventHandler( EventType eventType, Func eventHandler, - bool overrideExisting); + bool isParallelProcessingSupported = false); + + /// + /// Set an request handler + /// + /// type of parameter + /// type of event + /// event handler + /// whether to override the existing handler for the same event type + /// whether this handler supports parallel processing + void SetEventHandler( + EventType eventType, + Func eventHandler, + bool overrideExisting, + bool isParallelProcessingSupported = false); } } diff --git a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageDispatcher.cs b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageDispatcher.cs index 99d78c9b..7f1b9eb4 100644 --- a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageDispatcher.cs +++ b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageDispatcher.cs @@ -27,14 +27,22 @@ namespace Microsoft.SqlTools.Hosting.Protocol internal Dictionary> requestHandlers = new Dictionary>(); + internal Dictionary requestHandlerParallelismMap = + new Dictionary(); + internal Dictionary> eventHandlers = new Dictionary>(); + internal Dictionary eventHandlerParallelismMap = + new Dictionary(); + private Action responseHandler; private CancellationTokenSource messageLoopCancellationToken = new CancellationTokenSource(); + private SemaphoreSlim semaphore = new SemaphoreSlim(10); // Limit to 10 threads to begin with, ideally there shouldn't be any limitation + #endregion #region Properties @@ -112,7 +120,8 @@ namespace Microsoft.SqlTools.Hosting.Protocol public void SetRequestHandler( RequestType requestType, Func, Task> requestHandler, - bool overrideExisting) + bool overrideExisting, + bool isParallelProcessingSupported = false) { if (overrideExisting) { @@ -120,16 +129,18 @@ namespace Microsoft.SqlTools.Hosting.Protocol this.requestHandlers.Remove(requestType.MethodName); } + this.requestHandlerParallelismMap.Add(requestType.MethodName, isParallelProcessingSupported); this.requestHandlers.Add( requestType.MethodName, async (requestMessage, messageWriter) => { + Logger.Write(TraceEventType.Verbose, $"Processing message with id[{requestMessage.Id}], of type[{requestMessage.MessageType}] and method[{requestMessage.Method}]"); var requestContext = new RequestContext( requestMessage, messageWriter); try - { + { TParams typedParams = default(TParams); if (requestMessage.Contents != null) { @@ -144,6 +155,7 @@ namespace Microsoft.SqlTools.Hosting.Protocol } await requestHandler(typedParams, requestContext); + Logger.Write(TraceEventType.Verbose, $"Finished processing message with id[{requestMessage.Id}], of type[{requestMessage.MessageType}] and method[{requestMessage.Method}]"); } catch (Exception ex) { @@ -166,7 +178,8 @@ namespace Microsoft.SqlTools.Hosting.Protocol public void SetEventHandler( EventType eventType, Func eventHandler, - bool overrideExisting) + bool overrideExisting, + bool isParallelProcessingSupported = false) { if (overrideExisting) { @@ -174,14 +187,16 @@ namespace Microsoft.SqlTools.Hosting.Protocol this.eventHandlers.Remove(eventType.MethodName); } + this.eventHandlerParallelismMap.Add(eventType.MethodName, isParallelProcessingSupported); this.eventHandlers.Add( eventType.MethodName, async (eventMessage, messageWriter) => { + Logger.Write(TraceEventType.Verbose, $"Processing message with id[{eventMessage.Id}], of type[{eventMessage.MessageType}] and method[{eventMessage.Method}]"); var eventContext = new EventContext(messageWriter); TParams typedParams = default(TParams); try - { + { if (eventMessage.Contents != null) { try @@ -194,6 +209,7 @@ namespace Microsoft.SqlTools.Hosting.Protocol } } await eventHandler(typedParams, eventContext); + Logger.Write(TraceEventType.Verbose, $"Finished processing message with id[{eventMessage.Id}], of type[{eventMessage.MessageType}] and method[{eventMessage.Method}]"); } catch (Exception ex) { @@ -284,19 +300,13 @@ namespace Microsoft.SqlTools.Hosting.Protocol Message messageToDispatch, MessageWriter messageWriter) { - Task handlerToAwait = null; + Func handlerToAwait = null; + bool isParallelProcessingSupported = false; if (messageToDispatch.MessageType == MessageType.Request) { - Func requestHandler = null; - if (this.requestHandlers.TryGetValue(messageToDispatch.Method, out requestHandler)) - { - handlerToAwait = requestHandler(messageToDispatch, messageWriter); - } - // else - // { - // // TODO: Message not supported error - // } + this.requestHandlers.TryGetValue(messageToDispatch.Method, out handlerToAwait); + this.requestHandlerParallelismMap.TryGetValue(messageToDispatch.Method, out isParallelProcessingSupported); } else if (messageToDispatch.MessageType == MessageType.Response) { @@ -307,15 +317,8 @@ namespace Microsoft.SqlTools.Hosting.Protocol } else if (messageToDispatch.MessageType == MessageType.Event) { - Func eventHandler = null; - if (this.eventHandlers.TryGetValue(messageToDispatch.Method, out eventHandler)) - { - handlerToAwait = eventHandler(messageToDispatch, messageWriter); - } - else - { - // TODO: Message not supported error - } + this.eventHandlers.TryGetValue(messageToDispatch.Method, out handlerToAwait); + this.eventHandlerParallelismMap.TryGetValue(messageToDispatch.Method, out isParallelProcessingSupported); } // else // { @@ -324,39 +327,37 @@ namespace Microsoft.SqlTools.Hosting.Protocol if (handlerToAwait != null) { - if (this.ParallelMessageProcessing) + try { - // Run the task in a separate thread so that the main - // thread is not blocked. - _ = Task.Run(() => + if (this.ParallelMessageProcessing && isParallelProcessingSupported) { - _ = RunTask(handlerToAwait); - }); + // Run the task in a separate thread so that the main + // thread is not blocked. Use semaphore to limit the degree of parallelism. + await semaphore.WaitAsync(); + _ = Task.Run(async () => + { + await handlerToAwait(messageToDispatch, messageWriter); + semaphore.Release(); + }); + } + else + { + await handlerToAwait(messageToDispatch, messageWriter); + } } - else + catch (TaskCanceledException e) { - await RunTask(handlerToAwait); + // Some tasks may be cancelled due to legitimate + // timeouts so don't let those exceptions go higher. + Logger.Write(TraceEventType.Verbose, string.Format("A TaskCanceledException occurred in the request handler: {0}", e.ToString())); } - } - } - - private async Task RunTask(Task task) - { - try - { - await task; - } - catch (TaskCanceledException) - { - // Some tasks may be cancelled due to legitimate - // timeouts so don't let those exceptions go higher. - } - catch (Exception e) - { - if (!(e is AggregateException && ((AggregateException)e).InnerExceptions[0] is TaskCanceledException)) + catch (Exception e) { - // Log the error but don't rethrow it to prevent any errors in the handler from crashing the service - Logger.Write(TraceEventType.Error, string.Format("An unexpected error occured in the request handler: {0}", e.ToString())); + if (!(e is AggregateException && ((AggregateException)e).InnerExceptions[0] is TaskCanceledException)) + { + // Log the error but don't rethrow it to prevent any errors in the handler from crashing the service + Logger.Write(TraceEventType.Error, string.Format("An unexpected error occurred in the request handler: {0}", e.ToString())); + } } } } diff --git a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageReader.cs b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageReader.cs index f7f171de..2de51a8d 100644 --- a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageReader.cs +++ b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/MessageReader.cs @@ -49,6 +49,7 @@ namespace Microsoft.SqlTools.Hosting.Protocol #endregion #region Constructors + public MessageReader() {} // added for mocking MessageReader in UT public MessageReader( Stream inputStream, @@ -74,7 +75,7 @@ namespace Microsoft.SqlTools.Hosting.Protocol #region Public Methods - public async Task ReadMessage() + public virtual async Task ReadMessage() // mark as virtual for mocking MessageReader in UT { string messageContent = null; diff --git a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/ProtocolEndpoint.cs b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/ProtocolEndpoint.cs index 4337a4a8..e6b65b30 100644 --- a/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/ProtocolEndpoint.cs +++ b/src/Microsoft.SqlTools.Hosting/Hosting/Protocol/ProtocolEndpoint.cs @@ -272,32 +272,39 @@ namespace Microsoft.SqlTools.Hosting.Protocol public void SetRequestHandler( RequestType requestType, - Func, Task> requestHandler) + Func, Task> requestHandler, + bool isParallelProcessingSupported = false) { this.MessageDispatcher.SetRequestHandler( requestType, - requestHandler); - } - - public void SetEventHandler( - EventType eventType, - Func eventHandler) - { - this.MessageDispatcher.SetEventHandler( - eventType, - eventHandler, - false); + requestHandler, + false, + isParallelProcessingSupported); } public void SetEventHandler( EventType eventType, Func eventHandler, - bool overrideExisting) + bool isParallelProcessingSupported = false) { this.MessageDispatcher.SetEventHandler( eventType, eventHandler, - overrideExisting); + false, + isParallelProcessingSupported); + } + + public void SetEventHandler( + EventType eventType, + Func eventHandler, + bool overrideExisting, + bool isParallelProcessingSupported = false) + { + this.MessageDispatcher.SetEventHandler( + eventType, + eventHandler, + overrideExisting, + isParallelProcessingSupported); } private void HandleResponse(Message responseMessage) diff --git a/src/Microsoft.SqlTools.ServiceLayer/Admin/AdminService.cs b/src/Microsoft.SqlTools.ServiceLayer/Admin/AdminService.cs index 02c48d03..2cd5aea4 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Admin/AdminService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Admin/AdminService.cs @@ -65,10 +65,10 @@ namespace Microsoft.SqlTools.ServiceLayer.Admin /// public void InitializeService(ServiceHost serviceHost) { - serviceHost.SetRequestHandler(CreateDatabaseRequest.Type, HandleCreateDatabaseRequest); - serviceHost.SetRequestHandler(CreateLoginRequest.Type, HandleCreateLoginRequest); - serviceHost.SetRequestHandler(DefaultDatabaseInfoRequest.Type, HandleDefaultDatabaseInfoRequest); - serviceHost.SetRequestHandler(GetDatabaseInfoRequest.Type, HandleGetDatabaseInfoRequest); + serviceHost.SetRequestHandler(CreateDatabaseRequest.Type, HandleCreateDatabaseRequest, true); + serviceHost.SetRequestHandler(CreateLoginRequest.Type, HandleCreateLoginRequest, true); + serviceHost.SetRequestHandler(DefaultDatabaseInfoRequest.Type, HandleDefaultDatabaseInfoRequest, true); + serviceHost.SetRequestHandler(GetDatabaseInfoRequest.Type, HandleGetDatabaseInfoRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/Agent/AgentService.cs b/src/Microsoft.SqlTools.ServiceLayer/Agent/AgentService.cs index 3a5a93d9..9917150b 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Agent/AgentService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Agent/AgentService.cs @@ -79,56 +79,56 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent this.ServiceHost = serviceHost; // Jobs request handlers - this.ServiceHost.SetRequestHandler(AgentJobsRequest.Type, HandleAgentJobsRequest); - this.ServiceHost.SetRequestHandler(AgentJobHistoryRequest.Type, HandleJobHistoryRequest); - this.ServiceHost.SetRequestHandler(AgentJobActionRequest.Type, HandleJobActionRequest); + this.ServiceHost.SetRequestHandler(AgentJobsRequest.Type, HandleAgentJobsRequest, true); + this.ServiceHost.SetRequestHandler(AgentJobHistoryRequest.Type, HandleJobHistoryRequest, true); + this.ServiceHost.SetRequestHandler(AgentJobActionRequest.Type, HandleJobActionRequest, true); - this.ServiceHost.SetRequestHandler(CreateAgentJobRequest.Type, HandleCreateAgentJobRequest); - this.ServiceHost.SetRequestHandler(UpdateAgentJobRequest.Type, HandleUpdateAgentJobRequest); - this.ServiceHost.SetRequestHandler(DeleteAgentJobRequest.Type, HandleDeleteAgentJobRequest); + this.ServiceHost.SetRequestHandler(CreateAgentJobRequest.Type, HandleCreateAgentJobRequest, true); + this.ServiceHost.SetRequestHandler(UpdateAgentJobRequest.Type, HandleUpdateAgentJobRequest, true); + this.ServiceHost.SetRequestHandler(DeleteAgentJobRequest.Type, HandleDeleteAgentJobRequest, true); - this.ServiceHost.SetRequestHandler(AgentJobDefaultsRequest.Type, HandleAgentJobDefaultsRequest); + this.ServiceHost.SetRequestHandler(AgentJobDefaultsRequest.Type, HandleAgentJobDefaultsRequest, true); // Job Steps request handlers - this.ServiceHost.SetRequestHandler(CreateAgentJobStepRequest.Type, HandleCreateAgentJobStepRequest); - this.ServiceHost.SetRequestHandler(UpdateAgentJobStepRequest.Type, HandleUpdateAgentJobStepRequest); - this.ServiceHost.SetRequestHandler(DeleteAgentJobStepRequest.Type, HandleDeleteAgentJobStepRequest); + this.ServiceHost.SetRequestHandler(CreateAgentJobStepRequest.Type, HandleCreateAgentJobStepRequest, true); + this.ServiceHost.SetRequestHandler(UpdateAgentJobStepRequest.Type, HandleUpdateAgentJobStepRequest, true); + this.ServiceHost.SetRequestHandler(DeleteAgentJobStepRequest.Type, HandleDeleteAgentJobStepRequest, true); // Alerts request handlers - this.ServiceHost.SetRequestHandler(AgentAlertsRequest.Type, HandleAgentAlertsRequest); - this.ServiceHost.SetRequestHandler(CreateAgentAlertRequest.Type, HandleCreateAgentAlertRequest); - this.ServiceHost.SetRequestHandler(UpdateAgentAlertRequest.Type, HandleUpdateAgentAlertRequest); - this.ServiceHost.SetRequestHandler(DeleteAgentAlertRequest.Type, HandleDeleteAgentAlertRequest); + this.ServiceHost.SetRequestHandler(AgentAlertsRequest.Type, HandleAgentAlertsRequest, true); + this.ServiceHost.SetRequestHandler(CreateAgentAlertRequest.Type, HandleCreateAgentAlertRequest, true); + this.ServiceHost.SetRequestHandler(UpdateAgentAlertRequest.Type, HandleUpdateAgentAlertRequest, true); + this.ServiceHost.SetRequestHandler(DeleteAgentAlertRequest.Type, HandleDeleteAgentAlertRequest, true); // Operators request handlers - this.ServiceHost.SetRequestHandler(AgentOperatorsRequest.Type, HandleAgentOperatorsRequest); - this.ServiceHost.SetRequestHandler(CreateAgentOperatorRequest.Type, HandleCreateAgentOperatorRequest); - this.ServiceHost.SetRequestHandler(UpdateAgentOperatorRequest.Type, HandleUpdateAgentOperatorRequest); - this.ServiceHost.SetRequestHandler(DeleteAgentOperatorRequest.Type, HandleDeleteAgentOperatorRequest); + this.ServiceHost.SetRequestHandler(AgentOperatorsRequest.Type, HandleAgentOperatorsRequest, true); + this.ServiceHost.SetRequestHandler(CreateAgentOperatorRequest.Type, HandleCreateAgentOperatorRequest, true); + this.ServiceHost.SetRequestHandler(UpdateAgentOperatorRequest.Type, HandleUpdateAgentOperatorRequest, true); + this.ServiceHost.SetRequestHandler(DeleteAgentOperatorRequest.Type, HandleDeleteAgentOperatorRequest, true); // Proxy Accounts request handlers - this.ServiceHost.SetRequestHandler(AgentProxiesRequest.Type, HandleAgentProxiesRequest); - this.ServiceHost.SetRequestHandler(CreateAgentProxyRequest.Type, HandleCreateAgentProxyRequest); - this.ServiceHost.SetRequestHandler(UpdateAgentProxyRequest.Type, HandleUpdateAgentProxyRequest); - this.ServiceHost.SetRequestHandler(DeleteAgentProxyRequest.Type, HandleDeleteAgentProxyRequest); + this.ServiceHost.SetRequestHandler(AgentProxiesRequest.Type, HandleAgentProxiesRequest, true); + this.ServiceHost.SetRequestHandler(CreateAgentProxyRequest.Type, HandleCreateAgentProxyRequest, true); + this.ServiceHost.SetRequestHandler(UpdateAgentProxyRequest.Type, HandleUpdateAgentProxyRequest, true); + this.ServiceHost.SetRequestHandler(DeleteAgentProxyRequest.Type, HandleDeleteAgentProxyRequest, true); // Schedule request handlers - this.ServiceHost.SetRequestHandler(AgentSchedulesRequest.Type, HandleAgentSchedulesRequest); - this.ServiceHost.SetRequestHandler(CreateAgentScheduleRequest.Type, HandleCreateAgentScheduleRequest); - this.ServiceHost.SetRequestHandler(UpdateAgentScheduleRequest.Type, HandleUpdateAgentScheduleRequest); - this.ServiceHost.SetRequestHandler(DeleteAgentScheduleRequest.Type, HandleDeleteAgentScheduleRequest); + this.ServiceHost.SetRequestHandler(AgentSchedulesRequest.Type, HandleAgentSchedulesRequest, true); + this.ServiceHost.SetRequestHandler(CreateAgentScheduleRequest.Type, HandleCreateAgentScheduleRequest, true); + this.ServiceHost.SetRequestHandler(UpdateAgentScheduleRequest.Type, HandleUpdateAgentScheduleRequest, true); + this.ServiceHost.SetRequestHandler(DeleteAgentScheduleRequest.Type, HandleDeleteAgentScheduleRequest, true); // Notebook request handlers - this.ServiceHost.SetRequestHandler(AgentNotebooksRequest.Type, HandleAgentNotebooksRequest); - this.ServiceHost.SetRequestHandler(AgentNotebookHistoryRequest.Type, HandleAgentNotebookHistoryRequest); - this.ServiceHost.SetRequestHandler(AgentNotebookMaterializedRequest.Type, HandleAgentNotebookMaterializedRequest); - this.ServiceHost.SetRequestHandler(AgentNotebookTemplateRequest.Type, HandleAgentNotebookTemplateRequest); - this.ServiceHost.SetRequestHandler(CreateAgentNotebookRequest.Type, HandleCreateAgentNotebookRequest); - this.ServiceHost.SetRequestHandler(DeleteAgentNotebookRequest.Type, HandleDeleteAgentNotebooksRequest); - this.ServiceHost.SetRequestHandler(UpdateAgentNotebookRequest.Type, HandleUpdateAgentNotebookRequest); - this.ServiceHost.SetRequestHandler(UpdateAgentNotebookRunPinRequest.Type, HandleUpdateAgentNotebookRunPinRequest); - this.ServiceHost.SetRequestHandler(UpdateAgentNotebookRunNameRequest.Type, HandleUpdateAgentNotebookRunNameRequest); - this.ServiceHost.SetRequestHandler(DeleteNotebookMaterializedRequest.Type, HandleDeleteNotebookMaterializedRequest); + this.ServiceHost.SetRequestHandler(AgentNotebooksRequest.Type, HandleAgentNotebooksRequest, true); + this.ServiceHost.SetRequestHandler(AgentNotebookHistoryRequest.Type, HandleAgentNotebookHistoryRequest, true); + this.ServiceHost.SetRequestHandler(AgentNotebookMaterializedRequest.Type, HandleAgentNotebookMaterializedRequest, true); + this.ServiceHost.SetRequestHandler(AgentNotebookTemplateRequest.Type, HandleAgentNotebookTemplateRequest, true); + this.ServiceHost.SetRequestHandler(CreateAgentNotebookRequest.Type, HandleCreateAgentNotebookRequest, true); + this.ServiceHost.SetRequestHandler(DeleteAgentNotebookRequest.Type, HandleDeleteAgentNotebooksRequest, true); + this.ServiceHost.SetRequestHandler(UpdateAgentNotebookRequest.Type, HandleUpdateAgentNotebookRequest, true); + this.ServiceHost.SetRequestHandler(UpdateAgentNotebookRunPinRequest.Type, HandleUpdateAgentNotebookRunPinRequest, true); + this.ServiceHost.SetRequestHandler(UpdateAgentNotebookRunNameRequest.Type, HandleUpdateAgentNotebookRunNameRequest, true); + this.ServiceHost.SetRequestHandler(DeleteNotebookMaterializedRequest.Type, HandleDeleteNotebookMaterializedRequest, true); serviceHost.RegisterShutdownTask((_, _) => { @@ -1194,7 +1194,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent parameters.OwnerUri, out connInfo); result.Success = true; - result.Notebooks = AgentNotebookHelper.GetAgentNotebooks(connInfo).Result; + result.Notebooks = await AgentNotebookHelper.GetAgentNotebooks(connInfo); } catch (Exception e) { @@ -1243,7 +1243,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent ConnectionServiceInstance.TryFindConnection( parameters.OwnerUri, out connInfo); - result.NotebookMaterialized = AgentNotebookHelper.GetMaterializedNotebook(connInfo, parameters.NotebookMaterializedId, parameters.TargetDatabase).Result; + result.NotebookMaterialized = await AgentNotebookHelper.GetMaterializedNotebook(connInfo, parameters.NotebookMaterializedId, parameters.TargetDatabase); result.Success = true; } catch (Exception e) diff --git a/src/Microsoft.SqlTools.ServiceLayer/AzureBlob/BlobService.cs b/src/Microsoft.SqlTools.ServiceLayer/AzureBlob/BlobService.cs index 4bbb5f57..5310ab38 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/AzureBlob/BlobService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/AzureBlob/BlobService.cs @@ -35,7 +35,7 @@ namespace Microsoft.SqlTools.ServiceLayer.AzureBlob public void InitializeService(IProtocolEndpoint serviceHost) { - serviceHost.SetRequestHandler(CreateSasRequest.Type, HandleCreateSasRequest); + serviceHost.SetRequestHandler(CreateSasRequest.Type, HandleCreateSasRequest, true); } internal async Task HandleCreateSasRequest( diff --git a/src/Microsoft.SqlTools.ServiceLayer/AzureFunctions/AzureFunctionsService.cs b/src/Microsoft.SqlTools.ServiceLayer/AzureFunctions/AzureFunctionsService.cs index d5c2884c..684cf8dd 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/AzureFunctions/AzureFunctionsService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/AzureFunctions/AzureFunctionsService.cs @@ -32,8 +32,8 @@ namespace Microsoft.SqlTools.ServiceLayer.AzureFunctions /// public void InitializeService(ServiceHost serviceHost) { - serviceHost.SetRequestHandler(AddSqlBindingRequest.Type, this.HandleAddSqlBindingRequest); - serviceHost.SetRequestHandler(GetAzureFunctionsRequest.Type, this.HandleGetAzureFunctionsRequest); + serviceHost.SetRequestHandler(AddSqlBindingRequest.Type, this.HandleAddSqlBindingRequest, true); + serviceHost.SetRequestHandler(GetAzureFunctionsRequest.Type, this.HandleGetAzureFunctionsRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/Cms/CmsService.cs b/src/Microsoft.SqlTools.ServiceLayer/Cms/CmsService.cs index 338334a9..6921cda1 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Cms/CmsService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Cms/CmsService.cs @@ -43,12 +43,12 @@ namespace Microsoft.SqlTools.ServiceLayer.Cms /// public void InitializeService(ServiceHost serviceHost) { - serviceHost.SetRequestHandler(CreateCentralManagementServerRequest.Type, this.HandleCreateCentralManagementServerRequest); - serviceHost.SetRequestHandler(ListRegisteredServersRequest.Type, this.HandleListRegisteredServersRequest); - serviceHost.SetRequestHandler(AddRegisteredServerRequest.Type, this.HandleAddRegisteredServerRequest); - serviceHost.SetRequestHandler(RemoveRegisteredServerRequest.Type, this.HandleRemoveRegisteredServerRequest); - serviceHost.SetRequestHandler(AddServerGroupRequest.Type, this.HandleAddServerGroupRequest); - serviceHost.SetRequestHandler(RemoveServerGroupRequest.Type, this.HandleRemoveServerGroupRequest); + serviceHost.SetRequestHandler(CreateCentralManagementServerRequest.Type, this.HandleCreateCentralManagementServerRequest, true); + serviceHost.SetRequestHandler(ListRegisteredServersRequest.Type, this.HandleListRegisteredServersRequest, true); + serviceHost.SetRequestHandler(AddRegisteredServerRequest.Type, this.HandleAddRegisteredServerRequest, true); + serviceHost.SetRequestHandler(RemoveRegisteredServerRequest.Type, this.HandleRemoveRegisteredServerRequest, true); + serviceHost.SetRequestHandler(AddServerGroupRequest.Type, this.HandleAddServerGroupRequest, true); + serviceHost.SetRequestHandler(RemoveServerGroupRequest.Type, this.HandleRemoveServerGroupRequest, true); } public async Task HandleCreateCentralManagementServerRequest(CreateCentralManagementServerParams createCmsParams, RequestContext requestContext) diff --git a/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs b/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs index 0521326f..d485ca97 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Connection/ConnectionService.cs @@ -1059,14 +1059,14 @@ namespace Microsoft.SqlTools.ServiceLayer.Connection this.ServiceHost = serviceHost; // Register request and event handlers with the Service Host - serviceHost.SetRequestHandler(ConnectionRequest.Type, HandleConnectRequest); - serviceHost.SetRequestHandler(CancelConnectRequest.Type, HandleCancelConnectRequest); - serviceHost.SetRequestHandler(ChangePasswordRequest.Type, HandleChangePasswordRequest); - serviceHost.SetRequestHandler(DisconnectRequest.Type, HandleDisconnectRequest); - serviceHost.SetRequestHandler(ListDatabasesRequest.Type, HandleListDatabasesRequest); - serviceHost.SetRequestHandler(ChangeDatabaseRequest.Type, HandleChangeDatabaseRequest); - serviceHost.SetRequestHandler(GetConnectionStringRequest.Type, HandleGetConnectionStringRequest); - serviceHost.SetRequestHandler(BuildConnectionInfoRequest.Type, HandleBuildConnectionInfoRequest); + serviceHost.SetRequestHandler(ConnectionRequest.Type, HandleConnectRequest, true); + serviceHost.SetRequestHandler(CancelConnectRequest.Type, HandleCancelConnectRequest, true); + serviceHost.SetRequestHandler(ChangePasswordRequest.Type, HandleChangePasswordRequest, true); + serviceHost.SetRequestHandler(DisconnectRequest.Type, HandleDisconnectRequest, true); + serviceHost.SetRequestHandler(ListDatabasesRequest.Type, HandleListDatabasesRequest, true); + serviceHost.SetRequestHandler(ChangeDatabaseRequest.Type, HandleChangeDatabaseRequest, true); + serviceHost.SetRequestHandler(GetConnectionStringRequest.Type, HandleGetConnectionStringRequest, true); + serviceHost.SetRequestHandler(BuildConnectionInfoRequest.Type, HandleBuildConnectionInfoRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/DacFx/DacFxService.cs b/src/Microsoft.SqlTools.ServiceLayer/DacFx/DacFxService.cs index ecb90d98..7b9a334a 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DacFx/DacFxService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DacFx/DacFxService.cs @@ -46,18 +46,18 @@ namespace Microsoft.SqlTools.ServiceLayer.DacFx /// public void InitializeService(ServiceHost serviceHost) { - serviceHost.SetRequestHandler(ExportRequest.Type, this.HandleExportRequest); - serviceHost.SetRequestHandler(ImportRequest.Type, this.HandleImportRequest); - serviceHost.SetRequestHandler(ExtractRequest.Type, this.HandleExtractRequest); - serviceHost.SetRequestHandler(DeployRequest.Type, this.HandleDeployRequest); - serviceHost.SetRequestHandler(GenerateDeployScriptRequest.Type, this.HandleGenerateDeployScriptRequest); - serviceHost.SetRequestHandler(GenerateDeployPlanRequest.Type, this.HandleGenerateDeployPlanRequest); - serviceHost.SetRequestHandler(GetOptionsFromProfileRequest.Type, this.HandleGetOptionsFromProfileRequest); - serviceHost.SetRequestHandler(ValidateStreamingJobRequest.Type, this.HandleValidateStreamingJobRequest); - serviceHost.SetRequestHandler(GetDefaultPublishOptionsRequest.Type, this.HandleGetDefaultPublishOptionsRequest); - serviceHost.SetRequestHandler(ParseTSqlScriptRequest.Type, this.HandleParseTSqlScriptRequest); - serviceHost.SetRequestHandler(GenerateTSqlModelRequest.Type, this.HandleGenerateTSqlModelRequest); - serviceHost.SetRequestHandler(GetObjectsFromTSqlModelRequest.Type, this.HandleGetObjectsFromTSqlModelRequest); + serviceHost.SetRequestHandler(ExportRequest.Type, this.HandleExportRequest, true); + serviceHost.SetRequestHandler(ImportRequest.Type, this.HandleImportRequest, true); + serviceHost.SetRequestHandler(ExtractRequest.Type, this.HandleExtractRequest, true); + serviceHost.SetRequestHandler(DeployRequest.Type, this.HandleDeployRequest, true); + serviceHost.SetRequestHandler(GenerateDeployScriptRequest.Type, this.HandleGenerateDeployScriptRequest, true); + serviceHost.SetRequestHandler(GenerateDeployPlanRequest.Type, this.HandleGenerateDeployPlanRequest, true); + serviceHost.SetRequestHandler(GetOptionsFromProfileRequest.Type, this.HandleGetOptionsFromProfileRequest, true); + serviceHost.SetRequestHandler(ValidateStreamingJobRequest.Type, this.HandleValidateStreamingJobRequest, true); + serviceHost.SetRequestHandler(GetDefaultPublishOptionsRequest.Type, this.HandleGetDefaultPublishOptionsRequest, true); + serviceHost.SetRequestHandler(ParseTSqlScriptRequest.Type, this.HandleParseTSqlScriptRequest, true); + serviceHost.SetRequestHandler(GenerateTSqlModelRequest.Type, this.HandleGenerateTSqlModelRequest, true); + serviceHost.SetRequestHandler(GetObjectsFromTSqlModelRequest.Type, this.HandleGetObjectsFromTSqlModelRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryService.cs b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryService.cs index cd878255..be5db0b8 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/DisasterRecovery/DisasterRecoveryService.cs @@ -96,22 +96,22 @@ namespace Microsoft.SqlTools.ServiceLayer.DisasterRecovery public void InitializeService(IProtocolEndpoint serviceHost) { // Get database info - serviceHost.SetRequestHandler(BackupConfigInfoRequest.Type, HandleBackupConfigInfoRequest); + serviceHost.SetRequestHandler(BackupConfigInfoRequest.Type, HandleBackupConfigInfoRequest, true); // Create backup - serviceHost.SetRequestHandler(BackupRequest.Type, HandleBackupRequest); + serviceHost.SetRequestHandler(BackupRequest.Type, HandleBackupRequest, true); // Create restore task - serviceHost.SetRequestHandler(RestoreRequest.Type, HandleRestoreRequest); + serviceHost.SetRequestHandler(RestoreRequest.Type, HandleRestoreRequest, true); // Create restore plan - serviceHost.SetRequestHandler(RestorePlanRequest.Type, HandleRestorePlanRequest); + serviceHost.SetRequestHandler(RestorePlanRequest.Type, HandleRestorePlanRequest, true); // Cancel restore plan - serviceHost.SetRequestHandler(CancelRestorePlanRequest.Type, HandleCancelRestorePlanRequest); + serviceHost.SetRequestHandler(CancelRestorePlanRequest.Type, HandleCancelRestorePlanRequest, true); // Create restore config - serviceHost.SetRequestHandler(RestoreConfigInfoRequest.Type, HandleRestoreConfigInfoRequest); + serviceHost.SetRequestHandler(RestoreConfigInfoRequest.Type, HandleRestoreConfigInfoRequest, true); // Register file path validation callbacks FileBrowserServiceInstance.RegisterValidatePathsCallback(FileValidationServiceConstants.Backup, DisasterRecoveryFileValidator.ValidatePaths); diff --git a/src/Microsoft.SqlTools.ServiceLayer/EditData/EditDataService.cs b/src/Microsoft.SqlTools.ServiceLayer/EditData/EditDataService.cs index e935cf43..a28ac29e 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/EditData/EditDataService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/EditData/EditDataService.cs @@ -75,15 +75,15 @@ namespace Microsoft.SqlTools.ServiceLayer.EditData public void InitializeService(ServiceHost serviceHost) { // Register handlers for requests - serviceHost.SetRequestHandler(EditCreateRowRequest.Type, HandleCreateRowRequest); - serviceHost.SetRequestHandler(EditDeleteRowRequest.Type, HandleDeleteRowRequest); - serviceHost.SetRequestHandler(EditDisposeRequest.Type, HandleDisposeRequest); - serviceHost.SetRequestHandler(EditInitializeRequest.Type, HandleInitializeRequest); - serviceHost.SetRequestHandler(EditRevertCellRequest.Type, HandleRevertCellRequest); - serviceHost.SetRequestHandler(EditRevertRowRequest.Type, HandleRevertRowRequest); - serviceHost.SetRequestHandler(EditSubsetRequest.Type, HandleSubsetRequest); - serviceHost.SetRequestHandler(EditUpdateCellRequest.Type, HandleUpdateCellRequest); - serviceHost.SetRequestHandler(EditCommitRequest.Type, HandleCommitRequest); + serviceHost.SetRequestHandler(EditCreateRowRequest.Type, HandleCreateRowRequest, true); + serviceHost.SetRequestHandler(EditDeleteRowRequest.Type, HandleDeleteRowRequest, true); + serviceHost.SetRequestHandler(EditDisposeRequest.Type, HandleDisposeRequest, true); + serviceHost.SetRequestHandler(EditInitializeRequest.Type, HandleInitializeRequest, true); + serviceHost.SetRequestHandler(EditRevertCellRequest.Type, HandleRevertCellRequest, true); + serviceHost.SetRequestHandler(EditRevertRowRequest.Type, HandleRevertRowRequest, true); + serviceHost.SetRequestHandler(EditSubsetRequest.Type, HandleSubsetRequest, true); + serviceHost.SetRequestHandler(EditUpdateCellRequest.Type, HandleUpdateCellRequest, true); + serviceHost.SetRequestHandler(EditCommitRequest.Type, HandleCommitRequest, true); } #region Request Handlers diff --git a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ExecutionPlanService.cs b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ExecutionPlanService.cs index aba8e3f5..eb9880ea 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ExecutionPlanService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ExecutionPlan/ExecutionPlanService.cs @@ -49,8 +49,8 @@ namespace Microsoft.SqlTools.ServiceLayer.ExecutionPlan public void InitializeService(ServiceHost serviceHost) { ServiceHost = serviceHost; - ServiceHost.SetRequestHandler(GetExecutionPlanRequest.Type, HandleGetExecutionPlan); - ServiceHost.SetRequestHandler(ExecutionPlanComparisonRequest.Type, HandleExecutionPlanComparisonRequest); + ServiceHost.SetRequestHandler(GetExecutionPlanRequest.Type, HandleGetExecutionPlan, true); + ServiceHost.SetRequestHandler(ExecutionPlanComparisonRequest.Type, HandleExecutionPlanComparisonRequest, true); } private async Task HandleGetExecutionPlan(GetExecutionPlanParams requestParams, RequestContext requestContext) diff --git a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs index 5994ddd1..b5cc8763 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/FileBrowser/FileBrowserService.cs @@ -73,16 +73,16 @@ namespace Microsoft.SqlTools.ServiceLayer.FileBrowser public void InitializeService(ServiceHost serviceHost) { // Open a file browser - serviceHost.SetRequestHandler(FileBrowserOpenRequest.Type, HandleFileBrowserOpenRequest); + serviceHost.SetRequestHandler(FileBrowserOpenRequest.Type, HandleFileBrowserOpenRequest, true); // Expand a folder node - serviceHost.SetRequestHandler(FileBrowserExpandRequest.Type, HandleFileBrowserExpandRequest); + serviceHost.SetRequestHandler(FileBrowserExpandRequest.Type, HandleFileBrowserExpandRequest, true); // Validate the selected files - serviceHost.SetRequestHandler(FileBrowserValidateRequest.Type, HandleFileBrowserValidateRequest); + serviceHost.SetRequestHandler(FileBrowserValidateRequest.Type, HandleFileBrowserValidateRequest, true); // Close the file browser - serviceHost.SetRequestHandler(FileBrowserCloseRequest.Type, HandleFileBrowserCloseRequest); + serviceHost.SetRequestHandler(FileBrowserCloseRequest.Type, HandleFileBrowserCloseRequest, true); } #region request handlers diff --git a/src/Microsoft.SqlTools.ServiceLayer/Formatter/TSqlFormatterService.cs b/src/Microsoft.SqlTools.ServiceLayer/Formatter/TSqlFormatterService.cs index 23c60c08..eff525e5 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Formatter/TSqlFormatterService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Formatter/TSqlFormatterService.cs @@ -42,8 +42,8 @@ namespace Microsoft.SqlTools.ServiceLayer.Formatter public override void InitializeService(IProtocolEndpoint serviceHost) { Logger.Write(TraceEventType.Verbose, "TSqlFormatter initialized"); - serviceHost.SetRequestHandler(DocumentFormattingRequest.Type, HandleDocFormatRequest); - serviceHost.SetRequestHandler(DocumentRangeFormattingRequest.Type, HandleDocRangeFormatRequest); + serviceHost.SetRequestHandler(DocumentFormattingRequest.Type, HandleDocFormatRequest, true); + serviceHost.SetRequestHandler(DocumentRangeFormattingRequest.Type, HandleDocRangeFormatRequest, true); WorkspaceService?.RegisterConfigChangeCallback(HandleDidChangeConfigurationNotification); } diff --git a/src/Microsoft.SqlTools.ServiceLayer/LanguageExtensibility/ExternalLanguageService.cs b/src/Microsoft.SqlTools.ServiceLayer/LanguageExtensibility/ExternalLanguageService.cs index 5763466b..4c15c676 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/LanguageExtensibility/ExternalLanguageService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/LanguageExtensibility/ExternalLanguageService.cs @@ -60,10 +60,10 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageExtensibility public void InitializeService(ServiceHost serviceHost) { - serviceHost.SetRequestHandler(ExternalLanguageStatusRequest.Type, this.HandleExternalLanguageStatusRequest); - serviceHost.SetRequestHandler(ExternalLanguageListRequest.Type, this.HandleExternalLanguageListRequest); - serviceHost.SetRequestHandler(ExternalLanguageDeleteRequest.Type, this.HandleExternalLanguageDeleteRequest); - serviceHost.SetRequestHandler(ExternalLanguageUpdateRequest.Type, this.HandleExternalLanguageUpdateRequest); + serviceHost.SetRequestHandler(ExternalLanguageStatusRequest.Type, this.HandleExternalLanguageStatusRequest, true); + serviceHost.SetRequestHandler(ExternalLanguageListRequest.Type, this.HandleExternalLanguageListRequest, true); + serviceHost.SetRequestHandler(ExternalLanguageDeleteRequest.Type, this.HandleExternalLanguageDeleteRequest, true); + serviceHost.SetRequestHandler(ExternalLanguageUpdateRequest.Type, this.HandleExternalLanguageUpdateRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs b/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs index 30df39ea..b3215de2 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs @@ -252,6 +252,7 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices // serviceHost.SetRequestHandler(ReferencesRequest.Type, HandleReferencesRequest); // serviceHost.SetRequestHandler(DocumentHighlightRequest.Type, HandleDocumentHighlightRequest); + // Not enabling parallel processing for LanguageService as message order might matter. serviceHost.SetRequestHandler(SignatureHelpRequest.Type, HandleSignatureHelpRequest); serviceHost.SetRequestHandler(CompletionResolveRequest.Type, HandleCompletionResolveRequest); serviceHost.SetRequestHandler(HoverRequest.Type, HandleHoverRequest); diff --git a/src/Microsoft.SqlTools.ServiceLayer/Metadata/MetadataService.cs b/src/Microsoft.SqlTools.ServiceLayer/Metadata/MetadataService.cs index 4fac243b..92e23bda 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Metadata/MetadataService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Metadata/MetadataService.cs @@ -50,9 +50,9 @@ namespace Microsoft.SqlTools.ServiceLayer.Metadata /// public void InitializeService(ServiceHost serviceHost) { - serviceHost.SetRequestHandler(MetadataListRequest.Type, HandleMetadataListRequest); - serviceHost.SetRequestHandler(TableMetadataRequest.Type, HandleGetTableRequest); - serviceHost.SetRequestHandler(ViewMetadataRequest.Type, HandleGetViewRequest); + serviceHost.SetRequestHandler(MetadataListRequest.Type, HandleMetadataListRequest, true); + serviceHost.SetRequestHandler(TableMetadataRequest.Type, HandleGetTableRequest, true); + serviceHost.SetRequestHandler(ViewMetadataRequest.Type, HandleGetViewRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/Migration/MigrationService.cs b/src/Microsoft.SqlTools.ServiceLayer/Migration/MigrationService.cs index 1afb7fcd..4f6c1f1b 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Migration/MigrationService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Migration/MigrationService.cs @@ -121,16 +121,16 @@ namespace Microsoft.SqlTools.ServiceLayer.Migration public void InitializeService(ServiceHost serviceHost) { this.ServiceHost = serviceHost; - this.ServiceHost.SetRequestHandler(MigrationAssessmentsRequest.Type, HandleMigrationAssessmentsRequest); - this.ServiceHost.SetRequestHandler(StartPerfDataCollectionRequest.Type, HandleStartPerfDataCollectionRequest); - this.ServiceHost.SetRequestHandler(StopPerfDataCollectionRequest.Type, HandleStopPerfDataCollectionRequest); - this.ServiceHost.SetRequestHandler(RefreshPerfDataCollectionRequest.Type, HandleRefreshPerfDataCollectionRequest); - this.ServiceHost.SetRequestHandler(GetSkuRecommendationsRequest.Type, HandleGetSkuRecommendationsRequest); - this.ServiceHost.SetRequestHandler(StartLoginMigrationRequest.Type, HandleStartLoginMigration); - this.ServiceHost.SetRequestHandler(ValidateLoginMigrationRequest.Type, HandleValidateLoginMigration); - this.ServiceHost.SetRequestHandler(MigrateLoginsRequest.Type, HandleMigrateLogins); - this.ServiceHost.SetRequestHandler(EstablishUserMappingRequest.Type, HandleEstablishUserMapping); - this.ServiceHost.SetRequestHandler(MigrateServerRolesAndSetPermissionsRequest.Type, HandleMigrateServerRolesAndSetPermissions); + this.ServiceHost.SetRequestHandler(MigrationAssessmentsRequest.Type, HandleMigrationAssessmentsRequest, true); + this.ServiceHost.SetRequestHandler(StartPerfDataCollectionRequest.Type, HandleStartPerfDataCollectionRequest, true); + this.ServiceHost.SetRequestHandler(StopPerfDataCollectionRequest.Type, HandleStopPerfDataCollectionRequest, true); + this.ServiceHost.SetRequestHandler(RefreshPerfDataCollectionRequest.Type, HandleRefreshPerfDataCollectionRequest, true); + this.ServiceHost.SetRequestHandler(GetSkuRecommendationsRequest.Type, HandleGetSkuRecommendationsRequest, true); + this.ServiceHost.SetRequestHandler(StartLoginMigrationRequest.Type, HandleStartLoginMigration, true); + this.ServiceHost.SetRequestHandler(ValidateLoginMigrationRequest.Type, HandleValidateLoginMigration, true); + this.ServiceHost.SetRequestHandler(MigrateLoginsRequest.Type, HandleMigrateLogins, true); + this.ServiceHost.SetRequestHandler(EstablishUserMappingRequest.Type, HandleEstablishUserMapping, true); + this.ServiceHost.SetRequestHandler(MigrateServerRolesAndSetPermissionsRequest.Type, HandleMigrateServerRolesAndSetPermissions, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/ModelManagement/ModelManagementService.cs b/src/Microsoft.SqlTools.ServiceLayer/ModelManagement/ModelManagementService.cs index 4ceec814..7d77d07a 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ModelManagement/ModelManagementService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ModelManagement/ModelManagementService.cs @@ -62,13 +62,13 @@ namespace Microsoft.SqlTools.ServiceLayer.ModelManagement public void InitializeService(ServiceHost serviceHost) { - serviceHost.SetRequestHandler(ImportModelRequest.Type, this.HandleModelImportRequest); - serviceHost.SetRequestHandler(ConfigureModelTableRequest.Type, this.HandleConfigureModelTableRequest); - serviceHost.SetRequestHandler(DeleteModelRequest.Type, this.HandleDeleteModelRequest); - serviceHost.SetRequestHandler(DownloadModelRequest.Type, this.HandleDownloadModelRequest); - serviceHost.SetRequestHandler(GetModelsRequest.Type, this.HandleGetModelsRequest); - serviceHost.SetRequestHandler(UpdateModelRequest.Type, this.HandleUpdateModelRequest); - serviceHost.SetRequestHandler(VerifyModelTableRequest.Type, this.HandleVerifyModelTableRequest); + serviceHost.SetRequestHandler(ImportModelRequest.Type, this.HandleModelImportRequest, true); + serviceHost.SetRequestHandler(ConfigureModelTableRequest.Type, this.HandleConfigureModelTableRequest, true); + serviceHost.SetRequestHandler(DeleteModelRequest.Type, this.HandleDeleteModelRequest, true); + serviceHost.SetRequestHandler(DownloadModelRequest.Type, this.HandleDownloadModelRequest, true); + serviceHost.SetRequestHandler(GetModelsRequest.Type, this.HandleGetModelsRequest, true); + serviceHost.SetRequestHandler(UpdateModelRequest.Type, this.HandleUpdateModelRequest, true); + serviceHost.SetRequestHandler(VerifyModelTableRequest.Type, this.HandleVerifyModelTableRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/NotebookConvertService.cs b/src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/NotebookConvertService.cs index cbc72119..0cf417c5 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/NotebookConvertService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/NotebookConvert/NotebookConvertService.cs @@ -66,8 +66,8 @@ namespace Microsoft.SqlTools.ServiceLayer.NotebookConvert { this.ServiceHost = serviceHost; - this.ServiceHost.SetRequestHandler(ConvertNotebookToSqlRequest.Type, HandleConvertNotebookToSqlRequest); - this.ServiceHost.SetRequestHandler(ConvertSqlToNotebookRequest.Type, HandleConvertSqlToNotebookRequest); + this.ServiceHost.SetRequestHandler(ConvertNotebookToSqlRequest.Type, HandleConvertNotebookToSqlRequest, true); + this.ServiceHost.SetRequestHandler(ConvertSqlToNotebookRequest.Type, HandleConvertSqlToNotebookRequest, true); } diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs index 678df5cc..00da316c 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectExplorer/ObjectExplorerService.cs @@ -128,6 +128,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectExplorer this.ConnectedBindingQueue.OnUnhandledException += OnUnhandledException; + // Not enabling parallel processing for OEService as it might cause OE to hang. // Register handlers for requests serviceHost.SetRequestHandler(CreateSessionRequest.Type, HandleCreateSessionRequest); serviceHost.SetRequestHandler(ExpandRequest.Type, HandleExpandRequest); diff --git a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectManagementService.cs b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectManagementService.cs index 0fd44f9d..fb36589a 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectManagementService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ObjectManagement/ObjectManagementService.cs @@ -46,7 +46,7 @@ namespace Microsoft.SqlTools.ServiceLayer.ObjectManagement public void InitializeService(IProtocolEndpoint serviceHost) { this.serviceHost = serviceHost; - this.serviceHost.SetRequestHandler(RenameRequest.Type, HandleRenameRequest); + this.serviceHost.SetRequestHandler(RenameRequest.Type, HandleRenameRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/Profiler/ProfilerService.cs b/src/Microsoft.SqlTools.ServiceLayer/Profiler/ProfilerService.cs index 6a345da2..56d1b9c6 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Profiler/ProfilerService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Profiler/ProfilerService.cs @@ -97,12 +97,12 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler public void InitializeService(ServiceHost serviceHost) { this.ServiceHost = serviceHost; - this.ServiceHost.SetRequestHandler(CreateXEventSessionRequest.Type, HandleCreateXEventSessionRequest); - this.ServiceHost.SetRequestHandler(StartProfilingRequest.Type, HandleStartProfilingRequest); - this.ServiceHost.SetRequestHandler(StopProfilingRequest.Type, HandleStopProfilingRequest); - this.ServiceHost.SetRequestHandler(PauseProfilingRequest.Type, HandlePauseProfilingRequest); - this.ServiceHost.SetRequestHandler(GetXEventSessionsRequest.Type, HandleGetXEventSessionsRequest); - this.ServiceHost.SetRequestHandler(DisconnectSessionRequest.Type, HandleDisconnectSessionRequest); + this.ServiceHost.SetRequestHandler(CreateXEventSessionRequest.Type, HandleCreateXEventSessionRequest, true); + this.ServiceHost.SetRequestHandler(StartProfilingRequest.Type, HandleStartProfilingRequest, true); + this.ServiceHost.SetRequestHandler(StopProfilingRequest.Type, HandleStopProfilingRequest, true); + this.ServiceHost.SetRequestHandler(PauseProfilingRequest.Type, HandlePauseProfilingRequest, true); + this.ServiceHost.SetRequestHandler(GetXEventSessionsRequest.Type, HandleGetXEventSessionsRequest, true); + this.ServiceHost.SetRequestHandler(DisconnectSessionRequest.Type, HandleDisconnectSessionRequest, true); this.SessionMonitor.AddSessionListener(this); } diff --git a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/QueryExecutionService.cs b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/QueryExecutionService.cs index 84c495a9..3b9ae89c 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/QueryExecutionService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/QueryExecutionService.cs @@ -170,21 +170,21 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution public void InitializeService(ServiceHost serviceHost) { // Register handlers for requests - serviceHost.SetRequestHandler(ExecuteDocumentSelectionRequest.Type, HandleExecuteRequest); - serviceHost.SetRequestHandler(ExecuteDocumentStatementRequest.Type, HandleExecuteRequest); - serviceHost.SetRequestHandler(ExecuteStringRequest.Type, HandleExecuteRequest); - serviceHost.SetRequestHandler(SubsetRequest.Type, HandleResultSubsetRequest); - serviceHost.SetRequestHandler(QueryDisposeRequest.Type, HandleDisposeRequest); - serviceHost.SetRequestHandler(QueryCancelRequest.Type, HandleCancelRequest); + serviceHost.SetRequestHandler(ExecuteDocumentSelectionRequest.Type, HandleExecuteRequest, true); + serviceHost.SetRequestHandler(ExecuteDocumentStatementRequest.Type, HandleExecuteRequest, true); + serviceHost.SetRequestHandler(ExecuteStringRequest.Type, HandleExecuteRequest, true); + serviceHost.SetRequestHandler(SubsetRequest.Type, HandleResultSubsetRequest, true); + serviceHost.SetRequestHandler(QueryDisposeRequest.Type, HandleDisposeRequest, true); + serviceHost.SetRequestHandler(QueryCancelRequest.Type, HandleCancelRequest, true); serviceHost.SetEventHandler(ConnectionUriChangedNotification.Type, HandleConnectionUriChangedNotification); - serviceHost.SetRequestHandler(SaveResultsAsCsvRequest.Type, HandleSaveResultsAsCsvRequest); - serviceHost.SetRequestHandler(SaveResultsAsExcelRequest.Type, HandleSaveResultsAsExcelRequest); - serviceHost.SetRequestHandler(SaveResultsAsJsonRequest.Type, HandleSaveResultsAsJsonRequest); - serviceHost.SetRequestHandler(SaveResultsAsMarkdownRequest.Type, this.HandleSaveResultsAsMarkdownRequest); - serviceHost.SetRequestHandler(SaveResultsAsXmlRequest.Type, HandleSaveResultsAsXmlRequest); - serviceHost.SetRequestHandler(QueryExecutionPlanRequest.Type, HandleExecutionPlanRequest); - serviceHost.SetRequestHandler(SimpleExecuteRequest.Type, HandleSimpleExecuteRequest); - serviceHost.SetRequestHandler(QueryExecutionOptionsRequest.Type, HandleQueryExecutionOptionsRequest); + serviceHost.SetRequestHandler(SaveResultsAsCsvRequest.Type, HandleSaveResultsAsCsvRequest, true); + serviceHost.SetRequestHandler(SaveResultsAsExcelRequest.Type, HandleSaveResultsAsExcelRequest, true); + serviceHost.SetRequestHandler(SaveResultsAsJsonRequest.Type, HandleSaveResultsAsJsonRequest, true); + serviceHost.SetRequestHandler(SaveResultsAsMarkdownRequest.Type, this.HandleSaveResultsAsMarkdownRequest, true); + serviceHost.SetRequestHandler(SaveResultsAsXmlRequest.Type, HandleSaveResultsAsXmlRequest, true); + serviceHost.SetRequestHandler(QueryExecutionPlanRequest.Type, HandleExecutionPlanRequest, true); + serviceHost.SetRequestHandler(SimpleExecuteRequest.Type, HandleSimpleExecuteRequest, true); + serviceHost.SetRequestHandler(QueryExecutionOptionsRequest.Type, HandleQueryExecutionOptionsRequest, true); // Register the file open update handler WorkspaceService.Instance.RegisterTextDocCloseCallback(HandleDidCloseTextDocumentNotification); diff --git a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/SerializationService.cs b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/SerializationService.cs index 56390cee..1622b491 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/SerializationService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/SerializationService.cs @@ -34,8 +34,8 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution public override void InitializeService(IProtocolEndpoint serviceHost) { Logger.Write(TraceEventType.Verbose, "SerializationService initialized"); - serviceHost.SetRequestHandler(SerializeStartRequest.Type, HandleSerializeStartRequest); - serviceHost.SetRequestHandler(SerializeContinueRequest.Type, HandleSerializeContinueRequest); + serviceHost.SetRequestHandler(SerializeStartRequest.Type, HandleSerializeStartRequest, true); + serviceHost.SetRequestHandler(SerializeContinueRequest.Type, HandleSerializeContinueRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs index a7290ee7..043d1c17 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs @@ -48,15 +48,15 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare /// public void InitializeService(ServiceHost serviceHost) { - serviceHost.SetRequestHandler(SchemaCompareRequest.Type, this.HandleSchemaCompareRequest); - serviceHost.SetRequestHandler(SchemaCompareCancellationRequest.Type, this.HandleSchemaCompareCancelRequest); - serviceHost.SetRequestHandler(SchemaCompareGenerateScriptRequest.Type, this.HandleSchemaCompareGenerateScriptRequest); - serviceHost.SetRequestHandler(SchemaComparePublishDatabaseChangesRequest.Type, this.HandleSchemaComparePublishDatabaseChangesRequest); - serviceHost.SetRequestHandler(SchemaComparePublishProjectChangesRequest.Type, this.HandleSchemaComparePublishProjectChangesRequest); - serviceHost.SetRequestHandler(SchemaCompareIncludeExcludeNodeRequest.Type, this.HandleSchemaCompareIncludeExcludeNodeRequest); - serviceHost.SetRequestHandler(SchemaCompareGetDefaultOptionsRequest.Type, this.HandleSchemaCompareGetDefaultOptionsRequest); - serviceHost.SetRequestHandler(SchemaCompareOpenScmpRequest.Type, this.HandleSchemaCompareOpenScmpRequest); - serviceHost.SetRequestHandler(SchemaCompareSaveScmpRequest.Type, this.HandleSchemaCompareSaveScmpRequest); + serviceHost.SetRequestHandler(SchemaCompareRequest.Type, this.HandleSchemaCompareRequest, true); + serviceHost.SetRequestHandler(SchemaCompareCancellationRequest.Type, this.HandleSchemaCompareCancelRequest, true); + serviceHost.SetRequestHandler(SchemaCompareGenerateScriptRequest.Type, this.HandleSchemaCompareGenerateScriptRequest, true); + serviceHost.SetRequestHandler(SchemaComparePublishDatabaseChangesRequest.Type, this.HandleSchemaComparePublishDatabaseChangesRequest, true); + serviceHost.SetRequestHandler(SchemaComparePublishProjectChangesRequest.Type, this.HandleSchemaComparePublishProjectChangesRequest, true); + serviceHost.SetRequestHandler(SchemaCompareIncludeExcludeNodeRequest.Type, this.HandleSchemaCompareIncludeExcludeNodeRequest, true); + serviceHost.SetRequestHandler(SchemaCompareGetDefaultOptionsRequest.Type, this.HandleSchemaCompareGetDefaultOptionsRequest, true); + serviceHost.SetRequestHandler(SchemaCompareOpenScmpRequest.Type, this.HandleSchemaCompareOpenScmpRequest, true); + serviceHost.SetRequestHandler(SchemaCompareSaveScmpRequest.Type, this.HandleSchemaCompareSaveScmpRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/Scripting/ScriptingService.cs b/src/Microsoft.SqlTools.ServiceLayer/Scripting/ScriptingService.cs index 58d332df..e4ba93cf 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Scripting/ScriptingService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Scripting/ScriptingService.cs @@ -65,9 +65,9 @@ namespace Microsoft.SqlTools.ServiceLayer.Scripting /// public void InitializeService(ServiceHost serviceHost) { - serviceHost.SetRequestHandler(ScriptingRequest.Type, this.HandleScriptExecuteRequest); - serviceHost.SetRequestHandler(ScriptingCancelRequest.Type, this.HandleScriptCancelRequest); - serviceHost.SetRequestHandler(ScriptingListObjectsRequest.Type, this.HandleListObjectsRequest); + serviceHost.SetRequestHandler(ScriptingRequest.Type, this.HandleScriptExecuteRequest, true); + serviceHost.SetRequestHandler(ScriptingCancelRequest.Type, this.HandleScriptCancelRequest, true); + serviceHost.SetRequestHandler(ScriptingListObjectsRequest.Type, this.HandleListObjectsRequest, true); // Register handler for shutdown event serviceHost.RegisterShutdownTask((shutdownParams, requestContext) => diff --git a/src/Microsoft.SqlTools.ServiceLayer/Security/SecurityService.cs b/src/Microsoft.SqlTools.ServiceLayer/Security/SecurityService.cs index dec38ad2..e83edc4b 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Security/SecurityService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Security/SecurityService.cs @@ -75,10 +75,10 @@ namespace Microsoft.SqlTools.ServiceLayer.Security this.ServiceHost = serviceHost; // Credential request handlers - this.ServiceHost.SetRequestHandler(CreateCredentialRequest.Type, HandleCreateCredentialRequest); - this.ServiceHost.SetRequestHandler(UpdateCredentialRequest.Type, HandleUpdateCredentialRequest); - this.ServiceHost.SetRequestHandler(DeleteCredentialRequest.Type, HandleDeleteCredentialRequest); - this.ServiceHost.SetRequestHandler(GetCredentialsRequest.Type, HandleGetCredentialsRequest); + this.ServiceHost.SetRequestHandler(CreateCredentialRequest.Type, HandleCreateCredentialRequest, true); + this.ServiceHost.SetRequestHandler(UpdateCredentialRequest.Type, HandleUpdateCredentialRequest, true); + this.ServiceHost.SetRequestHandler(DeleteCredentialRequest.Type, HandleDeleteCredentialRequest, true); + this.ServiceHost.SetRequestHandler(GetCredentialsRequest.Type, HandleGetCredentialsRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/ServerConfigurations/ServerConfigService.cs b/src/Microsoft.SqlTools.ServiceLayer/ServerConfigurations/ServerConfigService.cs index e0ec0ec4..be3a907f 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/ServerConfigurations/ServerConfigService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/ServerConfigurations/ServerConfigService.cs @@ -49,9 +49,9 @@ namespace Microsoft.SqlTools.ServiceLayer.ServerConfigurations public void InitializeService(ServiceHost serviceHost) { - serviceHost.SetRequestHandler(ServerConfigViewRequest.Type, this.HandleServerConfigViewRequest); - serviceHost.SetRequestHandler(ServerConfigUpdateRequest.Type, this.HandleServerConfigUpdateRequest); - serviceHost.SetRequestHandler(ServerConfigListRequest.Type, this.HandleServerConfigListRequest); + serviceHost.SetRequestHandler(ServerConfigViewRequest.Type, this.HandleServerConfigViewRequest, true); + serviceHost.SetRequestHandler(ServerConfigUpdateRequest.Type, this.HandleServerConfigUpdateRequest, true); + serviceHost.SetRequestHandler(ServerConfigListRequest.Type, this.HandleServerConfigListRequest, true); } /// diff --git a/src/Microsoft.SqlTools.ServiceLayer/SqlAssessment/SqlAssessmentService.cs b/src/Microsoft.SqlTools.ServiceLayer/SqlAssessment/SqlAssessmentService.cs index f5bc5d82..d6424a36 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/SqlAssessment/SqlAssessmentService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/SqlAssessment/SqlAssessmentService.cs @@ -102,9 +102,9 @@ namespace Microsoft.SqlTools.ServiceLayer.SqlAssessment public void InitializeService(ServiceHost serviceHost) { // Register handlers for requests - serviceHost.SetRequestHandler(InvokeRequest.Type, HandleInvokeRequest); - serviceHost.SetRequestHandler(GetAssessmentItemsRequest.Type, HandleGetAssessmentItemsRequest); - serviceHost.SetRequestHandler(GenerateScriptRequest.Type, HandleGenerateScriptRequest); + serviceHost.SetRequestHandler(InvokeRequest.Type, HandleInvokeRequest, true); + serviceHost.SetRequestHandler(GetAssessmentItemsRequest.Type, HandleGetAssessmentItemsRequest, true); + serviceHost.SetRequestHandler(GenerateScriptRequest.Type, HandleGenerateScriptRequest, true); // Register handler for shutdown event serviceHost.RegisterShutdownTask((shutdownParams, requestContext) => diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs index fd984918..c8893e56 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs @@ -58,12 +58,12 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner public void InitializeService(ServiceHost serviceHost) { this.ServiceHost = serviceHost; - this.ServiceHost.SetRequestHandler(InitializeTableDesignerRequest.Type, HandleInitializeTableDesignerRequest); - this.ServiceHost.SetRequestHandler(ProcessTableDesignerEditRequest.Type, HandleProcessTableDesignerEditRequest); - this.ServiceHost.SetRequestHandler(PublishTableChangesRequest.Type, HandlePublishTableChangesRequest); - this.ServiceHost.SetRequestHandler(GenerateScriptRequest.Type, HandleGenerateScriptRequest); - this.ServiceHost.SetRequestHandler(GeneratePreviewReportRequest.Type, HandleGeneratePreviewReportRequest); - this.ServiceHost.SetRequestHandler(DisposeTableDesignerRequest.Type, HandleDisposeTableDesignerRequest); + this.ServiceHost.SetRequestHandler(InitializeTableDesignerRequest.Type, HandleInitializeTableDesignerRequest, true); + this.ServiceHost.SetRequestHandler(ProcessTableDesignerEditRequest.Type, HandleProcessTableDesignerEditRequest, true); + this.ServiceHost.SetRequestHandler(PublishTableChangesRequest.Type, HandlePublishTableChangesRequest, true); + this.ServiceHost.SetRequestHandler(GenerateScriptRequest.Type, HandleGenerateScriptRequest, true); + this.ServiceHost.SetRequestHandler(GeneratePreviewReportRequest.Type, HandleGeneratePreviewReportRequest, true); + this.ServiceHost.SetRequestHandler(DisposeTableDesignerRequest.Type, HandleDisposeTableDesignerRequest, true); Workspace.WorkspaceService.Instance.RegisterConfigChangeCallback(UpdateSettings); } diff --git a/src/Microsoft.SqlTools.ServiceLayer/TaskServices/TaskService.cs b/src/Microsoft.SqlTools.ServiceLayer/TaskServices/TaskService.cs index 2e52ea9a..e57f0464 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TaskServices/TaskService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TaskServices/TaskService.cs @@ -52,8 +52,8 @@ namespace Microsoft.SqlTools.ServiceLayer.TaskServices { this.serviceHost = serviceHost; Logger.Write(TraceEventType.Verbose, "TaskService initialized"); - serviceHost.SetRequestHandler(ListTasksRequest.Type, HandleListTasksRequest); - serviceHost.SetRequestHandler(CancelTaskRequest.Type, HandleCancelTaskRequest); + serviceHost.SetRequestHandler(ListTasksRequest.Type, HandleListTasksRequest, true); + serviceHost.SetRequestHandler(CancelTaskRequest.Type, HandleCancelTaskRequest, true); TaskManager.TaskAdded += OnTaskAdded; } diff --git a/src/Microsoft.SqlTools.ServiceLayer/Workspace/WorkspaceService.cs b/src/Microsoft.SqlTools.ServiceLayer/Workspace/WorkspaceService.cs index 773803f9..b3d5aacb 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Workspace/WorkspaceService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Workspace/WorkspaceService.cs @@ -127,6 +127,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Workspace // Create a workspace that will handle state for the session Workspace = new Workspace(); + // Not enabling parallel processing for WorkspaceService as it might cause doc out of sync. // Register the handlers for when changes to the workspae occur serviceHost.SetEventHandler(DidChangeTextDocumentNotification.Type, HandleDidChangeTextDocumentNotification); serviceHost.SetEventHandler(DidOpenTextDocumentNotification.Type, HandleDidOpenTextDocumentNotification); diff --git a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/Messaging/MessageDispatcherTests.cs b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/Messaging/MessageDispatcherTests.cs index bb748bf9..e1d6e304 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.UnitTests/Messaging/MessageDispatcherTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.UnitTests/Messaging/MessageDispatcherTests.cs @@ -4,6 +4,8 @@ // using System; +using System.Diagnostics; +using System.Threading; using System.Threading.Tasks; using Microsoft.SqlTools.Hosting.Protocol; using Microsoft.SqlTools.Hosting.Protocol.Channel; @@ -84,5 +86,70 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Messaging Assert.True(handlerCalled); } } + + [Test] + public void ParallelMessageProcessingTest() + { + int numOfRequests = 10; + int msForEachRequest = 1000; + // Without parallel processing, this should take around numOfRequests * msForEachRequest ms to finish. + // With parallel process, this should take around 1 * msForEachRequest ms to finish. + // The diff should be around (numOfRequests - 1) * msForEachRequest ms. + // In order to make this test stable, we loose the assertion by checking the diff against + // (numOfRequests / 2) * msForEachRequest ms, which should for sure pass. + Assert.IsTrue(GetTimeToHandleRequests(false, numOfRequests, msForEachRequest) - GetTimeToHandleRequests(true, numOfRequests, msForEachRequest) > msForEachRequest * (numOfRequests / 2)); + } + + + /// + /// Gets the time to handle certain amount of requests in ms + /// + /// Wheater to enable parallel processing + /// num of requests to handle + /// rough time taken to finish each reqeust in ms + /// + private long GetTimeToHandleRequests(bool parallelMessageProcessing, int numOfRequests, int msForEachRequest) + { + RequestType requestType = RequestType.Create("test/requestType"); + var mockChannel = new Mock(); + SemaphoreSlim unfinishedRequestCount = new SemaphoreSlim(numOfRequests); + bool okayToEnd = false; + mockChannel.Setup(c => c.MessageReader.ReadMessage()) + .Returns(Task.FromResult(Message.Request("1", "test/requestType", null))); + var dispatcher = new MessageDispatcher(mockChannel.Object); + dispatcher.ParallelMessageProcessing = parallelMessageProcessing; + Stopwatch stopwatch = Stopwatch.StartNew(); + var handler = async (int _, RequestContext _) => + { + // simulate a slow sync call + Thread.Sleep(msForEachRequest / 2); + // simulate a delay async call + await Task.Delay(msForEachRequest / 2); + await unfinishedRequestCount.WaitAsync(); + if (unfinishedRequestCount.CurrentCount == 0) + { + // cut off when we reach numOfRequests + stopwatch.Stop(); + okayToEnd = true; + } + await Task.CompletedTask; + }; + + dispatcher.SetRequestHandler(requestType, handler, false, true); + dispatcher.Start(); + + while (true) + { + if (okayToEnd) + { + // wait until we finish handling the required amount of requests + break; + } + Thread.Sleep(1000); + } + + dispatcher.Stop(); + return stopwatch.ElapsedMilliseconds; + } } } \ No newline at end of file