]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Safely remove webtorrent files
authorChocobozzz <me@florianbigard.com>
Mon, 25 Jan 2021 10:33:26 +0000 (11:33 +0100)
committerChocobozzz <chocobozzz@cpy.re>
Mon, 25 Jan 2021 13:38:52 +0000 (14:38 +0100)
Only remove them on max quality HLS playlist generation

client/src/app/+admin/system/jobs/jobs.component.ts
server/lib/job-queue/handlers/video-transcoding.ts
server/models/video/video.ts
server/tests/api/videos/video-transcoder.ts

index d08079f7e30b9c8e55c74d8da802f2189949ab81..925450286fba76e82dfc0a15a06342d1697df30c 100644 (file)
@@ -73,11 +73,11 @@ export class JobsComponent extends RestTable implements OnInit {
   }
 
   getColspan () {
-    if (this.jobState === 'all' && this.hasProgress()) return 6
+    if (this.jobState === 'all' && this.hasProgress()) return 7
 
-    if (this.jobState === 'all' || this.hasProgress()) return 5
+    if (this.jobState === 'all' || this.hasProgress()) return 6
 
-    return 4
+    return 5
   }
 
   onJobStateOrTypeChanged () {
index ee241ad03e65b747786f94f1ac4c8ddb5df042c7..9c0b1d1f16bd9198fc130414c0916b221a2cdcca 100644 (file)
@@ -93,7 +93,7 @@ async function handleHLSJob (job: Bull.Job, payload: HLSTranscodingPayload, vide
     job
   })
 
-  await retryTransactionWrapper(onHlsPlaylistGeneration, video)
+  await retryTransactionWrapper(onHlsPlaylistGeneration, video, payload.resolution)
 }
 
 async function handleNewWebTorrentResolutionJob (
@@ -121,11 +121,13 @@ async function handleWebTorrentOptimizeJob (job: Bull.Job, payload: OptimizeTran
 
 // ---------------------------------------------------------------------------
 
-async function onHlsPlaylistGeneration (video: MVideoFullLight) {
+async function onHlsPlaylistGeneration (video: MVideoFullLight, resolution: number) {
   if (video === undefined) return undefined
 
-  // We generated the HLS playlist, we don't need the webtorrent files anymore if the admin disabled it
-  if (CONFIG.TRANSCODING.WEBTORRENT.ENABLED === false) {
+  const maxQualityFile = video.getMaxQualityFile()
+
+  // We generated the max quality HLS playlist, we don't need the webtorrent files anymore if the admin disabled it
+  if (CONFIG.TRANSCODING.WEBTORRENT.ENABLED === false && video.hasWebTorrentFiles() && maxQualityFile.resolution === resolution) {
     for (const file of video.VideoFiles) {
       await video.removeFile(file)
       await file.destroy()
index 720bfd829a8807c9f649c409c535238a37d87669..343abde4429ae84ddd1575ea2d48175d24802346 100644 (file)
@@ -1804,6 +1804,10 @@ export class VideoModel extends Model {
     return Object.assign(file, { Video: this })
   }
 
+  hasWebTorrentFiles () {
+    return Array.isArray(this.VideoFiles) === true && this.VideoFiles.length !== 0
+  }
+
   async addAndSaveThumbnail (thumbnail: MThumbnail, transaction: Transaction) {
     thumbnail.videoId = this.id
 
index 32f566506a957e6ecaf2275263f1e02b02091986..631230f26f012d2725cb8cf82ce86b101a8fed23 100644 (file)
@@ -5,7 +5,9 @@ import * as chai from 'chai'
 import { FfprobeData } from 'fluent-ffmpeg'
 import { omit } from 'lodash'
 import { join } from 'path'
+import { Job } from '@shared/models'
 import { VIDEO_TRANSCODING_FPS } from '../../../../server/initializers/constants'
+import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
 import {
   buildAbsoluteFixturePath,
   buildServerDirectory,
@@ -14,6 +16,7 @@ import {
   flushAndRunMultipleServers,
   generateHighBitrateVideo,
   generateVideoWithFramerate,
+  getJobsListPaginationAndSort,
   getMyVideos,
   getServerFileSize,
   getVideo,
@@ -37,12 +40,12 @@ import {
   getVideoFileFPS,
   getVideoFileResolution
 } from '../../../helpers/ffprobe-utils'
-import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
 
 const expect = chai.expect
 
 describe('Test video transcoding', function () {
   let servers: ServerInfo[] = []
+  let video4k: string
 
   before(async function () {
     this.timeout(30_000)
@@ -578,14 +581,14 @@ describe('Test video transcoding', function () {
     }
 
     const resUpload = await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes)
-    const videoUUID = resUpload.body.video.uuid
+    video4k = resUpload.body.video.uuid
 
     await waitJobs(servers)
 
     const resolutions = [ 240, 360, 480, 720, 1080, 1440, 2160 ]
 
     for (const server of servers) {
-      const res = await getVideo(server.url, videoUUID)
+      const res = await getVideo(server.url, video4k)
       const videoDetails: VideoDetails = res.body
 
       expect(videoDetails.files).to.have.lengthOf(resolutions.length)
@@ -597,6 +600,41 @@ describe('Test video transcoding', function () {
     }
   })
 
+  it('Should have the appropriate priorities for transcoding jobs', async function () {
+    const res = await getJobsListPaginationAndSort({
+      url: servers[1].url,
+      accessToken: servers[1].accessToken,
+      start: 0,
+      count: 100,
+      sort: '-createdAt',
+      jobType: 'video-transcoding'
+    })
+
+    const jobs = res.body.data as Job[]
+
+    const transcodingJobs = jobs.filter(j => j.data.videoUUID === video4k)
+
+    expect(transcodingJobs).to.have.lengthOf(14)
+
+    const hlsJobs = transcodingJobs.filter(j => j.data.type === 'new-resolution-to-hls')
+    const webtorrentJobs = transcodingJobs.filter(j => j.data.type === 'new-resolution-to-webtorrent')
+    const optimizeJobs = transcodingJobs.filter(j => j.data.type === 'optimize-to-webtorrent')
+
+    expect(hlsJobs).to.have.lengthOf(7)
+    expect(webtorrentJobs).to.have.lengthOf(6)
+    expect(optimizeJobs).to.have.lengthOf(1)
+
+    for (const j of optimizeJobs) {
+      expect(j.priority).to.be.greaterThan(11)
+      expect(j.priority).to.be.lessThan(50)
+    }
+
+    for (const j of hlsJobs.concat(webtorrentJobs)) {
+      expect(j.priority).to.be.greaterThan(100)
+      expect(j.priority).to.be.lessThan(150)
+    }
+  })
+
   after(async function () {
     await cleanupTests(servers)
   })