Batch messages on the exthost to not freeze ads (#8949)

* batch messages on the exthost to not freeze ads

* clear out messages on query complete
This commit is contained in:
Anthony Dresser
2020-02-20 14:50:13 -08:00
committed by GitHub
parent 8fe0a13b61
commit 4c54b5dbac
11 changed files with 103 additions and 41 deletions

View File

@@ -13,6 +13,8 @@ import { DataProviderType } from 'sql/workbench/api/common/sqlExtHostTypes';
import { IURITransformer } from 'vs/base/common/uriIpc';
import { URI } from 'vs/base/common/uri';
import { find } from 'vs/base/common/arrays';
import { RunOnceScheduler } from 'vs/base/common/async';
import { mapToSerializable } from 'sql/base/common/map';
export class ExtHostDataProtocol extends ExtHostDataProtocolShape {
@@ -26,6 +28,9 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape {
private _adapter = new Map<number, azdata.DataProvider>();
private _providersByType = new Map<azdata.DataProviderType, azdata.DataProvider[]>();
private readonly messageRunner = new RunOnceScheduler(() => this.sendMessages(), 1000);
private readonly queuedMessages = new Map<string, azdata.QueryExecuteMessageParams[]>();
constructor(
mainContext: IMainContext,
private uriTransformer: IURITransformer | null
@@ -302,6 +307,11 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape {
if (this.uriTransformer) {
result.ownerUri = URI.from(this.uriTransformer.transformOutgoing(URI.parse(result.ownerUri))).toString(true);
}
// clear messages to maintain the order of things
if (this.messageRunner.isScheduled()) {
this.messageRunner.cancel();
this.sendMessages();
}
this._proxy.$onQueryComplete(handle, result);
}
$onBatchStart(handle: number, batchInfo: azdata.QueryExecuteBatchNotificationParams): void {
@@ -328,11 +338,23 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape {
}
this._proxy.$onResultSetUpdated(handle, resultSetInfo);
}
$onQueryMessage(handle: number, message: azdata.QueryExecuteMessageParams): void {
$onQueryMessage(message: azdata.QueryExecuteMessageParams): void {
if (this.uriTransformer) {
message.ownerUri = URI.from(this.uriTransformer.transformOutgoing(URI.parse(message.ownerUri))).toString(true);
}
this._proxy.$onQueryMessage(handle, message);
if (!this.queuedMessages.has(message.ownerUri)) {
this.queuedMessages.set(message.ownerUri, []);
}
this.queuedMessages.get(message.ownerUri).push(message);
if (!this.messageRunner.isScheduled()) {
this.messageRunner.schedule();
}
}
private sendMessages() {
const messages = mapToSerializable(this.queuedMessages);
this.queuedMessages.clear();
this._proxy.$onQueryMessage(messages);
}
$saveResults(handle: number, requestParams: azdata.SaveResultsRequestParams): Thenable<azdata.SaveResultRequestResult> {