mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-17 09:35:37 -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> {
|
||||
|
||||
@@ -240,7 +240,7 @@ export function createAdsApiFactory(accessor: ServicesAccessor): IAdsExtensionAp
|
||||
});
|
||||
|
||||
provider.registerOnMessage((message: azdata.QueryExecuteMessageParams) => {
|
||||
extHostDataProvider.$onQueryMessage(provider.handle, message);
|
||||
extHostDataProvider.$onQueryMessage(message);
|
||||
});
|
||||
|
||||
provider.registerOnEditSessionReady((ownerUri: string, success: boolean, message: string) => {
|
||||
|
||||
@@ -219,7 +219,7 @@ export abstract class ExtHostDataProtocolShape {
|
||||
/**
|
||||
* Callback when a message generated during query execution is issued
|
||||
*/
|
||||
$onQueryMessage(handle: number, message: azdata.QueryExecuteMessageParams): void { throw ni(); }
|
||||
$onQueryMessage(message: azdata.QueryExecuteMessageParams): void { throw ni(); }
|
||||
|
||||
/**
|
||||
* Requests saving of the results from a result set into a specific format (CSV, JSON, Excel)
|
||||
@@ -559,7 +559,7 @@ export interface MainThreadDataProtocolShape extends IDisposable {
|
||||
$onBatchComplete(handle: number, batchInfo: azdata.QueryExecuteBatchNotificationParams): void;
|
||||
$onResultSetAvailable(handle: number, resultSetInfo: azdata.QueryExecuteResultSetNotificationParams): void;
|
||||
$onResultSetUpdated(handle: number, resultSetInfo: azdata.QueryExecuteResultSetNotificationParams): void;
|
||||
$onQueryMessage(handle: number, message: azdata.QueryExecuteMessageParams): void;
|
||||
$onQueryMessage(message: [string, azdata.QueryExecuteMessageParams[]][]): void;
|
||||
$onObjectExplorerSessionCreated(handle: number, message: azdata.ObjectExplorerSession): void;
|
||||
$onObjectExplorerSessionDisconnected(handle: number, message: azdata.ObjectExplorerSession): void;
|
||||
$onObjectExplorerNodeExpanded(providerId: string, message: azdata.ObjectExplorerExpandInfo): void;
|
||||
|
||||
Reference in New Issue
Block a user