Skip to content

Commit

Permalink
fix: duplicate binary task (#354)
Browse files Browse the repository at this point in the history
> syncBinary 目前会通过定时任务单机每天创建,导致多实例冲突
> 其他任务类型均通过事件触发不受影响
* 创建 syncBinary 任务时,手动去重
* 添加 bizId 参数 进行兜底
  • Loading branch information
elrrrrrrr authored Nov 12, 2022
1 parent 0ada89b commit d6c4cf5
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 1 deletion.
1 change: 1 addition & 0 deletions app/core/entity/Task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ export class Task<T extends TaskBaseData = TaskBaseData> extends Entity {
targetName,
authorId: `pid_${PID}`,
authorIp: HOST_NAME,
bizId: `SyncBinary:${targetName}`,
data: {
// task execute worker
taskWorker: '',
Expand Down
15 changes: 14 additions & 1 deletion app/core/service/BinarySyncerService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import { ElectronBinary } from '../../common/adapter/binary/ElectronBinary';
import { NodePreGypBinary } from '../../common/adapter/binary/NodePreGypBinary';
import { ImageminBinary } from '../../common/adapter/binary/ImageminBinary';
import { PlaywrightBinary } from '../../common/adapter/binary/PlaywrightBinary';
import { TaskRepository } from 'app/repository/TaskRepository';

const BinaryClasses = {
[SyncerClass.NodeBinary]: NodeBinary,
Expand Down Expand Up @@ -58,6 +59,8 @@ export class BinarySyncerService extends AbstractService {
@Inject()
private readonly taskService: TaskService;
@Inject()
private readonly taskRepository: TaskRepository;
@Inject()
private readonly httpclient: EggContextHttpClient;
@Inject()
private readonly nfsAdapter: NFSAdapter;
Expand All @@ -78,8 +81,18 @@ export class BinarySyncerService extends AbstractService {
return await this.nfsAdapter.getDownloadUrlOrStream(binary.storePath);
}

// SyncBinary 由定时任务每台单机定时触发,手动去重
// 添加 bizId 在 db 防止重复,记录 id 错误
public async createTask(binaryName: string, lastData?: any) {
return await this.taskService.createTask(Task.createSyncBinary(binaryName, lastData), false);
const existsTask = await this.taskRepository.findTaskByTargetName(binaryName, TaskType.SyncBinary);
if (existsTask) {
return existsTask;
}
try {
return await this.taskService.createTask(Task.createSyncBinary(binaryName, lastData), false);
} catch (e) {
this.logger.error('[BinarySyncerService.createTask] binaryName: %s, error: %s', binaryName, e);
}
}

public async findTask(taskId: string) {
Expand Down
27 changes: 27 additions & 0 deletions test/core/service/BinarySyncerService/createTask.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import assert = require('assert');
import { app } from 'egg-mock/bootstrap';
import { Context } from 'egg';
import { BinarySyncerService } from 'app/core/service/BinarySyncerService';

describe('test/core/service/BinarySyncerService/createTask.test.ts', () => {
let ctx: Context;
let binarySyncerService: BinarySyncerService;

beforeEach(async () => {
ctx = await app.mockModuleContext();
binarySyncerService = await ctx.getEggObject(BinarySyncerService);
});

afterEach(async () => {
await app.destroyModuleContext(ctx);
});

describe('createTask()', () => {
it('should ignore duplicate binary task', async () => {
const task = await binarySyncerService.createTask('banana', {});
const newTask = await binarySyncerService.createTask('banana', {});
assert(task?.taskId === newTask?.taskId);
assert(task?.bizId === 'SyncBinary:banana');
});
});
});

0 comments on commit d6c4cf5

Please sign in to comment.