X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Fpools%2Fabstract-pool.ts;h=3c690fb819e9c718163e86badcde28786a5dd849;hb=e460940e8d2a41a846b2334d54410807ffc2f421;hp=db0d5455d7987002ae5cd8fd5fe8a4ea231942bb;hpb=8604aaabd5aef29ed9b824a2d1dcdb53490ea8ad;p=poolifier.git diff --git a/src/pools/abstract-pool.ts b/src/pools/abstract-pool.ts index db0d5455..3c690fb8 100644 --- a/src/pools/abstract-pool.ts +++ b/src/pools/abstract-pool.ts @@ -462,9 +462,15 @@ export abstract class AbstractPool< * Can be overridden. * * @param workerNodeKey - The worker node key. + * @param task - The task to execute. */ - protected beforeTaskExecutionHook (workerNodeKey: number): void { - ++this.workerNodes[workerNodeKey].workerUsage.tasks.executing + protected beforeTaskExecutionHook ( + workerNodeKey: number, + task: Task + ): void { + const workerUsage = this.workerNodes[workerNodeKey].workerUsage + ++workerUsage.tasks.executing + this.updateWaitTimeWorkerUsage(workerUsage, task) } /** @@ -486,9 +492,7 @@ export abstract class AbstractPool< if (message.taskError != null) { ++workerTaskStatistics.failed } - this.updateRunTimeWorkerUsage(workerUsage, message) - this.updateWaitTimeWorkerUsage(workerUsage, message) this.updateEluWorkerUsage(workerUsage, message) } @@ -498,19 +502,20 @@ export abstract class AbstractPool< ): void { if ( this.workerChoiceStrategyContext.getTaskStatisticsRequirements().runTime + .aggregate ) { - workerUsage.runTime.aggregation += message.taskPerformance?.runTime ?? 0 + workerUsage.runTime.aggregate += message.taskPerformance?.runTime ?? 0 if ( - this.workerChoiceStrategyContext.getTaskStatisticsRequirements() - .avgRunTime && + this.workerChoiceStrategyContext.getTaskStatisticsRequirements().runTime + .average && workerUsage.tasks.executed !== 0 ) { workerUsage.runTime.average = - workerUsage.runTime.aggregation / workerUsage.tasks.executed + workerUsage.runTime.aggregate / workerUsage.tasks.executed } if ( - this.workerChoiceStrategyContext.getTaskStatisticsRequirements() - .medRunTime && + this.workerChoiceStrategyContext.getTaskStatisticsRequirements().runTime + .median && message.taskPerformance?.runTime != null ) { workerUsage.runTime.history.push(message.taskPerformance.runTime) @@ -521,26 +526,29 @@ export abstract class AbstractPool< private updateWaitTimeWorkerUsage ( workerUsage: WorkerUsage, - message: MessageValue + task: Task ): void { + const timestamp = performance.now() + const taskWaitTime = timestamp - (task.timestamp ?? timestamp) if ( this.workerChoiceStrategyContext.getTaskStatisticsRequirements().waitTime + .aggregate ) { - workerUsage.waitTime.aggregation += message.taskPerformance?.waitTime ?? 0 + workerUsage.waitTime.aggregate += taskWaitTime ?? 0 if ( this.workerChoiceStrategyContext.getTaskStatisticsRequirements() - .avgWaitTime && + .waitTime.average && workerUsage.tasks.executed !== 0 ) { workerUsage.waitTime.average = - workerUsage.waitTime.aggregation / workerUsage.tasks.executed + workerUsage.waitTime.aggregate / workerUsage.tasks.executed } if ( this.workerChoiceStrategyContext.getTaskStatisticsRequirements() - .medWaitTime && - message.taskPerformance?.waitTime != null + .waitTime.median && + taskWaitTime != null ) { - workerUsage.waitTime.history.push(message.taskPerformance.waitTime) + workerUsage.waitTime.history.push(taskWaitTime) workerUsage.waitTime.median = median(workerUsage.waitTime.history) } } @@ -781,7 +789,7 @@ export abstract class AbstractPool< } private executeTask (workerNodeKey: number, task: Task): void { - this.beforeTaskExecutionHook(workerNodeKey) + this.beforeTaskExecutionHook(workerNodeKey, task) this.sendToWorker(this.workerNodes[workerNodeKey].worker, task) } @@ -819,10 +827,7 @@ export abstract class AbstractPool< statistics: { runTime: this.workerChoiceStrategyContext.getTaskStatisticsRequirements() - .runTime, - waitTime: - this.workerChoiceStrategyContext.getTaskStatisticsRequirements() - .waitTime, + .runTime.aggregate, elu: this.workerChoiceStrategyContext.getTaskStatisticsRequirements() .elu } @@ -831,15 +836,15 @@ export abstract class AbstractPool< private getWorkerUsage (worker: Worker): WorkerUsage { return { - tasks: this.getTaskStatistics(this, worker), + tasks: this.getTaskStatistics(worker), runTime: { - aggregation: 0, + aggregate: 0, average: 0, median: 0, history: new CircularArray() }, waitTime: { - aggregation: 0, + aggregate: 0, average: 0, median: 0, history: new CircularArray() @@ -848,15 +853,14 @@ export abstract class AbstractPool< } } - private getTaskStatistics ( - self: AbstractPool, - worker: Worker - ): TaskStatistics { + private getTaskStatistics (worker: Worker): TaskStatistics { + const queueSize = + this.workerNodes[this.getWorkerNodeKey(worker)]?.tasksQueue?.size return { executed: 0, executing: 0, get queued (): number { - return self.tasksQueueSize(self.getWorkerNodeKey(worker)) + return queueSize ?? 0 }, failed: 0 }