Skip to content

Commit 3117b4e

Browse files
authored
Merge pull request #4310 from an-dr-eas-k/master
improve queues, (one effect: improve code completion)
2 parents 687fe0e + aa6fe5e commit 3117b4e

File tree

8 files changed

+54
-27
lines changed

8 files changed

+54
-27
lines changed

src/observers/OmnisharpDebugModeLoggerObserver.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import { BaseLoggerObserver } from "./BaseLoggerObserver";
77
import * as os from 'os';
8-
import { BaseEvent, OmnisharpRequestMessage, OmnisharpServerEnqueueRequest, OmnisharpServerDequeueRequest, OmnisharpServerVerboseMessage, OmnisharpServerProcessRequestStart, OmnisharpEventPacketReceived } from "../omnisharp/loggingEvents";
8+
import { BaseEvent, OmnisharpRequestMessage, OmnisharpServerEnqueueRequest, OmnisharpServerDequeueRequest, OmnisharpServerRequestCancelled, OmnisharpServerVerboseMessage, OmnisharpServerProcessRequestStart, OmnisharpEventPacketReceived } from "../omnisharp/loggingEvents";
99
import { EventType } from "../omnisharp/EventType";
1010

1111
export class OmnisharpDebugModeLoggerObserver extends BaseLoggerObserver {
@@ -20,6 +20,9 @@ export class OmnisharpDebugModeLoggerObserver extends BaseLoggerObserver {
2020
case EventType.OmnisharpServerDequeueRequest:
2121
this.handleOmnisharpServerDequeueRequest(<OmnisharpServerDequeueRequest>event);
2222
break;
23+
case EventType.OmnisharpServerRequestCancelled:
24+
this.handleOmnisharpServerRequestCancelled(<OmnisharpServerRequestCancelled>event);
25+
break;
2326
case EventType.OmnisharpServerProcessRequestStart:
2427
this.handleOmnisharpProcessRequestStart(<OmnisharpServerProcessRequestStart>event);
2528
break;
@@ -44,17 +47,22 @@ export class OmnisharpDebugModeLoggerObserver extends BaseLoggerObserver {
4447
}
4548

4649
private handleOmnisharpServerEnqueueRequest(event: OmnisharpServerEnqueueRequest) {
47-
this.logger.appendLine(`Enqueue ${event.name} request for ${event.command}.`);
50+
this.logger.appendLine(`Enqueue to ${event.queueName} request for ${event.command}.`);
4851
this.logger.appendLine();
4952
}
5053

5154
private handleOmnisharpServerDequeueRequest(event: OmnisharpServerDequeueRequest) {
52-
this.logger.appendLine(`Dequeue ${event.name} request for ${event.command} (${event.id}).`);
55+
this.logger.appendLine(`Dequeue from ${event.queueName} with status ${event.queueStatus} request for ${event.command}${event.id ? ` (${event.id})` : ''}.`);
56+
this.logger.appendLine();
57+
}
58+
59+
private handleOmnisharpServerRequestCancelled(event: OmnisharpServerRequestCancelled) {
60+
this.logger.appendLine(`Cancelled request for ${event.command} (${event.id}).`);
5361
this.logger.appendLine();
5462
}
5563

5664
private handleOmnisharpProcessRequestStart(event: OmnisharpServerProcessRequestStart) {
57-
this.logger.appendLine(`Processing ${event.name} queue`);
65+
this.logger.appendLine(`Processing ${event.name} queue, available slots ${event.availableRequestSlots}`);
5866
this.logger.increaseIndent();
5967
}
6068

src/omnisharp/EventType.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ export enum EventType {
8282
ProjectDiagnosticStatus = 75,
8383
DotNetTestRunInContextStart = 76,
8484
DotNetTestDebugInContextStart = 77,
85-
TelemetryErrorEvent = 78
85+
TelemetryErrorEvent = 78,
86+
OmnisharpServerRequestCancelled = 79,
8687
}
8788

8889
//Note that the EventType protocol is shared with Razor.VSCode and the numbers here should not be altered

src/omnisharp/loggingEvents.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,17 +115,22 @@ export class OmnisharpServerUnresolvedDependencies implements BaseEvent {
115115

116116
export class OmnisharpServerEnqueueRequest implements BaseEvent {
117117
type = EventType.OmnisharpServerEnqueueRequest;
118-
constructor(public name: string, public command: string) { }
118+
constructor(public queueName: string, public command: string) { }
119119
}
120120

121121
export class OmnisharpServerDequeueRequest implements BaseEvent {
122122
type = EventType.OmnisharpServerDequeueRequest;
123-
constructor(public name: string, public command: string, public id: number) { }
123+
constructor(public queueName: string, public queueStatus: string, public command: string, public id?: number) { }
124+
}
125+
126+
export class OmnisharpServerRequestCancelled implements BaseEvent {
127+
type = EventType.OmnisharpServerRequestCancelled;
128+
constructor(public command: string, public id: number) { }
124129
}
125130

126131
export class OmnisharpServerProcessRequestStart implements BaseEvent {
127132
type = EventType.OmnisharpServerProcessRequestStart;
128-
constructor(public name: string) { }
133+
constructor(public name: string, public availableRequestSlots: number) { }
129134
}
130135

131136
export class OmnisharpEventPacketReceived implements BaseEvent {

src/omnisharp/prioritization.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ const priorityCommands = [
1313
];
1414

1515
const normalCommands = [
16-
protocol.Requests.AutoComplete,
16+
protocol.Requests.Completion,
17+
protocol.Requests.CompletionResolve,
1718
protocol.Requests.FilesChanged,
1819
protocol.Requests.FindSymbols,
1920
protocol.Requests.FindUsages,

src/omnisharp/protocol.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { CompletionTriggerKind, CompletionItemKind, CompletionItemTag, InsertTex
88

99
export module Requests {
1010
export const AddToProject = '/addtoproject';
11-
export const AutoComplete = '/autocomplete';
1211
export const CodeCheck = '/codecheck';
1312
export const CodeFormat = '/codeformat';
1413
export const ChangeBuffer = '/changebuffer';

src/omnisharp/requestQueue.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface Request {
1414
onError(err: any): void;
1515
startTime?: number;
1616
endTime?: number;
17+
id?: number;
1718
}
1819

1920
/**
@@ -47,7 +48,7 @@ class RequestQueue {
4748

4849
if (request) {
4950
this._waiting.delete(id);
50-
this.eventStream.post(new OmnisharpServerDequeueRequest(this._name, request.command, id));
51+
this.eventStream.post(new OmnisharpServerDequeueRequest(this._name, "waiting", request.command, id));
5152
}
5253

5354
return request;
@@ -57,12 +58,12 @@ class RequestQueue {
5758
let index = this._pending.indexOf(request);
5859
if (index !== -1) {
5960
this._pending.splice(index, 1);
60-
61-
// Note: This calls reject() on the promise returned by OmniSharpServer.makeRequest
62-
request.onError(new Error(`Pending request cancelled: ${request.command}`));
61+
this.eventStream.post(new OmnisharpServerDequeueRequest(this._name, "pending", request.command));
6362
}
6463

65-
// TODO: Handle cancellation of a request already waiting on the OmniSharp server.
64+
if (request.id){
65+
this.dequeue(request.id);
66+
}
6667
}
6768

6869
/**
@@ -87,11 +88,10 @@ class RequestQueue {
8788
return;
8889
}
8990

90-
this.eventStream.post(new OmnisharpServerProcessRequestStart(this._name));
91-
92-
const slots = this._maxSize - this._waiting.size;
91+
const availableRequestSlots = this._maxSize - this._waiting.size;
92+
this.eventStream.post(new OmnisharpServerProcessRequestStart(this._name, availableRequestSlots));
9393

94-
for (let i = 0; i < slots && this._pending.length > 0; i++) {
94+
for (let i = 0; i < availableRequestSlots && this._pending.length > 0; i++) {
9595
const item = this._pending.shift();
9696
item.startTime = Date.now();
9797

src/omnisharp/server.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,10 @@ export class OmniSharpServer {
572572

573573
if (token) {
574574
token.onCancellationRequested(() => {
575+
this.eventStream.post(new ObservableEvents.OmnisharpServerRequestCancelled(request.command, request.id));
575576
this._requestQueue.cancelRequest(request);
577+
// Note: This calls reject() on the promise returned by OmniSharpServer.makeRequest
578+
request.onError(new Error(`Request ${request.command} cancelled, id: ${request.id}`));
576579
});
577580
}
578581

@@ -705,6 +708,7 @@ export class OmniSharpServer {
705708

706709
private _makeRequest(request: Request) {
707710
const id = OmniSharpServer._nextId++;
711+
request.id = id;
708712

709713
const requestPacket: protocol.WireProtocol.RequestPacket = {
710714
Type: 'request',

test/unitTests/logging/OmnisharpDebugModeLoggerObserver.test.ts

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55
import { use, should, expect } from 'chai';
66
import { getNullChannel } from '../testAssets/Fakes';
7-
import { OmnisharpServerVerboseMessage, EventWithMessage, OmnisharpRequestMessage, OmnisharpServerEnqueueRequest, OmnisharpServerDequeueRequest, OmnisharpServerProcessRequestStart, OmnisharpEventPacketReceived, OmnisharpServerProcessRequestComplete } from '../../../src/omnisharp/loggingEvents';
7+
import { OmnisharpServerVerboseMessage, EventWithMessage, OmnisharpRequestMessage, OmnisharpServerEnqueueRequest, OmnisharpServerDequeueRequest, OmnisharpServerProcessRequestStart, OmnisharpEventPacketReceived, OmnisharpServerProcessRequestComplete, OmnisharpServerRequestCancelled } from '../../../src/omnisharp/loggingEvents';
88
import { OmnisharpDebugModeLoggerObserver } from '../../../src/observers/OmnisharpDebugModeLoggerObserver';
99

1010
use(require("chai-string"));
@@ -33,27 +33,36 @@ suite("OmnisharpDebugModeLoggerObserver", () => {
3333
test(`OmnisharpServerEnqueueRequest: Name and Command is logged`, () => {
3434
let event = new OmnisharpServerEnqueueRequest("foo", "someCommand");
3535
observer.post(event);
36-
expect(logOutput).to.contain(event.name);
36+
expect(logOutput).to.contain(event.queueName);
3737
expect(logOutput).to.contain(event.command);
3838
});
3939

40-
test(`OmnisharpServerDequeueRequest: Name and Command is logged`, () => {
41-
let event = new OmnisharpServerDequeueRequest("foo", "someCommand", 1);
40+
test(`OmnisharpServerDequeueRequest: QueueName, QueueStatus, Command and Id is logged`, () => {
41+
let event = new OmnisharpServerDequeueRequest("foo", "pending", "someCommand", 1);
4242
observer.post(event);
43-
expect(logOutput).to.contain(event.name);
43+
expect(logOutput).to.contain(event.queueName);
44+
expect(logOutput).to.contain(event.queueStatus);
4445
expect(logOutput).to.contain(event.command);
4546
expect(logOutput).to.contain(event.id);
4647
});
4748

48-
test(`OmnisharpProcessRequestStart: Name is logged`, () => {
49-
let event = new OmnisharpServerProcessRequestStart("foobar");
49+
test(`OmnisharpProcessRequestStart: Name and slots is logged`, () => {
50+
let event = new OmnisharpServerProcessRequestStart("foobar", 2);
5051
observer.post(event);
5152
expect(logOutput).to.contain(event.name);
53+
expect(logOutput).to.contain(event.availableRequestSlots);
54+
});
55+
56+
test(`OmnisharpServerRequestCancelled: Name and Id is logged`, () => {
57+
let event = new OmnisharpServerRequestCancelled("foobar", 23);
58+
observer.post(event);
59+
expect(logOutput).to.contain(event.command);
60+
expect(logOutput).to.contain(event.id);
5261
});
5362

5463
test(`OmnisharpServer messages increase and decrease indent`, () => {
5564
observer.post(new OmnisharpServerVerboseMessage("!indented_1"));
56-
observer.post(new OmnisharpServerProcessRequestStart("name"));
65+
observer.post(new OmnisharpServerProcessRequestStart("name", 2));
5766
observer.post(new OmnisharpServerVerboseMessage("indented"));
5867
observer.post(new OmnisharpServerProcessRequestComplete());
5968
observer.post(new OmnisharpServerVerboseMessage("!indented_2"));

0 commit comments

Comments
 (0)