Skip to content

Commit a0919e8

Browse files
committed
re-implement with two query servers
1 parent e0a17ca commit a0919e8

File tree

13 files changed

+231
-20
lines changed

13 files changed

+231
-20
lines changed

extensions/.DS_Store

6 KB
Binary file not shown.

extensions/ql-vscode/.DS_Store

8 KB
Binary file not shown.

extensions/ql-vscode/package.json

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,14 @@
515515
"command": "codeQL.runQueryContextEditor",
516516
"title": "CodeQL: Run Query on Selected Database"
517517
},
518+
{
519+
"command": "codeQL.runWarmBaseLayerCacheQuery",
520+
"title": "CodeQL: Warm Base Cache for Query"
521+
},
522+
{
523+
"command": "codeQL.runWarmBaseLayerCacheQueryContextEditor",
524+
"title": "CodeQL: Warm Base Cache for Query"
525+
},
518526
{
519527
"command": "codeQL.debugQuery",
520528
"title": "CodeQL: Debug Query"
@@ -571,10 +579,18 @@
571579
"command": "codeQL.runQueries",
572580
"title": "CodeQL: Run Queries in Selected Files"
573581
},
582+
{
583+
"command": "codeQL.runWarmBaseLayerCacheQueries",
584+
"title": "CodeQL: Warm Base Cache for Queries in Selected Files"
585+
},
574586
{
575587
"command": "codeQL.runQuerySuite",
576588
"title": "CodeQL: Run Selected Query Suite"
577589
},
590+
{
591+
"command": "codeQL.runWarmBaseLayerCacheQuerySuite",
592+
"title": "CodeQL: Warm Base Cache for Query Suite"
593+
},
578594
{
579595
"command": "codeQL.quickEval",
580596
"title": "CodeQL: Quick Evaluation"
@@ -1378,11 +1394,21 @@
13781394
"group": "9_qlCommands",
13791395
"when": "resourceScheme != codeql-zip-archive"
13801396
},
1397+
{
1398+
"command": "codeQL.runWarmBaseLayerCacheQueries",
1399+
"group": "9_qlCommands",
1400+
"when": "resourceScheme != codeql-zip-archive"
1401+
},
13811402
{
13821403
"command": "codeQL.runQuerySuite",
13831404
"group": "9_qlCommands",
13841405
"when": "resourceScheme != codeql-zip-archive && resourceExtname == .qls && !explorerResourceIsFolder && !listMultiSelection && config.codeQL.canary"
13851406
},
1407+
{
1408+
"command": "codeQL.runWarmBaseLayerCacheQuerySuite",
1409+
"group": "9_qlCommands",
1410+
"when": "resourceScheme != codeql-zip-archive && resourceExtname == .qls && !explorerResourceIsFolder && !listMultiSelection && config.codeQL.canary"
1411+
},
13861412
{
13871413
"command": "codeQL.runVariantAnalysisContextExplorer",
13881414
"group": "9_qlCommands",
@@ -1408,6 +1434,10 @@
14081434
"command": "codeQL.runQuery",
14091435
"when": "resourceLangId == ql && resourceExtname == .ql"
14101436
},
1437+
{
1438+
"command": "codeQL.runWarmBaseLayerCacheQuery",
1439+
"when": "resourceLangId == ql && resourceExtname == .ql"
1440+
},
14111441
{
14121442
"command": "codeQLQueries.runLocalQueryFromQueriesPanel",
14131443
"when": "false"
@@ -1428,6 +1458,10 @@
14281458
"command": "codeQL.runQueryContextEditor",
14291459
"when": "false"
14301460
},
1461+
{
1462+
"command": "codeQL.runWarmBaseLayerCacheQueryContextEditor",
1463+
"when": "false"
1464+
},
14311465
{
14321466
"command": "codeQL.debugQuery",
14331467
"when": "config.codeQL.canary && editorLangId == ql && resourceExtname == .ql && !inDebugMode"
@@ -1480,10 +1514,18 @@
14801514
"command": "codeQL.runQueries",
14811515
"when": "false"
14821516
},
1517+
{
1518+
"command": "codeQL.runWarmBaseLayerCacheQueries",
1519+
"when": "false"
1520+
},
14831521
{
14841522
"command": "codeQL.runQuerySuite",
14851523
"when": "false"
14861524
},
1525+
{
1526+
"command": "codeQL.runWarmBaseLayerCacheQuerySuite",
1527+
"when": "false"
1528+
},
14871529
{
14881530
"command": "codeQL.quickEval",
14891531
"when": "editorLangId == ql"
@@ -1832,6 +1874,10 @@
18321874
"command": "codeQL.runQueryContextEditor",
18331875
"when": "editorLangId == ql && resourceExtname == .ql && !inDebugMode"
18341876
},
1877+
{
1878+
"command": "codeQL.runWarmBaseLayerCacheQueryContextEditor",
1879+
"when": "editorLangId == ql && resourceExtname == .ql && !inDebugMode"
1880+
},
18351881
{
18361882
"command": "codeQL.runQueryOnMultipleDatabasesContextEditor",
18371883
"when": "editorLangId == ql && resourceExtname == .ql"

extensions/ql-vscode/src/common/commands.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,11 @@ export type QueryEditorCommands = {
126126
// Commands used for running local queries
127127
export type LocalQueryCommands = {
128128
"codeQL.runQuery": (uri?: Uri) => Promise<void>;
129+
"codeQL.runWarmBaseLayerCacheQuery": (uri?: Uri) => Promise<void>;
129130
"codeQL.runQueryContextEditor": (uri?: Uri) => Promise<void>;
131+
"codeQL.runWarmBaseLayerCacheQueryContextEditor": (
132+
uri?: Uri,
133+
) => Promise<void>;
130134
"codeQL.runQueryOnMultipleDatabases": (uri?: Uri) => Promise<void>;
131135
"codeQL.runQueryOnMultipleDatabasesContextEditor": (
132136
uri?: Uri,
@@ -138,7 +142,9 @@ export type LocalQueryCommands = {
138142
"codeQLQueries.createQuery": () => Promise<void>;
139143
"codeQL.runLocalQueryFromFileTab": (uri: Uri) => Promise<void>;
140144
"codeQL.runQueries": ExplorerSelectionCommandFunction<Uri>;
145+
"codeQL.runWarmBaseLayerCacheQueries": ExplorerSelectionCommandFunction<Uri>;
141146
"codeQL.runQuerySuite": ExplorerSelectionCommandFunction<Uri>;
147+
"codeQL.runWarmBaseLayerCacheQuerySuite": ExplorerSelectionCommandFunction<Uri>;
142148
"codeQL.quickEval": (uri: Uri) => Promise<void>;
143149
"codeQL.quickEvalCount": (uri: Uri) => Promise<void>;
144150
"codeQL.quickEvalContextEditor": (uri: Uri) => Promise<void>;

extensions/ql-vscode/src/common/logging/vscode/loggers.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ export const extLogger = new OutputChannelLogger("CodeQL Extension Log");
1010
// Logger for messages from the query server.
1111
export const queryServerLogger = new OutputChannelLogger("CodeQL Query Server");
1212

13+
// Logger for messages from the query server for warming base layer caches.
14+
export const WarmBaseLayerCacheQueryServerLogger = new OutputChannelLogger(
15+
"CodeQL Query Server for warming base layer caches ",
16+
);
17+
1318
// Logger for messages from the language server.
1419
export const languageServerLogger = new OutputChannelLogger(
1520
"CodeQL Language Server",

extensions/ql-vscode/src/databases/local-databases/database-manager.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ export class DatabaseManager extends DisposableObject {
118118
private readonly ctx: ExtensionContext,
119119
private readonly app: App,
120120
private readonly qs: QueryRunner,
121+
private readonly qsForWarmingBaseLayerCache: QueryRunner,
121122
private readonly cli: CodeQLCliServer,
122123
private readonly languageContext: LanguageContextStore,
123124
public logger: Logger,
@@ -739,6 +740,31 @@ export class DatabaseManager extends DisposableObject {
739740
}
740741
}
741742

743+
public async withDatabaseInQsForWarmingBaseLayerCache(
744+
whatToDo: () => Promise<void>,
745+
) {
746+
try {
747+
if (this._currentDatabaseItem) {
748+
const dbItem = this._currentDatabaseItem;
749+
await this.qs.deregisterDatabase(dbItem);
750+
await this.qsForWarmingBaseLayerCache.registerDatabase(dbItem);
751+
await whatToDo();
752+
await this.qsForWarmingBaseLayerCache.deregisterDatabase(dbItem);
753+
await this.qs.registerDatabase(dbItem);
754+
} else await whatToDo();
755+
} catch (e) {
756+
const message = getErrorMessage(e);
757+
if (message === "Connection is disposed.") {
758+
// This is expected if the query server is not running.
759+
void extLogger.log(
760+
`Could not move database to query server for warming base caches because query server is not running.`,
761+
);
762+
return;
763+
}
764+
throw e;
765+
}
766+
}
767+
742768
private async deregisterDatabase(dbItem: DatabaseItem) {
743769
try {
744770
await this.qs.deregisterDatabase(dbItem);

extensions/ql-vscode/src/debugger/debugger-ui.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ class QLDebugAdapterTracker
123123
queryPath: this.configuration.query,
124124
quickEval: body.quickEvalContext,
125125
},
126+
false,
126127
dbItem,
127128
new QueryOutputDir(body.outputDir),
128129
tokenSource,
@@ -141,6 +142,7 @@ class QLDebugAdapterTracker
141142
[this.configuration.query, results],
142143
]),
143144
},
145+
false,
144146
(_) => {},
145147
);
146148
this.localQueryRun = undefined;

extensions/ql-vscode/src/extension.ts

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ import {
8686
extLogger,
8787
languageServerLogger,
8888
queryServerLogger,
89+
WarmBaseLayerCacheQueryServerLogger,
8990
} from "./common/logging/vscode";
9091
import { QueryHistoryManager } from "./query-history/query-history-manager";
9192
import type { CompletedLocalQueryInfo } from "./query-results";
@@ -172,6 +173,7 @@ function getCommands(
172173
app: App,
173174
cliServer: CodeQLCliServer,
174175
queryRunner: QueryRunner,
176+
WarmBaseLayerCacheQueryRunner: QueryRunner,
175177
languageClient: LanguageClient,
176178
): BaseCommands {
177179
const getCliVersion = async () => {
@@ -189,6 +191,7 @@ function getCommands(
189191
cliServer.restartCliServer();
190192
await Promise.all([
191193
queryRunner.restartQueryServer(progress),
194+
WarmBaseLayerCacheQueryRunner.restartQueryServer(progress),
192195
async () => {
193196
if (languageClient.isRunning()) {
194197
await languageClient.restart();
@@ -201,6 +204,10 @@ function getCommands(
201204
queryServerLogger,
202205
"CodeQL Query Server restarted.",
203206
);
207+
void showAndLogErrorMessage(
208+
WarmBaseLayerCacheQueryServerLogger,
209+
"CodeQL Query Server for warming base caches restarted.",
210+
);
204211
},
205212
{
206213
title: "Restarting Query Server",
@@ -281,6 +288,7 @@ export interface CodeQLExtensionInterface {
281288
readonly ctx: ExtensionContext;
282289
readonly cliServer: CodeQLCliServer;
283290
readonly qs: QueryRunner;
291+
readonly WarmBaseLayerCacheQs: QueryRunner;
284292
readonly distributionManager: DistributionManager;
285293
readonly databaseManager: DatabaseManager;
286294
readonly databaseUI: DatabaseUI;
@@ -795,6 +803,16 @@ async function activateWithInstalledDistribution(
795803
qlConfigurationListener,
796804
cliServer,
797805
ctx,
806+
false,
807+
);
808+
809+
void extLogger.log("Initializing base cache warming query server client.");
810+
const WarmBaseLayerCacheQs = await createQueryServer(
811+
app,
812+
qlConfigurationListener,
813+
cliServer,
814+
ctx,
815+
true,
798816
);
799817

800818
for (const glob of CLEAR_PACK_CACHE_ON_EDIT_GLOBS) {
@@ -822,6 +840,7 @@ async function activateWithInstalledDistribution(
822840
ctx,
823841
app,
824842
qs,
843+
WarmBaseLayerCacheQs,
825844
cliServer,
826845
languageContext,
827846
extLogger,
@@ -998,6 +1017,7 @@ async function activateWithInstalledDistribution(
9981017
const localQueries = new LocalQueries(
9991018
app,
10001019
qs,
1020+
WarmBaseLayerCacheQs,
10011021
qhm,
10021022
dbm,
10031023
databaseFetcher,
@@ -1062,7 +1082,7 @@ async function activateWithInstalledDistribution(
10621082
void extLogger.log("Registering top-level command palette commands.");
10631083

10641084
const allCommands: AllExtensionCommands = {
1065-
...getCommands(app, cliServer, qs, languageClient),
1085+
...getCommands(app, cliServer, qs, WarmBaseLayerCacheQs, languageClient),
10661086
...getQueryEditorCommands({
10671087
commandManager: app.commands,
10681088
queryRunner: qs,
@@ -1165,6 +1185,7 @@ async function activateWithInstalledDistribution(
11651185
cliServer,
11661186
localQueries,
11671187
qs,
1188+
WarmBaseLayerCacheQs,
11681189
distributionManager,
11691190
databaseManager: dbm,
11701191
databaseUI,
@@ -1278,32 +1299,42 @@ async function createQueryServer(
12781299
qlConfigurationListener: QueryServerConfigListener,
12791300
cliServer: CodeQLCliServer,
12801301
ctx: ExtensionContext,
1302+
onlyWarmBaseLayerCache: boolean,
12811303
): Promise<QueryRunner> {
12821304
const qsOpts = {
1283-
logger: queryServerLogger,
1305+
logger: onlyWarmBaseLayerCache
1306+
? WarmBaseLayerCacheQueryServerLogger
1307+
: queryServerLogger,
12841308
contextStoragePath: getContextStoragePath(ctx),
12851309
};
1310+
const queryServerName = onlyWarmBaseLayerCache
1311+
? "CodeQL query server for warming base caches"
1312+
: "CodeQL query server";
12861313
const progressCallback = (
12871314
task: (
12881315
progress: ProgressReporter,
12891316
token: CancellationToken,
12901317
) => Thenable<void>,
12911318
) =>
12921319
Window.withProgress(
1293-
{ title: "CodeQL query server", location: ProgressLocation.Window },
1320+
{
1321+
title: queryServerName,
1322+
location: ProgressLocation.Window,
1323+
},
12941324
task,
12951325
);
12961326

12971327
const qs = new QueryServerClient(
12981328
app,
12991329
qlConfigurationListener,
1330+
onlyWarmBaseLayerCache,
13001331
cliServer,
13011332
qsOpts,
13021333
progressCallback,
13031334
);
13041335
ctx.subscriptions.push(qs);
13051336
await qs.startQueryServer();
1306-
return new QueryRunner(qs);
1337+
return new QueryRunner(qs, queryServerName);
13071338
}
13081339

13091340
function getContextStoragePath(ctx: ExtensionContext) {

extensions/ql-vscode/src/language-support/ast-viewer/ast-cfg-commands.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export function getAstCfgCommands({
5959
progress,
6060
token,
6161
undefined,
62+
false,
6263
undefined,
6364
res[1],
6465
);

0 commit comments

Comments
 (0)