repositories
/
poolifier.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
chore: v2.6.32
[poolifier.git]
/
src
/
pools
/
abstract-pool.ts
diff --git
a/src/pools/abstract-pool.ts
b/src/pools/abstract-pool.ts
index f0119f4ed3c8135e596d171a0f6ec093d7b29935..a4d83b593cd52b4927aa480f557227e788d6cfeb 100644
(file)
--- a/
src/pools/abstract-pool.ts
+++ b/
src/pools/abstract-pool.ts
@@
-93,6
+93,10
@@
export abstract class AbstractPool<
* Whether the pool is starting or not.
*/
private readonly starting: boolean
* Whether the pool is starting or not.
*/
private readonly starting: boolean
+ /**
+ * Whether the pool is started or not.
+ */
+ private started: boolean
/**
* The start timestamp of the pool.
*/
/**
* The start timestamp of the pool.
*/
@@
-141,6
+145,7
@@
export abstract class AbstractPool<
this.starting = true
this.startPool()
this.starting = false
this.starting = true
this.startPool()
this.starting = false
+ this.started = true
this.startTimestamp = performance.now()
}
this.startTimestamp = performance.now()
}
@@
-723,6
+728,9
@@
export abstract class AbstractPool<
transferList?: TransferListItem[]
): Promise<Response> {
return await new Promise<Response>((resolve, reject) => {
transferList?: TransferListItem[]
): Promise<Response> {
return await new Promise<Response>((resolve, reject) => {
+ if (!this.started) {
+ reject(new Error('Cannot execute a task on destroyed pool'))
+ }
if (name != null && typeof name !== 'string') {
reject(new TypeError('name argument must be a string'))
}
if (name != null && typeof name !== 'string') {
reject(new TypeError('name argument must be a string'))
}
@@
-783,6
+791,7
@@
export abstract class AbstractPool<
})
)
this.emitter?.emit(PoolEvents.destroy, this.info)
})
)
this.emitter?.emit(PoolEvents.destroy, this.info)
+ this.started = false
}
protected async sendKillMessageToWorker (
}
protected async sendKillMessageToWorker (
@@
-912,13
+921,6
@@
export abstract class AbstractPool<
workerTaskStatistics.executing > 0
) {
--workerTaskStatistics.executing
workerTaskStatistics.executing > 0
) {
--workerTaskStatistics.executing
- } else if (
- workerTaskStatistics.executing != null &&
- workerTaskStatistics.executing < 0
- ) {
- throw new Error(
- 'Worker usage statistic for tasks executing cannot be negative'
- )
}
if (message.taskError == null) {
++workerTaskStatistics.executed
}
if (message.taskError == null) {
++workerTaskStatistics.executed
@@
-1050,7
+1052,11
@@
export abstract class AbstractPool<
workerInfo.ready = false
this.workerNodes[workerNodeKey].closeChannel()
this.emitter?.emit(PoolEvents.error, error)
workerInfo.ready = false
this.workerNodes[workerNodeKey].closeChannel()
this.emitter?.emit(PoolEvents.error, error)
- if (this.opts.restartWorkerOnError === true && !this.starting) {
+ if (
+ this.opts.restartWorkerOnError === true &&
+ !this.starting &&
+ this.started
+ ) {
if (workerInfo.dynamic) {
this.createAndSetupDynamicWorkerNode()
} else {
if (workerInfo.dynamic) {
this.createAndSetupDynamicWorkerNode()
} else {
@@
-1174,27
+1180,25
@@
export abstract class AbstractPool<
}
private redistributeQueuedTasks (workerNodeKey: number): void {
}
private redistributeQueuedTasks (workerNodeKey: number): void {
+ const workerNodes = this.workerNodes.filter(
+ (_, workerNodeId) => workerNodeId !== workerNodeKey
+ )
while (this.tasksQueueSize(workerNodeKey) > 0) {
let targetWorkerNodeKey: number = workerNodeKey
let minQueuedTasks = Infinity
let executeTask = false
while (this.tasksQueueSize(workerNodeKey) > 0) {
let targetWorkerNodeKey: number = workerNodeKey
let minQueuedTasks = Infinity
let executeTask = false
- for (const [workerNodeId, workerNode] of
this.
workerNodes.entries()) {
+ for (const [workerNodeId, workerNode] of workerNodes.entries()) {
if (
if (
-
this.workerNodes[workerNodeId]
.usage.tasks.executing <
+
workerNode
.usage.tasks.executing <
(this.opts.tasksQueueOptions?.concurrency as number)
) {
executeTask = true
}
(this.opts.tasksQueueOptions?.concurrency as number)
) {
executeTask = true
}
- if (
- workerNodeId !== workerNodeKey &&
- workerNode.info.ready &&
- workerNode.usage.tasks.queued === 0
- ) {
+ if (workerNode.info.ready && workerNode.usage.tasks.queued === 0) {
targetWorkerNodeKey = workerNodeId
break
}
if (
targetWorkerNodeKey = workerNodeId
break
}
if (
- workerNodeId !== workerNodeKey &&
workerNode.info.ready &&
workerNode.usage.tasks.queued < minQueuedTasks
) {
workerNode.info.ready &&
workerNode.usage.tasks.queued < minQueuedTasks
) {
@@
-1205,12
+1209,12
@@
export abstract class AbstractPool<
if (executeTask) {
this.executeTask(
targetWorkerNodeKey,
if (executeTask) {
this.executeTask(
targetWorkerNodeKey,
- this.
pop
Task(workerNodeKey) as Task<Data>
+ this.
dequeue
Task(workerNodeKey) as Task<Data>
)
} else {
this.enqueueTask(
targetWorkerNodeKey,
)
} else {
this.enqueueTask(
targetWorkerNodeKey,
- this.
pop
Task(workerNodeKey) as Task<Data>
+ this.
dequeue
Task(workerNodeKey) as Task<Data>
)
}
}
)
}
}
@@
-1229,25
+1233,22
@@
export abstract class AbstractPool<
if (
workerNode.info.ready &&
sourceWorkerNode.usage.tasks.queued > 0 &&
if (
workerNode.info.ready &&
sourceWorkerNode.usage.tasks.queued > 0 &&
- !workerNode.hasBackPressure() &&
- workerNode.usage.tasks.executing <
- (this.opts.tasksQueueOptions?.concurrency as number)
+ !workerNode.hasBackPressure()
) {
) {
- this.executeTask(
- workerNodeKey,
- sourceWorkerNode.popTask() as Task<Data>
- )
- } else if (
- workerNode.info.ready &&
- sourceWorkerNode.usage.tasks.queued > 0 &&
- !workerNode.hasBackPressure() &&
- workerNode.usage.tasks.executing >=
+ if (
+ workerNode.usage.tasks.executing <
(this.opts.tasksQueueOptions?.concurrency as number)
(this.opts.tasksQueueOptions?.concurrency as number)
- ) {
- this.enqueueTask(
- workerNodeKey,
- sourceWorkerNode.popTask() as Task<Data>
- )
+ ) {
+ this.executeTask(
+ workerNodeKey,
+ sourceWorkerNode.popTask() as Task<Data>
+ )
+ } else {
+ this.enqueueTask(
+ workerNodeKey,
+ sourceWorkerNode.popTask() as Task<Data>
+ )
+ }
}
}
}
}
}
}
@@
-1426,10
+1427,6
@@
export abstract class AbstractPool<
return this.workerNodes[workerNodeKey].dequeueTask()
}
return this.workerNodes[workerNodeKey].dequeueTask()
}
- private popTask (workerNodeKey: number): Task<Data> | undefined {
- return this.workerNodes[workerNodeKey].popTask()
- }
-
private tasksQueueSize (workerNodeKey: number): number {
return this.workerNodes[workerNodeKey].tasksQueueSize()
}
private tasksQueueSize (workerNodeKey: number): number {
return this.workerNodes[workerNodeKey].tasksQueueSize()
}