mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-16 01:25:36 -05:00
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:
@@ -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> {
|
||||
|
||||
Reference in New Issue
Block a user