Skip to content

Commit 9073228

Browse files
committed
add commands for warming the overlay-base cache
1 parent e0a17ca commit 9073228

File tree

10 files changed

+255
-23
lines changed

10 files changed

+255
-23
lines changed

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.runWarmOverlayBaseCacheQuery",
520+
"title": "CodeQL: Warm Overlay-Base Cache for Query"
521+
},
522+
{
523+
"command": "codeQL.runWarmOverlayBaseCacheQueryContextEditor",
524+
"title": "CodeQL: Warm Overlay-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.runWarmOverlayBaseCacheQueries",
584+
"title": "CodeQL: Warm Overlay-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.runWarmOverlayBaseCacheQuerySuite",
592+
"title": "CodeQL: Warm Overlay-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.runWarmOverlayBaseCacheQueries",
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.runWarmOverlayBaseCacheQuerySuite",
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.runWarmOverlayBaseCacheQuery",
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.runWarmOverlayBaseCacheQueryContextEditor",
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.runWarmOverlayBaseCacheQueries",
1519+
"when": "false"
1520+
},
14831521
{
14841522
"command": "codeQL.runQuerySuite",
14851523
"when": "false"
14861524
},
1525+
{
1526+
"command": "codeQL.runWarmOverlayBaseCacheQuerySuite",
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.runWarmOverlayBaseCacheQueryContextEditor",
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.runWarmOverlayBaseCacheQuery": (uri?: Uri) => Promise<void>;
129130
"codeQL.runQueryContextEditor": (uri?: Uri) => Promise<void>;
131+
"codeQL.runWarmOverlayBaseCacheQueryContextEditor": (
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.runWarmOverlayBaseCacheQueries": ExplorerSelectionCommandFunction<Uri>;
141146
"codeQL.runQuerySuite": ExplorerSelectionCommandFunction<Uri>;
147+
"codeQL.runWarmOverlayBaseCacheQuerySuite": 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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ 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 overlay-base cache.
14+
export const queryServerForWarmingOverlayBaseCacheLogger =
15+
new OutputChannelLogger("CodeQL Query Server for warming overlay-base cache");
16+
1317
// Logger for messages from the language server.
1418
export const languageServerLogger = new OutputChannelLogger(
1519
"CodeQL Language Server",

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

Lines changed: 29 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 qsForWarmingOverlayBaseCache: QueryRunner,
121122
private readonly cli: CodeQLCliServer,
122123
private readonly languageContext: LanguageContextStore,
123124
public logger: Logger,
@@ -739,6 +740,34 @@ export class DatabaseManager extends DisposableObject {
739740
}
740741
}
741742

743+
public async withDatabaseInQsForWarmingOverlayBaseCache(
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.qsForWarmingOverlayBaseCache.registerDatabase(dbItem);
751+
}
752+
await whatToDo();
753+
if (this._currentDatabaseItem) {
754+
const dbItem = this._currentDatabaseItem;
755+
await this.qsForWarmingOverlayBaseCache.deregisterDatabase(dbItem);
756+
await this.qs.registerDatabase(dbItem);
757+
}
758+
} catch (e) {
759+
const message = getErrorMessage(e);
760+
if (message === "Connection is disposed.") {
761+
// This is expected if the query server is not running.
762+
void extLogger.log(
763+
`Could not use database for warming overlay-base cache because query server is not running.`,
764+
);
765+
return;
766+
}
767+
throw e;
768+
}
769+
}
770+
742771
private async deregisterDatabase(dbItem: DatabaseItem) {
743772
try {
744773
await this.qs.deregisterDatabase(dbItem);

extensions/ql-vscode/src/extension.ts

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ import {
8686
extLogger,
8787
languageServerLogger,
8888
queryServerLogger,
89+
queryServerForWarmingOverlayBaseCacheLogger,
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+
queryRunnerForWarmingOverlayBaseCache: 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+
queryRunnerForWarmingOverlayBaseCache.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+
queryServerForWarmingOverlayBaseCacheLogger,
209+
"CodeQL Query Server for warming underlay 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 qsForWarmingOverlayBaseCache: 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 qsForWarmingOverlayBaseCache = 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+
qsForWarmingOverlayBaseCache,
825844
cliServer,
826845
languageContext,
827846
extLogger,
@@ -998,6 +1017,7 @@ async function activateWithInstalledDistribution(
9981017
const localQueries = new LocalQueries(
9991018
app,
10001019
qs,
1020+
qsForWarmingOverlayBaseCache,
10011021
qhm,
10021022
dbm,
10031023
databaseFetcher,
@@ -1062,7 +1082,13 @@ 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(
1086+
app,
1087+
cliServer,
1088+
qs,
1089+
qsForWarmingOverlayBaseCache,
1090+
languageClient,
1091+
),
10661092
...getQueryEditorCommands({
10671093
commandManager: app.commands,
10681094
queryRunner: qs,
@@ -1165,6 +1191,7 @@ async function activateWithInstalledDistribution(
11651191
cliServer,
11661192
localQueries,
11671193
qs,
1194+
qsForWarmingOverlayBaseCache,
11681195
distributionManager,
11691196
databaseManager: dbm,
11701197
databaseUI,
@@ -1278,9 +1305,12 @@ async function createQueryServer(
12781305
qlConfigurationListener: QueryServerConfigListener,
12791306
cliServer: CodeQLCliServer,
12801307
ctx: ExtensionContext,
1308+
warmOverlayBaseCache: boolean,
12811309
): Promise<QueryRunner> {
12821310
const qsOpts = {
1283-
logger: queryServerLogger,
1311+
logger: warmOverlayBaseCache
1312+
? queryServerForWarmingOverlayBaseCacheLogger
1313+
: queryServerLogger,
12841314
contextStoragePath: getContextStoragePath(ctx),
12851315
};
12861316
const progressCallback = (
@@ -1290,7 +1320,12 @@ async function createQueryServer(
12901320
) => Thenable<void>,
12911321
) =>
12921322
Window.withProgress(
1293-
{ title: "CodeQL query server", location: ProgressLocation.Window },
1323+
{
1324+
title: warmOverlayBaseCache
1325+
? "CodeQL query server for warming underlay caches"
1326+
: "CodeQL query server",
1327+
location: ProgressLocation.Window,
1328+
},
12941329
task,
12951330
);
12961331

@@ -1300,6 +1335,7 @@ async function createQueryServer(
13001335
cliServer,
13011336
qsOpts,
13021337
progressCallback,
1338+
warmOverlayBaseCache,
13031339
);
13041340
ctx.subscriptions.push(qs);
13051341
await qs.startQueryServer();

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)