runTimeHistory: new CircularArray(),
avgRunTime: 0,
medRunTime: 0,
+ waitTime: 0,
+ waitTimeHistory: new CircularArray(),
+ avgWaitTime: 0,
+ medWaitTime: 0,
error: 0
})
}
/** @inheritDoc */
public async execute (data?: Data, name?: string): Promise<Response> {
+ const submissionTimestamp = performance.now()
const workerNodeKey = this.chooseWorkerNode()
const submittedTask: Task<Data> = {
name,
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
data: data ?? ({} as Data),
+ submissionTimestamp,
id: crypto.randomUUID()
}
const res = new Promise<Response>((resolve, reject) => {
if (message.error != null) {
++workerTasksUsage.error
}
+ this.updateRunTimeTasksUsage(workerTasksUsage, message)
+ this.updateWaitTimeTasksUsage(workerTasksUsage, message)
+ }
+
+ private updateRunTimeTasksUsage (
+ workerTasksUsage: TasksUsage,
+ message: MessageValue<Response>
+ ): void {
if (this.workerChoiceStrategyContext.getRequiredStatistics().runTime) {
workerTasksUsage.runTime += message.runTime ?? 0
if (
}
}
+ private updateWaitTimeTasksUsage (
+ workerTasksUsage: TasksUsage,
+ message: MessageValue<Response>
+ ): void {
+ if (this.workerChoiceStrategyContext.getRequiredStatistics().waitTime) {
+ workerTasksUsage.waitTime += message.waitTime ?? 0
+ if (
+ this.workerChoiceStrategyContext.getRequiredStatistics().avgWaitTime &&
+ workerTasksUsage.run !== 0
+ ) {
+ workerTasksUsage.avgWaitTime =
+ workerTasksUsage.waitTime / workerTasksUsage.run
+ }
+ if (
+ this.workerChoiceStrategyContext.getRequiredStatistics().medWaitTime &&
+ message.waitTime != null
+ ) {
+ workerTasksUsage.waitTimeHistory.push(message.waitTime)
+ workerTasksUsage.medWaitTime = median(workerTasksUsage.waitTimeHistory)
+ }
+ }
+ }
+
/**
* Chooses a worker node for the next task.
*
runTimeHistory: new CircularArray(),
avgRunTime: 0,
medRunTime: 0,
+ waitTime: 0,
+ waitTimeHistory: new CircularArray(),
+ avgWaitTime: 0,
+ medWaitTime: 0,
error: 0
},
tasksQueue: new Queue<Task<Data>>()