From 51ed3fe0a49f6f49eae71fea15955f93e6ab8879 Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Mon, 31 Mar 2025 14:40:31 +0300 Subject: [PATCH 1/6] fix types --- packages/cubejs-templates/src/PackageFetcher.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cubejs-templates/src/PackageFetcher.ts b/packages/cubejs-templates/src/PackageFetcher.ts index 88b123223e48c..c5e0d36169ce4 100644 --- a/packages/cubejs-templates/src/PackageFetcher.ts +++ b/packages/cubejs-templates/src/PackageFetcher.ts @@ -16,7 +16,7 @@ export class PackageFetcher { protected repoArchivePath: string; - public constructor(private repo: Repository) { + public constructor(private readonly repo: Repository) { this.tmpFolderPath = path.resolve('.', 'node_modules', '.tmp'); this.init(); @@ -53,7 +53,7 @@ export class PackageFetcher { (await proxyFetch(url)).body.pipe(writer); return new Promise((resolve, reject) => { - writer.on('finish', resolve); + writer.on('finish', resolve as () => void); writer.on('error', reject); }); } From 1ca3a8b9c6b0f86e2ae07a92d59a7e23906691ce Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Thu, 3 Apr 2025 16:40:35 +0300 Subject: [PATCH 2/6] update lru-cache to the latest --- .../cubejs-query-orchestrator/package.json | 2 +- packages/cubejs-schema-compiler/package.json | 3 +-- packages/cubejs-server-core/package.json | 3 +-- yarn.lock | 26 +++++-------------- 4 files changed, 10 insertions(+), 24 deletions(-) diff --git a/packages/cubejs-query-orchestrator/package.json b/packages/cubejs-query-orchestrator/package.json index cb9ed6fcc5254..486fd6d8b9e85 100644 --- a/packages/cubejs-query-orchestrator/package.json +++ b/packages/cubejs-query-orchestrator/package.json @@ -34,7 +34,7 @@ "@cubejs-backend/shared": "1.2.29", "csv-write-stream": "^2.0.0", "generic-pool": "^3.8.2", - "lru-cache": "^5.1.1", + "lru-cache": "^11.1.0", "ramda": "^0.27.2" }, "devDependencies": { diff --git a/packages/cubejs-schema-compiler/package.json b/packages/cubejs-schema-compiler/package.json index 5de6d20d7d4d6..a82a3cd8a61be 100644 --- a/packages/cubejs-schema-compiler/package.json +++ b/packages/cubejs-schema-compiler/package.json @@ -49,7 +49,7 @@ "inflection": "^1.12.0", "joi": "^17.8.3", "js-yaml": "^4.1.0", - "lru-cache": "^5.1.1", + "lru-cache": "^11.1.0", "moment-timezone": "^0.5.46", "node-dijkstra": "^2.5.0", "ramda": "^0.27.2", @@ -66,7 +66,6 @@ "@types/babel__traverse": "^7.20.5", "@types/inflection": "^1.5.28", "@types/jest": "^27", - "@types/lru-cache": "^5.1.0", "@types/node": "^18", "@types/ramda": "^0.27.34", "@types/sqlstring": "^2.3.0", diff --git a/packages/cubejs-server-core/package.json b/packages/cubejs-server-core/package.json index 50745a5e7b9c4..7719494009257 100644 --- a/packages/cubejs-server-core/package.json +++ b/packages/cubejs-server-core/package.json @@ -46,7 +46,7 @@ "joi": "^17.8.3", "jsonwebtoken": "^9.0.2", "lodash.clonedeep": "^4.5.0", - "lru-cache": "^5.1.1", + "lru-cache": "^11.1.0", "moment": "^2.29.1", "node-fetch": "^2.6.0", "p-limit": "^3.1.0", @@ -67,7 +67,6 @@ "@types/fs-extra": "^9.0.8", "@types/jest": "^27", "@types/jsonwebtoken": "^9.0.2", - "@types/lru-cache": "^5.1.0", "@types/node": "^18", "@types/node-fetch": "^2.5.7", "@types/ramda": "^0.27.34", diff --git a/yarn.lock b/yarn.lock index fc962405e7d51..805cdfdb06c69 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9601,11 +9601,6 @@ resolved "https://registry.yarnpkg.com/@types/jwk-to-pem/-/jwk-to-pem-2.0.1.tgz#ba6949f447e02cb7bebf101551e3a4dea5f4fde4" integrity sha512-QXmRPhR/LPzvXBHTPfG2BBfMTkNLUD7NyRcPft8m5xFCeANa1BZyLgT0Gw+OxdWx6i1WCpT27EqyggP4UUHMrA== -"@types/lru-cache@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" - integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== - "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -17154,7 +17149,7 @@ generate-object-property@^1.0.0: dependencies: is-property "^1.0.0" -generic-pool@*, generic-pool@^3.6.0, generic-pool@^3.8.2: +generic-pool@*, generic-pool@^3.8.2: version "3.9.0" resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.9.0.tgz#36f4a678e963f4fdb8707eab050823abc4e8f5e4" integrity sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g== @@ -20685,16 +20680,16 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lru-cache@^10.0.1: - version "10.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" - integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== - -lru-cache@^10.2.0, lru-cache@^10.2.2: +lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.2.2, "lru-cache@^9.1.1 || ^10.0.0": version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +lru-cache@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.1.0.tgz#afafb060607108132dbc1cf8ae661afb69486117" + integrity sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A== + lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -20722,13 +20717,6 @@ lru-cache@^7.14.1, lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -"lru-cache@^9.1.1 || ^10.0.0": - version "10.0.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.2.tgz#34504678cc3266b09b8dfd6fab4e1515258271b7" - integrity sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg== - dependencies: - semver "^7.3.5" - lru.min@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/lru.min/-/lru.min-1.1.1.tgz#146e01e3a183fa7ba51049175de04667d5701f0e" From 0ba410f57181ecba67bc90379a328118db5b243d Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Thu, 3 Apr 2025 16:41:15 +0300 Subject: [PATCH 3/6] fix lru-cache after upgrade --- .../src/orchestrator/PreAggregations.ts | 8 ++++---- .../src/orchestrator/QueryCache.ts | 4 ++-- .../cubejs-schema-compiler/src/compiler/CompilerCache.ts | 6 +++--- packages/cubejs-server-core/src/core/server.ts | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/cubejs-query-orchestrator/src/orchestrator/PreAggregations.ts b/packages/cubejs-query-orchestrator/src/orchestrator/PreAggregations.ts index f15cc56ab286f..bf59b5e3df8b1 100644 --- a/packages/cubejs-query-orchestrator/src/orchestrator/PreAggregations.ts +++ b/packages/cubejs-query-orchestrator/src/orchestrator/PreAggregations.ts @@ -4,7 +4,7 @@ import { getEnv, } from '@cubejs-backend/shared'; import { BaseDriver, InlineTable, } from '@cubejs-backend/base-driver'; import { CubeStoreDriver } from '@cubejs-backend/cubestore-driver'; -import LRUCache from 'lru-cache'; +import { LRUCache } from 'lru-cache'; import { PreAggTableToTempTable, Query, QueryBody, QueryCache, QueryWithParams } from './QueryCache'; import { DriverFactory, DriverFactoryByDataSource } from './DriverFactory'; @@ -282,8 +282,8 @@ export class PreAggregations { this.getQueueEventsBus = options.getQueueEventsBus; this.touchCache = new LRUCache({ max: getEnv('touchPreAggregationCacheMaxCount'), - maxAge: getEnv('touchPreAggregationCacheMaxAge') * 1000, - stale: false, + ttl: getEnv('touchPreAggregationCacheMaxAge') * 1000, + allowStale: false, updateAgeOnGet: false }); } @@ -330,7 +330,7 @@ export class PreAggregations { this.touchTablePersistTime ); } catch (e: unknown) { - this.touchCache.del(tableName); + this.touchCache.delete(tableName); throw e; } diff --git a/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts b/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts index 7f2360b95be65..c518224961d96 100644 --- a/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts +++ b/packages/cubejs-query-orchestrator/src/orchestrator/QueryCache.ts @@ -1,6 +1,6 @@ import crypto from 'crypto'; import csvWriter from 'csv-write-stream'; -import LRUCache from 'lru-cache'; +import { LRUCache } from 'lru-cache'; import { pipeline } from 'stream'; import { getEnv, MaybeCancelablePromise, streamToArray } from '@cubejs-backend/shared'; import { CubeStoreCacheDriver, CubeStoreDriver } from '@cubejs-backend/cubestore-driver'; @@ -909,7 +909,7 @@ export class QueryCache { inMemoryValue.renewalKey !== renewalKey ) || renewedAgo > expiration * 1000 || renewedAgo > inMemoryCacheDisablePeriod ) { - this.memoryCache.del(redisKey); + this.memoryCache.delete(redisKey); } else { this.logger('Found in memory cache entry', { cacheKey, diff --git a/packages/cubejs-schema-compiler/src/compiler/CompilerCache.ts b/packages/cubejs-schema-compiler/src/compiler/CompilerCache.ts index 3ec5b0b2c25ab..8e78665ae67b6 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CompilerCache.ts +++ b/packages/cubejs-schema-compiler/src/compiler/CompilerCache.ts @@ -1,4 +1,4 @@ -import LRUCache from 'lru-cache'; +import { LRUCache } from 'lru-cache'; import { QueryCache } from '../adapter/QueryCache'; export class CompilerCache extends QueryCache { @@ -11,13 +11,13 @@ export class CompilerCache extends QueryCache { this.queryCache = new LRUCache({ max: maxQueryCacheSize || 10000, - maxAge: (maxQueryCacheAge * 1000) || 1000 * 60 * 10, + ttl: (maxQueryCacheAge * 1000) || 1000 * 60 * 10, updateAgeOnGet: true }); this.rbacCache = new LRUCache({ max: 10000, - maxAge: 1000 * 60 * 5, // 5 minutes + ttl: 1000 * 60 * 5, // 5 minutes }); } diff --git a/packages/cubejs-server-core/src/core/server.ts b/packages/cubejs-server-core/src/core/server.ts index de61bda43f981..2caa73dfe9b32 100644 --- a/packages/cubejs-server-core/src/core/server.ts +++ b/packages/cubejs-server-core/src/core/server.ts @@ -1,7 +1,7 @@ /* eslint-disable global-require,no-return-assign */ import crypto from 'crypto'; import fs from 'fs-extra'; -import LRUCache from 'lru-cache'; +import { LRUCache } from 'lru-cache'; import isDocker from 'is-docker'; import pLimit from 'p-limit'; @@ -203,7 +203,7 @@ export class CubejsServerCore { this.compilerCache = new LRUCache({ max: this.options.compilerCacheSize || 250, - maxAge: this.options.maxCompilerCacheKeepAlive, + ttl: this.options.maxCompilerCacheKeepAlive, updateAgeOnGet: this.options.updateCompilerCacheKeepAlive }); @@ -224,7 +224,7 @@ export class CubejsServerCore { // proactively free up old cache values occasionally if (this.options.maxCompilerCacheKeepAlive) { this.maxCompilerCacheKeep = setInterval( - () => this.compilerCache.prune(), + () => this.compilerCache.purgeStale(), this.options.maxCompilerCacheKeepAlive ); } @@ -554,7 +554,7 @@ export class CubejsServerCore { await this.orchestratorStorage.releaseConnections(); this.orchestratorStorage.clear(); - this.compilerCache.reset(); + this.compilerCache.clear(); this.reloadEnvVariables(); From af7e39d70e6a9dbe533097deb649227aeb82210a Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Thu, 3 Apr 2025 16:43:54 +0300 Subject: [PATCH 4/6] introduce compiledScriptCache --- .../src/compiler/DataSchemaCompiler.js | 18 +++++++++++++++++- .../src/compiler/PrepareCompiler.ts | 6 ++++++ .../cubejs-server-core/src/core/CompilerApi.js | 9 ++++++++- packages/cubejs-server-core/src/core/server.ts | 3 +++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/packages/cubejs-schema-compiler/src/compiler/DataSchemaCompiler.js b/packages/cubejs-schema-compiler/src/compiler/DataSchemaCompiler.js index d10ea3ede5a25..98e0af7821257 100644 --- a/packages/cubejs-schema-compiler/src/compiler/DataSchemaCompiler.js +++ b/packages/cubejs-schema-compiler/src/compiler/DataSchemaCompiler.js @@ -1,3 +1,4 @@ +import crypto from 'crypto'; import vm from 'vm'; import fs from 'fs'; import path from 'path'; @@ -47,6 +48,7 @@ export class DataSchemaCompiler { this.pythonContext = null; this.workerPool = null; this.compilerId = options.compilerId; + this.compiledScriptCache = options.compiledScriptCache; } compileObjects(compileServices, objects, errorsReport) { @@ -370,6 +372,18 @@ export class DataSchemaCompiler { } } + getJsScript(file) { + const cacheKey = crypto.createHash('md5').update(JSON.stringify(file.content)).digest('hex'); + + if (this.compiledScriptCache.has(cacheKey)) { + return this.compiledScriptCache.get(cacheKey); + } + + const script = new vm.Script(file.content, { filename: file.fileName, timeout: 15000 }); + this.compiledScriptCache.set(cacheKey, script); + return script; + } + compileJsFile(file, errorsReport, cubes, contexts, exports, asyncModules, toCompile, compiledFiles, { doSyntaxCheck } = { doSyntaxCheck: false }) { if (doSyntaxCheck) { // There is no need to run syntax check for data model files @@ -382,7 +396,9 @@ export class DataSchemaCompiler { } try { - vm.runInNewContext(file.content, { + const script = this.getJsScript(file); + + script.runInNewContext({ view: (name, cube) => ( !cube ? this.cubeFactory({ ...name, fileName: file.fileName, isView: true }) : diff --git a/packages/cubejs-schema-compiler/src/compiler/PrepareCompiler.ts b/packages/cubejs-schema-compiler/src/compiler/PrepareCompiler.ts index 57f615c2b7840..d55b2db9d2b1a 100644 --- a/packages/cubejs-schema-compiler/src/compiler/PrepareCompiler.ts +++ b/packages/cubejs-schema-compiler/src/compiler/PrepareCompiler.ts @@ -1,6 +1,8 @@ import { SchemaFileRepository } from '@cubejs-backend/shared'; import { NativeInstance } from '@cubejs-backend/native'; import { v4 as uuidv4 } from 'uuid'; +import { LRUCache } from 'lru-cache'; +import vm from 'vm'; import { CubeValidator } from './CubeValidator'; import { DataSchemaCompiler } from './DataSchemaCompiler'; @@ -32,6 +34,7 @@ export type PrepareCompilerOptions = { standalone?: boolean; headCommitId?: string; adapter?: string; + compiledScriptCache?: LRUCache; }; export const prepareCompiler = (repo: SchemaFileRepository, options: PrepareCompilerOptions = {}) => { @@ -49,6 +52,8 @@ export const prepareCompiler = (repo: SchemaFileRepository, options: PrepareComp const compilerCache = new CompilerCache({ maxQueryCacheSize, maxQueryCacheAge }); const yamlCompiler = new YamlCompiler(cubeSymbols, cubeDictionary, nativeInstance, viewCompiler); + const compiledScriptCache = options.compiledScriptCache || new LRUCache({ max: 250 }); + const transpilers: TranspilerInterface[] = [ new ValidationTranspiler(), new ImportExportTranspiler(), @@ -66,6 +71,7 @@ export const prepareCompiler = (repo: SchemaFileRepository, options: PrepareComp preTranspileCubeCompilers: [cubeSymbols, cubeValidator], transpilers, viewCompilationGate, + compiledScriptCache, viewCompilers: [viewCompiler], cubeCompilers: [cubeEvaluator, joinGraph, metaTransformer], contextCompilers: [contextEvaluator], diff --git a/packages/cubejs-server-core/src/core/CompilerApi.js b/packages/cubejs-server-core/src/core/CompilerApi.js index 71c5517e5976e..739955c331bdf 100644 --- a/packages/cubejs-server-core/src/core/CompilerApi.js +++ b/packages/cubejs-server-core/src/core/CompilerApi.js @@ -1,7 +1,8 @@ import crypto from 'crypto'; import R from 'ramda'; import { createQuery, compile, queryClass, PreAggregations, QueryFactory } from '@cubejs-backend/schema-compiler'; -import { v4 as uuidv4, parse as uuidParse, stringify as uuidStringify } from 'uuid'; +import { v4 as uuidv4, parse as uuidParse } from 'uuid'; +import { LRUCache } from 'lru-cache'; import { NativeInstance } from '@cubejs-backend/native'; export class CompilerApi { @@ -29,6 +30,11 @@ export class CompilerApi { this.sqlCache = options.sqlCache; this.standalone = options.standalone; this.nativeInstance = this.createNativeInstance(); + this.compiledScriptCache = new LRUCache({ + max: options.compilerCacheSize || 250, + ttl: options.maxCompilerCacheKeepAlive, + updateAgeOnGet: options.updateCompilerCacheKeepAlive + }); } setGraphQLSchema(schema) { @@ -83,6 +89,7 @@ export class CompilerApi { allowJsDuplicatePropsInSchema: this.allowJsDuplicatePropsInSchema, standalone: this.standalone, nativeInstance: this.nativeInstance, + compiledScriptCache: this.compiledScriptCache, }); this.queryFactory = await this.createQueryFactory(compilers); diff --git a/packages/cubejs-server-core/src/core/server.ts b/packages/cubejs-server-core/src/core/server.ts index 2caa73dfe9b32..00877235dc98f 100644 --- a/packages/cubejs-server-core/src/core/server.ts +++ b/packages/cubejs-server-core/src/core/server.ts @@ -714,6 +714,9 @@ export class CubejsServerCore { standalone: this.standalone, allowNodeRequire: options.allowNodeRequire, fastReload: options.fastReload || getEnv('fastReload'), + compilerCacheSize: this.options.compilerCacheSize || 250, + maxCompilerCacheKeepAlive: this.options.maxCompilerCacheKeepAlive, + updateCompilerCacheKeepAlive: this.options.updateCompilerCacheKeepAlive }, ); } From d1ff8c8f81c5e6ee715a3b7f8d10a50d3a98679d Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Mon, 7 Apr 2025 20:33:04 +0300 Subject: [PATCH 5/6] add proactive cache cleanup --- .../cubejs-server-core/src/core/CompilerApi.js | 14 ++++++++++++++ packages/cubejs-server-core/src/core/server.ts | 4 +++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/cubejs-server-core/src/core/CompilerApi.js b/packages/cubejs-server-core/src/core/CompilerApi.js index 739955c331bdf..0a78e27edf2b2 100644 --- a/packages/cubejs-server-core/src/core/CompilerApi.js +++ b/packages/cubejs-server-core/src/core/CompilerApi.js @@ -35,6 +35,20 @@ export class CompilerApi { ttl: options.maxCompilerCacheKeepAlive, updateAgeOnGet: options.updateCompilerCacheKeepAlive }); + + // proactively free up old cache values occasionally + if (this.options.maxCompilerCacheKeepAlive) { + this.compiledScriptCacheInterval = setInterval( + () => this.compiledScriptCache.purgeStale(), + this.options.maxCompilerCacheKeepAlive + ); + } + } + + dispose() { + if (this.compiledScriptCacheInterval) { + clearInterval(this.compiledScriptCacheInterval); + } } setGraphQLSchema(schema) { diff --git a/packages/cubejs-server-core/src/core/server.ts b/packages/cubejs-server-core/src/core/server.ts index 00877235dc98f..13b300dd2ca94 100644 --- a/packages/cubejs-server-core/src/core/server.ts +++ b/packages/cubejs-server-core/src/core/server.ts @@ -204,7 +204,9 @@ export class CubejsServerCore { this.compilerCache = new LRUCache({ max: this.options.compilerCacheSize || 250, ttl: this.options.maxCompilerCacheKeepAlive, - updateAgeOnGet: this.options.updateCompilerCacheKeepAlive + updateAgeOnGet: this.options.updateCompilerCacheKeepAlive, + // needed to clear the setInterval timer for proactive cache internal cleanups + dispose: (v) => v.dispose(), }); if (this.options.contextToAppId) { From efd95f926abe5c9012e8875b8a0d66e1fe906bed Mon Sep 17 00:00:00 2001 From: Konstantin Burkalev Date: Tue, 8 Apr 2025 15:37:55 +0300 Subject: [PATCH 6/6] call compilerCache.clear() on shutdown --- packages/cubejs-server-core/src/core/server.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/cubejs-server-core/src/core/server.ts b/packages/cubejs-server-core/src/core/server.ts index 13b300dd2ca94..1c4951e60a647 100644 --- a/packages/cubejs-server-core/src/core/server.ts +++ b/packages/cubejs-server-core/src/core/server.ts @@ -876,6 +876,8 @@ export class CubejsServerCore { clearInterval(this.maxCompilerCacheKeep); } + this.compilerCache.clear(); + if (this.scheduledRefreshTimerInterval) { await this.scheduledRefreshTimerInterval.cancel(); } @@ -919,6 +921,8 @@ export class CubejsServerCore { }; public async shutdown() { + this.compilerCache.clear(); + if (this.devServer) { if (!process.env.CI) { process.removeListener('uncaughtException', this.onUncaughtException);