From e2b2c726b1c1c31794d324c3afd7c24e1f953131 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 9 Aug 2022 11:35:07 +0200 Subject: [PATCH] Fix job queue tests --- server/controllers/api/jobs.ts | 6 ++-- server/lib/job-queue/job-queue.ts | 47 ++++++++++++++++++--------- server/tests/api/check-params/logs.ts | 2 +- server/tests/api/server/jobs.ts | 13 ++++++-- 4 files changed, 45 insertions(+), 23 deletions(-) diff --git a/server/controllers/api/jobs.ts b/server/controllers/api/jobs.ts index 6a53e3083..0a45c33ab 100644 --- a/server/controllers/api/jobs.ts +++ b/server/controllers/api/jobs.ts @@ -26,7 +26,7 @@ jobsRouter.post('/pause', jobsRouter.post('/resume', authenticate, ensureUserHasRight(UserRight.MANAGE_JOBS), - resumeJobQueue + asyncMiddleware(resumeJobQueue) ) jobsRouter.get('/:state?', @@ -55,8 +55,8 @@ async function pauseJobQueue (req: express.Request, res: express.Response) { return res.sendStatus(HttpStatusCode.NO_CONTENT_204) } -function resumeJobQueue (req: express.Request, res: express.Response) { - JobQueue.Instance.resume() +async function resumeJobQueue (req: express.Request, res: express.Response) { + await JobQueue.Instance.resume() return res.sendStatus(HttpStatusCode.NO_CONTENT_204) } diff --git a/server/lib/job-queue/job-queue.ts b/server/lib/job-queue/job-queue.ts index 386d20103..14e3a00aa 100644 --- a/server/lib/job-queue/job-queue.ts +++ b/server/lib/job-queue/job-queue.ts @@ -284,18 +284,22 @@ class JobQueue { } async pause () { - for (const handler of Object.keys(this.workers)) { - const worker: Worker = this.workers[handler] + for (const handlerName of Object.keys(this.workers)) { + const worker: Worker = this.workers[handlerName] + const queue: Queue = this.queues[handlerName] await worker.pause() + await queue.pause() } } - resume () { - for (const handler of Object.keys(this.workers)) { - const worker: Worker = this.workers[handler] + async resume () { + for (const handlerName of Object.keys(this.workers)) { + const worker: Worker = this.workers[handlerName] + const queue: Queue = this.queues[handlerName] worker.resume() + await queue.resume() } } @@ -373,10 +377,10 @@ class JobQueue { }): Promise { const { state, start, count, asc, jobType } = options - const states = state ? [ state ] : jobStates - let results: Job[] = [] + const states = this.buildStateFilter(state) + const filteredJobTypes = this.buildTypeFilter(jobType) - const filteredJobTypes = this.filterJobTypes(jobType) + let results: Job[] = [] for (const jobType of filteredJobTypes) { const queue: Queue = this.queues[jobType] @@ -404,9 +408,9 @@ class JobQueue { async count (state: JobState, jobType?: JobType): Promise { const states = state ? [ state ] : jobStates - let total = 0 + const filteredJobTypes = this.buildTypeFilter(jobType) - const filteredJobTypes = this.filterJobTypes(jobType) + let total = 0 for (const type of filteredJobTypes) { const queue = this.queues[type] @@ -425,6 +429,23 @@ class JobQueue { return total } + private buildStateFilter (state?: JobState) { + if (!state) return jobStates + + const states = [ state ] + + // Include parent if filtering on waiting + if (state === 'waiting') states.push('waiting-children') + + return states + } + + private buildTypeFilter (jobType?: JobType) { + if (!jobType) return jobTypes + + return jobTypes.filter(t => t === jobType) + } + async getStats () { const promises = jobTypes.map(async t => ({ jobType: t, counts: await this.queues[t].getJobCounts() })) @@ -452,12 +473,6 @@ class JobQueue { } } - private filterJobTypes (jobType?: JobType) { - if (!jobType) return jobTypes - - return jobTypes.filter(t => t === jobType) - } - private getJobConcurrency (jobType: JobType) { if (jobType === 'video-transcoding') return CONFIG.TRANSCODING.CONCURRENCY if (jobType === 'video-import') return CONFIG.IMPORT.VIDEOS.CONCURRENCY diff --git a/server/tests/api/check-params/logs.ts b/server/tests/api/check-params/logs.ts index fa67408b7..f9a99796d 100644 --- a/server/tests/api/check-params/logs.ts +++ b/server/tests/api/check-params/logs.ts @@ -122,7 +122,7 @@ describe('Test logs API validators', function () { }) it('Should fail with an invalid stackTrace', async function () { - await server.logs.createLogClient({ payload: { ...base, stackTrace: 's'.repeat(10000) }, expectedStatus }) + await server.logs.createLogClient({ payload: { ...base, stackTrace: 's'.repeat(20000) }, expectedStatus }) }) it('Should fail with an invalid userAgent', async function () { diff --git a/server/tests/api/server/jobs.ts b/server/tests/api/server/jobs.ts index 96ab2a576..843e148a3 100644 --- a/server/tests/api/server/jobs.ts +++ b/server/tests/api/server/jobs.ts @@ -60,7 +60,6 @@ describe('Test jobs', function () { if (job.type === 'videos-views-stats') job = body.data[1] expect(job.state).to.equal('completed') - expect(job.type.startsWith('activitypub-')).to.be.true expect(dateIsValid(job.createdAt as string)).to.be.true expect(dateIsValid(job.processedOn as string)).to.be.true expect(dateIsValid(job.finishedOn as string)).to.be.true @@ -103,8 +102,16 @@ describe('Test jobs', function () { await wait(5000) - const body = await servers[1].jobs.list({ state: 'waiting', jobType: 'video-transcoding' }) - expect(body.data).to.have.lengthOf(4) + { + const body = await servers[1].jobs.list({ state: 'waiting', jobType: 'video-transcoding' }) + // waiting includes waiting-children + expect(body.data).to.have.lengthOf(4) + } + + { + const body = await servers[1].jobs.list({ state: 'waiting-children', jobType: 'video-transcoding' }) + expect(body.data).to.have.lengthOf(1) + } }) it('Should resume the job queue', async function () { -- 2.41.0