More robust transcoding jobs
authorChocobozzz <florian.bigard@gmail.com>
Tue, 17 Oct 2017 13:37:40 +0000 (15:37 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Tue, 17 Oct 2017 13:37:40 +0000 (15:37 +0200)
server/lib/jobs/handlers/index.ts
server/lib/jobs/handlers/video-file-optimizer.ts
server/lib/jobs/handlers/video-file-transcoder.ts
server/lib/jobs/job-scheduler.ts
server/tests/api/multiple-pods.ts

index 5941427a11e2034d11e4c9ce576a160af9bb2f9e..cef1f89a90e5c66cd53c7b954b02dd533d31d016 100644 (file)
@@ -2,7 +2,7 @@ import * as videoFileOptimizer from './video-file-optimizer'
 import * as videoFileTranscoder from './video-file-transcoder'
 
 export interface JobHandler<T> {
-  process (data: object): T
+  process (data: object, jobId: number): T
   onError (err: Error, jobId: number)
   onSuccess (jobId: number, jobResult: T)
 }
index a87ce52dc3bf74a60bc1938132e8122f8804ac96..63a51064c9c59f3e9118cf9bbe65fe55a5778985 100644 (file)
@@ -6,8 +6,14 @@ import { VideoInstance } from '../../../models'
 import { addVideoToFriends } from '../../friends'
 import { JobScheduler } from '../job-scheduler'
 
-function process (data: { videoUUID: string }) {
+function process (data: { videoUUID: string }, jobId: number) {
   return db.Video.loadByUUIDAndPopulateAuthorAndPodAndTags(data.videoUUID).then(video => {
+    // No video, maybe deleted?
+    if (!video) {
+      logger.info('Do not process job %d, video does not exist.', jobId, { videoUUID: video.uuid })
+      return undefined
+    }
+
     return video.optimizeOriginalVideofile().then(() => video)
   })
 }
@@ -18,6 +24,8 @@ function onError (err: Error, jobId: number) {
 }
 
 function onSuccess (jobId: number, video: VideoInstance) {
+  if (video === undefined) return undefined
+
   logger.info('Job %d is a success.', jobId)
 
   video.toAddRemoteJSON()
index 0e45b4dca510e60196935e4a72455b34f171e8d5..0dafee566a08639cfb65f4d86d26853fb68bcd35 100644 (file)
@@ -4,8 +4,14 @@ import { logger } from '../../../helpers'
 import { VideoInstance } from '../../../models'
 import { VideoResolution } from '../../../../shared'
 
-function process (data: { videoUUID: string, resolution: VideoResolution }) {
+function process (data: { videoUUID: string, resolution: VideoResolution }, jobId: number) {
   return db.Video.loadByUUIDAndPopulateAuthorAndPodAndTags(data.videoUUID).then(video => {
+    // No video, maybe deleted?
+    if (!video) {
+      logger.info('Do not process job %d, video does not exist.', jobId, { videoUUID: video.uuid })
+      return undefined
+    }
+
     return video.transcodeOriginalVideofile(data.resolution).then(() => video)
   })
 }
@@ -16,6 +22,8 @@ function onError (err: Error, jobId: number) {
 }
 
 function onSuccess (jobId: number, video: VideoInstance) {
+  if (video === undefined) return undefined
+
   logger.info('Job %d is a success.', jobId)
 
   const remoteVideo = video.toUpdateRemoteJSON()
index 134d270c08c2889cdb6121b638f1771cd0010fdf..c2409d20c4e9d28f9fe8c7c24bd81204823dd92a 100644 (file)
@@ -87,7 +87,7 @@ class JobScheduler {
     job.state = JOB_STATES.PROCESSING
     return job.save()
       .then(() => {
-        return jobHandler.process(job.handlerInputData)
+        return jobHandler.process(job.handlerInputData, job.id)
       })
       .then(
         result => {
index 8b60ac0f420548eb9a05a60a5006a854bd99dfec..6c11aace5fc4ec26188d00193232d40fa6d1514f 100644 (file)
@@ -195,17 +195,17 @@ describe('Test multiple pods', function () {
         const file240p = video.files.find(f => f.resolution === 240)
         expect(file240p).not.to.be.undefined
         expect(file240p.resolutionLabel).to.equal('240p')
-        expect(file240p.size).to.be.above(130000).and.below(150000)
+        expect(file240p.size).to.be.above(180000).and.below(200000)
 
         const file360p = video.files.find(f => f.resolution === 360)
         expect(file360p).not.to.be.undefined
         expect(file360p.resolutionLabel).to.equal('360p')
-        expect(file360p.size).to.be.above(160000).and.below(180000)
+        expect(file360p.size).to.be.above(270000).and.below(290000)
 
         const file480p = video.files.find(f => f.resolution === 480)
         expect(file480p).not.to.be.undefined
         expect(file480p.resolutionLabel).to.equal('480p')
-        expect(file480p.size).to.be.above(200000).and.below(220000)
+        expect(file480p.size).to.be.above(380000).and.below(400000)
 
         const file720p = video.files.find(f => f.resolution === 720)
         expect(file720p).not.to.be.undefined