add a flag to make message processing parallel (#1482)

* add a flag to make message processing parallel

* use discard

* add comment
This commit is contained in:
Alan Ren
2022-05-05 14:44:58 -07:00
committed by GitHub
parent b7360ea17f
commit a7e6eca9e3
4 changed files with 51 additions and 18 deletions

View File

@@ -57,6 +57,12 @@ namespace Microsoft.SqlTools.Hosting.Protocol
protected MessageWriter MessageWriter { get; private set; } protected MessageWriter MessageWriter { get; private set; }
/// <summary>
/// Whether the message should be handled without blocking the main thread.
/// </summary>
public bool ParallelMessageProcessing { get; set; }
#endregion #endregion
#region Constructors #region Constructors
@@ -305,22 +311,39 @@ namespace Microsoft.SqlTools.Hosting.Protocol
if (handlerToAwait != null) if (handlerToAwait != null)
{ {
try if (this.ParallelMessageProcessing)
{ {
await handlerToAwait; // Run the task in a separate thread so that the main
} // thread is not blocked.
catch (TaskCanceledException) _ = Task.Run(() =>
{
// 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))
{ {
// Log the error but don't rethrow it to prevent any errors in the handler from crashing the service _ = RunTask(handlerToAwait);
Logger.Write(TraceEventType.Error, string.Format("An unexpected error occured in the request handler: {0}", e.ToString())); });
} }
else
{
await RunTask(handlerToAwait);
}
}
}
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))
{
// 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()));
} }
} }
} }

View File

@@ -44,7 +44,7 @@ namespace Microsoft.SqlTools.Hosting.Protocol
/// handlers for requests, responses, and events that are /// handlers for requests, responses, and events that are
/// transmitted through the channel. /// transmitted through the channel.
/// </summary> /// </summary>
protected MessageDispatcher MessageDispatcher { get; set; } internal MessageDispatcher MessageDispatcher { get; set; }
/// <summary> /// <summary>
/// Initializes an instance of the protocol server using the /// Initializes an instance of the protocol server using the

View File

@@ -63,6 +63,9 @@ namespace Microsoft.SqlTools.Hosting.Utility
case "-service-name": case "-service-name":
ServiceName = args[++i]; ServiceName = args[++i];
break; break;
case "-parallel-message-processing":
ParallelMessageProcessing = true;
break;
default: default:
ErrorMessage += string.Format("Unknown argument \"{0}\"" + Environment.NewLine, argName); ErrorMessage += string.Format("Unknown argument \"{0}\"" + Environment.NewLine, argName);
break; break;
@@ -131,6 +134,12 @@ namespace Microsoft.SqlTools.Hosting.Utility
public bool AutoFlushLog { get; private set; } = false; public bool AutoFlushLog { get; private set; } = false;
/// <summary>
/// A temporary flag to decide whether the message handling should block the main thread.
/// Eventually we will fix the issues and make this the default behavior.
/// </summary>
public bool ParallelMessageProcessing { get; private set; } = false;
public virtual void SetLocale(string locale) public virtual void SetLocale(string locale)
{ {
try try
@@ -155,7 +164,7 @@ namespace Microsoft.SqlTools.Hosting.Utility
// Creating cultureInfo from our given locale // Creating cultureInfo from our given locale
CultureInfo language = new CultureInfo(locale); CultureInfo language = new CultureInfo(locale);
Locale = locale; Locale = locale;
// Allow the system set Number Format and Date Format to be preserved when changing the locale. // Allow the system set Number Format and Date Format to be preserved when changing the locale.
NumberFormatInfo NumberFormat = CultureInfo.CurrentCulture.NumberFormat; NumberFormatInfo NumberFormat = CultureInfo.CurrentCulture.NumberFormat;
DateTimeFormatInfo DateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat; DateTimeFormatInfo DateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat;

View File

@@ -45,6 +45,7 @@ namespace Microsoft.SqlTools.ServiceLayer
SqlToolsContext sqlToolsContext = new SqlToolsContext(hostDetails); SqlToolsContext sqlToolsContext = new SqlToolsContext(hostDetails);
ServiceHost serviceHost = HostLoader.CreateAndStartServiceHost(sqlToolsContext); ServiceHost serviceHost = HostLoader.CreateAndStartServiceHost(sqlToolsContext);
serviceHost.MessageDispatcher.ParallelMessageProcessing = commandOptions.ParallelMessageProcessing;
// If this service was started by another process, then it should shutdown when that parent process does. // If this service was started by another process, then it should shutdown when that parent process does.
if (commandOptions.ParentProcessId != null) if (commandOptions.ParentProcessId != null)
@@ -58,9 +59,9 @@ namespace Microsoft.SqlTools.ServiceLayer
} }
catch (Exception ex) catch (Exception ex)
{ {
try try
{ {
Logger.WriteWithCallstack(TraceEventType.Critical, $"An unhandled exception occurred: {ex}"); Logger.WriteWithCallstack(TraceEventType.Critical, $"An unhandled exception occurred: {ex}");
} }
catch (Exception loggerEx) catch (Exception loggerEx)
{ {