Merge pull request #6768 from vvlladd28/improvement/js-executor/script-map/frequirence
[3.4] JS-executor: Improvement logs and clear cache
This commit is contained in:
commit
2eaa4660bf
@ -32,15 +32,17 @@ const maxActiveScripts = Number(config.get('script.max_active_scripts'));
|
||||
const slowQueryLogMs = Number(config.get('script.slow_query_log_ms'));
|
||||
const slowQueryLogBody = config.get('script.slow_query_log_body') === 'true';
|
||||
|
||||
const {performance} = require('perf_hooks');
|
||||
const { performance } = require('node:perf_hooks');
|
||||
|
||||
function JsInvokeMessageProcessor(producer) {
|
||||
this.producer = producer;
|
||||
this.executor = new JsExecutor(useSandbox);
|
||||
this.scriptMap = new Map();
|
||||
this.scriptIds = [];
|
||||
this.executedScriptIdsCounter = [];
|
||||
this.executedScriptsCounter = 0;
|
||||
this.lastStatTime = performance.now();
|
||||
this.compilationTime = 0;
|
||||
}
|
||||
|
||||
JsInvokeMessageProcessor.prototype.onJsInvokeMessage = function (message) {
|
||||
@ -125,7 +127,8 @@ JsInvokeMessageProcessor.prototype.processInvokeRequest = function (requestId, r
|
||||
const msSinceLastStat = nowMs - this.lastStatTime;
|
||||
const requestsPerSec = msSinceLastStat == 0 ? statFrequency : statFrequency / msSinceLastStat * 1000;
|
||||
this.lastStatTime = nowMs;
|
||||
logger.info('STAT[%s]: requests [%s], took [%s]ms, request/s [%s]', this.executedScriptsCounter, statFrequency, msSinceLastStat, requestsPerSec);
|
||||
logger.info('STAT[%s]: requests [%s], took [%s]ms, request/s [%s], compilation [%s]ms', this.executedScriptsCounter, statFrequency, msSinceLastStat, requestsPerSec, this.compilationTime);
|
||||
this.compilationTime = 0;
|
||||
}
|
||||
|
||||
if (this.executedScriptsCounter % scriptBodyTraceFrequency == 0) {
|
||||
@ -167,6 +170,7 @@ JsInvokeMessageProcessor.prototype.processReleaseRequest = function (requestId,
|
||||
var index = this.scriptIds.indexOf(scriptId);
|
||||
if (index > -1) {
|
||||
this.scriptIds.splice(index, 1);
|
||||
this.executedScriptIdsCounter.splice(index, 1);
|
||||
}
|
||||
this.scriptMap.delete(scriptId);
|
||||
}
|
||||
@ -198,14 +202,18 @@ JsInvokeMessageProcessor.prototype.getOrCompileScript = function (scriptId, scri
|
||||
return new Promise(function (resolve, reject) {
|
||||
const script = self.scriptMap.get(scriptId);
|
||||
if (script) {
|
||||
incrementUseScriptId.call(self, scriptId);
|
||||
resolve(script);
|
||||
} else {
|
||||
const startTime = performance.now();
|
||||
self.executor.compileScript(scriptBody).then(
|
||||
(compiledScript) => {
|
||||
self.compilationTime += (performance.now() - startTime);
|
||||
self.cacheScript(scriptId, compiledScript);
|
||||
resolve(compiledScript);
|
||||
},
|
||||
(err) => {
|
||||
self.compilationTime += (performance.now() - startTime);
|
||||
reject(err);
|
||||
}
|
||||
);
|
||||
@ -216,11 +224,10 @@ JsInvokeMessageProcessor.prototype.getOrCompileScript = function (scriptId, scri
|
||||
JsInvokeMessageProcessor.prototype.cacheScript = function (scriptId, script) {
|
||||
if (!this.scriptMap.has(scriptId)) {
|
||||
this.scriptIds.push(scriptId);
|
||||
this.executedScriptIdsCounter.push(0);
|
||||
while (this.scriptIds.length > maxActiveScripts) {
|
||||
logger.info('Active scripts count [%s] exceeds maximum limit [%s]', this.scriptIds.length, maxActiveScripts);
|
||||
const prevScriptId = this.scriptIds.shift();
|
||||
logger.info('Removing active script with id [%s]', prevScriptId);
|
||||
this.scriptMap.delete(prevScriptId);
|
||||
deleteMinUsedScript.apply(this);
|
||||
}
|
||||
}
|
||||
this.scriptMap.set(scriptId, script);
|
||||
@ -291,4 +298,27 @@ function getScriptId(request) {
|
||||
return Utils.toUUIDString(request.scriptIdMSB, request.scriptIdLSB);
|
||||
}
|
||||
|
||||
function incrementUseScriptId(scriptId) {
|
||||
const index = this.scriptIds.indexOf(scriptId);
|
||||
if (this.executedScriptIdsCounter[index] < Number.MAX_SAFE_INTEGER) {
|
||||
this.executedScriptIdsCounter[index]++;
|
||||
}
|
||||
}
|
||||
|
||||
function deleteMinUsedScript() {
|
||||
let min = Infinity;
|
||||
let minIndex = 0;
|
||||
const scriptIdsLength = this.executedScriptIdsCounter.length - 1; // ignored last added script
|
||||
for (let i = 0; i < scriptIdsLength; i++) {
|
||||
if (this.executedScriptIdsCounter[i] < min) {
|
||||
min = this.executedScriptIdsCounter[i];
|
||||
minIndex = i;
|
||||
}
|
||||
}
|
||||
const prevScriptId = this.scriptIds.splice(minIndex, 1)[0];
|
||||
this.executedScriptIdsCounter.splice(minIndex, 1)
|
||||
logger.info('Removing active script with id [%s]', prevScriptId);
|
||||
this.scriptMap.delete(prevScriptId);
|
||||
}
|
||||
|
||||
module.exports = JsInvokeMessageProcessor;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user