import express, { UploadFiles } from 'express'
+import { retryTransactionWrapper } from '@server/helpers/database-utils'
import { createReqFiles } from '@server/helpers/express-utils'
import { logger, loggerTagsFactory } from '@server/helpers/logger'
import { generateRunnerJobToken } from '@server/helpers/token-generator'
import {
abortRunnerJobValidator,
acceptRunnerJobValidator,
+ cancelRunnerJobValidator,
errorRunnerJobValidator,
getRunnerFromTokenValidator,
jobOfRunnerGetValidator,
RunnerJobType,
RunnerJobUpdateBody,
RunnerJobUpdatePayload,
+ ServerErrorCode,
UserRight,
+ VideoStudioTranscodingSuccess,
VODAudioMergeTranscodingSuccess,
VODHLSTranscodingSuccess,
VODWebVideoTranscodingSuccess
authenticate,
ensureUserHasRight(UserRight.MANAGE_RUNNERS),
asyncMiddleware(runnerJobGetValidator),
+ cancelRunnerJobValidator,
asyncMiddleware(cancelRunnerJob)
)
const runner = res.locals.runner
const runnerJob = res.locals.runnerJob
- runnerJob.state = RunnerJobState.PROCESSING
- runnerJob.processingJobToken = generateRunnerJobToken()
- runnerJob.startedAt = new Date()
- runnerJob.runnerId = runner.id
+ const newRunnerJob = await retryTransactionWrapper(() => {
+ return sequelizeTypescript.transaction(async transaction => {
+ await runnerJob.reload({ transaction })
- const newRunnerJob = await sequelizeTypescript.transaction(transaction => {
- return runnerJob.save({ transaction })
+ if (runnerJob.state !== RunnerJobState.PENDING) {
+ res.fail({
+ type: ServerErrorCode.RUNNER_JOB_NOT_IN_PENDING_STATE,
+ message: 'This job is not in pending state anymore',
+ status: HttpStatusCode.CONFLICT_409
+ })
+
+ return undefined
+ }
+
+ runnerJob.state = RunnerJobState.PROCESSING
+ runnerJob.processingJobToken = generateRunnerJobToken()
+ runnerJob.startedAt = new Date()
+ runnerJob.runnerId = runner.id
+
+ return runnerJob.save({ transaction })
+ })
})
+ if (!newRunnerJob) return
+
newRunnerJob.Runner = runner as RunnerModel
const result: AcceptRunnerJobResult = {
}
},
+ 'video-studio-transcoding': (payload: VideoStudioTranscodingSuccess, files) => {
+ return {
+ ...payload,
+
+ videoFile: files['payload[videoFile]'][0].path
+ }
+ },
+
'live-rtmp-hls-transcoding': () => ({})
}
async function cancelRunnerJob (req: express.Request, res: express.Response) {
const runnerJob = res.locals.runnerJob
- logger.info('Cancelling job %s (%s)', runnerJob.type, lTags(runnerJob.uuid, runnerJob.type))
+ logger.info('Cancelling job %s (%s)', runnerJob.uuid, runnerJob.type, lTags(runnerJob.uuid, runnerJob.type))
const RunnerJobHandler = getRunnerJobHandlerClass(runnerJob)
await new RunnerJobHandler().cancel({ runnerJob })