add configuration for STS parallel message processing (#19279)

* add configuration for parallel processing

* update setting description

* vbump sts

* enable feature for dev by default
This commit is contained in:
Alan Ren
2022-05-06 15:08:00 -07:00
committed by GitHub
parent 5f48e4a28d
commit 23b347662a
5 changed files with 33 additions and 5 deletions

View File

@@ -1,6 +1,6 @@
{
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}",
"version": "3.0.0-release.243",
"version": "3.0.0-release.245",
"downloadFileNames": {
"Windows_86": "win-x86-net6.0.zip",
"Windows_64": "win-x64-net6.0.zip",

View File

@@ -383,6 +383,11 @@
"type": "boolean",
"description": "%mssql.ignorePlatformWarning%",
"default": false
},
"mssql.parallelMessageProcessing": {
"type": "boolean",
"description": "%mssql.parallelMessageProcessing%",
"default": false
}
}
},

View File

@@ -186,5 +186,6 @@
"objectsListProperties.name": "Name",
"title.newTable": "New Table",
"title.designTable": "Design"
"title.designTable": "Design",
"mssql.parallelMessageProcessing" : "[Experimental] Whether the requests to the SQL Tools Service should be handled in parallel. This is introduced to discover the issues there might be when handling all requests in parallel. The default value is false. Relaunch of ADS is required when the value is changed."
}

View File

@@ -8,7 +8,7 @@ import { ServerOptions, TransportKind } from 'vscode-languageclient';
import * as Constants from './constants';
import * as vscode from 'vscode';
import * as path from 'path';
import { getCommonLaunchArgsAndCleanupOldLogFiles, getOrDownloadServer } from './utils';
import { getCommonLaunchArgsAndCleanupOldLogFiles, getOrDownloadServer, getParallelMessageProcessingConfig } from './utils';
import { Telemetry, LanguageClientErrorHandler } from './telemetry';
import { SqlOpsDataClient, ClientOptions } from 'dataprotocol-client';
import { TelemetryFeature, AgentServicesFeature, SerializationFeature, AccountFeature, SqlAssessmentServicesFeature, ProfilerFeature, TableDesignerFeature, ExecutionPlanServiceFeature } from './features';
@@ -45,7 +45,7 @@ export class SqlToolsServer {
const serverPath = await this.download(context);
this.installDirectory = path.dirname(serverPath);
const installationComplete = Date.now();
let serverOptions = generateServerOptions(context.extensionContext.logPath, serverPath);
let serverOptions = await generateServerOptions(context.extensionContext.logPath, serverPath);
let clientOptions = getClientOptions(context);
this.client = new SqlOpsDataClient(Constants.serviceName, serverOptions, clientOptions);
const processStart = Date.now();
@@ -104,8 +104,12 @@ export class SqlToolsServer {
}
}
function generateServerOptions(logPath: string, executablePath: string): ServerOptions {
async function generateServerOptions(logPath: string, executablePath: string): Promise<ServerOptions> {
const launchArgs = getCommonLaunchArgsAndCleanupOldLogFiles(logPath, 'sqltools.log', executablePath);
const enableAsyncMessageProcessing = await getParallelMessageProcessingConfig();
if (enableAsyncMessageProcessing) {
launchArgs.push('--parallel-message-processing');
}
return { command: executablePath, args: launchArgs, transport: TransportKind.stdio };
}

View File

@@ -20,6 +20,7 @@ const configLogRetentionMinutes = 'logRetentionMinutes';
const configLogFilesRemovalLimit = 'logFilesRemovalLimit';
const extensionConfigSectionName = 'mssql';
const configLogDebugInfo = 'logDebugInfo';
const parallelMessageProcessingConfig = 'parallelMessageProcessing';
/**
*
@@ -92,6 +93,18 @@ export function getConfigTracingLevel(): string {
}
}
export async function getParallelMessageProcessingConfig(): Promise<boolean> {
const config = getConfiguration();
if (!config) {
return false;
}
const quality = await getProductQuality();
const setting = config.inspect(parallelMessageProcessingConfig);
// For dev environment, we want to enable the feature by default unless it is set explicitely.
// Note: the quality property is not set for dev environment, we can use this to determine whether it is dev environment.
return (quality === undefined && setting.globalValue === undefined && setting.workspaceValue === undefined) ? true : config[parallelMessageProcessingConfig];
}
export function getLogFileName(prefix: string, pid: number): string {
return `${prefix}_${pid}.log`;
}
@@ -352,3 +365,8 @@ export async function getOrDownloadServer(config: IConfig, handleServerEvent?: (
return serverdownloader.getOrDownloadServer();
}
async function getProductQuality(): Promise<string> {
const content = await fs.readFile(path.join(vscode.env.appRoot, 'product.json'));
return JSON.parse(content?.toString())?.quality;
}