multi-tasks 3.1.5 → 3.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -263,12 +263,13 @@ Unlike `retry_fails` (which re-runs only the failed tasks), `restart` re-runs **
263
263
 
264
264
  ### Changelog:
265
265
 
266
+ - 3.1.6 Fix silent task loss under heavy load with maxTaskRetries
266
267
  - 3.1.5 Update README
267
- - 3.1.4 Rewrite `multiTasks.resume`, `multiTasks.retry_fails` and `multiTasks.restart`
268
+ - 3.1.4 Rewrite methods multiTasks.resume/retry_fails/restart
268
269
  - 3.1.3 Update README
269
270
  - 3.1.2 Update README
270
271
  - 3.1.1 Fix readme documentation
271
- - 3.1.0 Support worker broadcast ('helper.emit' and 'helper.setListener') and system events ('helper.emitSys' and 'setSysListener', with built-in 'TERMINATE_ALL_WORKERS'); default numberOfWorkers is now "50%" of CPU cores (was core count minus 1)
272
+ - 3.1.0 Support worker broadcast and system events; default numberOfWorkers is now "50%" of CPU cores
272
273
  - 3.0.4 numberOfWorkers accepts a percentage string of CPU cores, e.g. "50%"
273
274
  - 3.0.3 Support 'maxTaskRetries'
274
275
  - 3.0.2 Support 'taskTimeout'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "multi-tasks",
3
- "version": "3.1.5",
3
+ "version": "3.1.6",
4
4
  "description": "Multi-process task scheduling based on Node.js cluster, with crash resume and failed-task restart support",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -309,7 +309,7 @@ function runTask(config, subTask, subTaskLog){
309
309
  resultData = data;
310
310
  }).catch((ex)=>{
311
311
  errors.push({ex: serializeError(ex)});
312
- }).finally(()=>{
312
+ }).finally(async ()=>{
313
313
  let {startTimestamp} = subTaskLog;
314
314
  let endTimestamp = new Date()*1;
315
315
  let cost = endTimestamp - startTimestamp;
@@ -325,8 +325,14 @@ function runTask(config, subTask, subTaskLog){
325
325
  let retryCount = TaskMgr.incrementTaskRetry(subTask.subid);
326
326
  if(retryCount <= config.maxTaskRetries){
327
327
  console.warn(`[Task Retry] "${subTask.subid}" failed, retry (${retryCount}/${config.maxTaskRetries})`);
328
- TaskMgr.mvTask(subTask.subid, 'running', 'new', ()=>{});
329
328
  retried = true;
329
+ //等 rename 落盘再 resolve/请求新任务: fire-and-forget 的异步 rename 会随 worker 被
330
+ //autoClose 杀掉而消亡, 任务文件滞留 running 被静默丢弃(高负载偶发丢任务的根因, 勿回退)
331
+ try{
332
+ await TaskMgr.mvTaskPromise(subTask.subid, 'running', 'new');
333
+ }catch(newPath){
334
+ console.warn(`[Task Retry] "${subTask.subid}" failed to move back to new, left in running (recoverable via resume)`);
335
+ };
330
336
  };
331
337
  };
332
338
  TaskMgr.saveTaskLog(subTask.subid, subTaskLog);