diff options
author | Chocobozzz <me@florianbigard.com> | 2022-10-25 11:50:44 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2022-10-25 11:50:44 +0200 |
commit | 849f0fd3b2d00056a2c6252230814d6c2e3e3919 (patch) | |
tree | b55d6593c9a53e751bb689fad0ba8f2e1bd2407b | |
parent | 2e3b0825bbdd3cb45f610600690fc86af4a32feb (diff) | |
download | PeerTube-849f0fd3b2d00056a2c6252230814d6c2e3e3919.tar.gz PeerTube-849f0fd3b2d00056a2c6252230814d6c2e3e3919.tar.zst PeerTube-849f0fd3b2d00056a2c6252230814d6c2e3e3919.zip |
Lock files to generate torrents/move files
-rw-r--r-- | server/lib/job-queue/handlers/manage-video-torrent.ts | 35 | ||||
-rw-r--r-- | server/lib/job-queue/handlers/move-to-object-storage.ts | 6 |
2 files changed, 31 insertions, 10 deletions
diff --git a/server/lib/job-queue/handlers/manage-video-torrent.ts b/server/lib/job-queue/handlers/manage-video-torrent.ts index 425915c96..cef93afda 100644 --- a/server/lib/job-queue/handlers/manage-video-torrent.ts +++ b/server/lib/job-queue/handlers/manage-video-torrent.ts | |||
@@ -1,5 +1,7 @@ | |||
1 | import { Job } from 'bullmq' | 1 | import { Job } from 'bullmq' |
2 | import { extractVideo } from '@server/helpers/video' | ||
2 | import { createTorrentAndSetInfoHash, updateTorrentMetadata } from '@server/helpers/webtorrent' | 3 | import { createTorrentAndSetInfoHash, updateTorrentMetadata } from '@server/helpers/webtorrent' |
4 | import { VideoPathManager } from '@server/lib/video-path-manager' | ||
3 | import { VideoModel } from '@server/models/video/video' | 5 | import { VideoModel } from '@server/models/video/video' |
4 | import { VideoFileModel } from '@server/models/video/video-file' | 6 | import { VideoFileModel } from '@server/models/video/video-file' |
5 | import { VideoStreamingPlaylistModel } from '@server/models/video/video-streaming-playlist' | 7 | import { VideoStreamingPlaylistModel } from '@server/models/video/video-streaming-playlist' |
@@ -30,17 +32,23 @@ async function doCreateAction (payload: ManageVideoTorrentPayload & { action: 'c | |||
30 | 32 | ||
31 | if (!video || !file) return | 33 | if (!video || !file) return |
32 | 34 | ||
33 | await createTorrentAndSetInfoHash(video, file) | 35 | const fileMutexReleaser = await VideoPathManager.Instance.lockFiles(video.uuid) |
34 | 36 | ||
35 | // Refresh videoFile because the createTorrentAndSetInfoHash could be long | 37 | try { |
36 | const refreshedFile = await VideoFileModel.loadWithVideo(file.id) | 38 | await createTorrentAndSetInfoHash(video, file) |
37 | // File does not exist anymore, remove the generated torrent | ||
38 | if (!refreshedFile) return file.removeTorrent() | ||
39 | 39 | ||
40 | refreshedFile.infoHash = file.infoHash | 40 | // Refresh videoFile because the createTorrentAndSetInfoHash could be long |
41 | refreshedFile.torrentFilename = file.torrentFilename | 41 | const refreshedFile = await VideoFileModel.loadWithVideo(file.id) |
42 | // File does not exist anymore, remove the generated torrent | ||
43 | if (!refreshedFile) return file.removeTorrent() | ||
42 | 44 | ||
43 | return refreshedFile.save() | 45 | refreshedFile.infoHash = file.infoHash |
46 | refreshedFile.torrentFilename = file.torrentFilename | ||
47 | |||
48 | await refreshedFile.save() | ||
49 | } finally { | ||
50 | fileMutexReleaser() | ||
51 | } | ||
44 | } | 52 | } |
45 | 53 | ||
46 | async function doUpdateMetadataAction (payload: ManageVideoTorrentPayload & { action: 'update-metadata' }) { | 54 | async function doUpdateMetadataAction (payload: ManageVideoTorrentPayload & { action: 'update-metadata' }) { |
@@ -52,9 +60,16 @@ async function doUpdateMetadataAction (payload: ManageVideoTorrentPayload & { ac | |||
52 | 60 | ||
53 | if ((!video && !streamingPlaylist) || !file) return | 61 | if ((!video && !streamingPlaylist) || !file) return |
54 | 62 | ||
55 | await updateTorrentMetadata(video || streamingPlaylist, file) | 63 | const extractedVideo = extractVideo(video || streamingPlaylist) |
64 | const fileMutexReleaser = await VideoPathManager.Instance.lockFiles(extractedVideo.uuid) | ||
56 | 65 | ||
57 | await file.save() | 66 | try { |
67 | await updateTorrentMetadata(video || streamingPlaylist, file) | ||
68 | |||
69 | await file.save() | ||
70 | } finally { | ||
71 | fileMutexReleaser() | ||
72 | } | ||
58 | } | 73 | } |
59 | 74 | ||
60 | async function loadVideoOrLog (videoId: number) { | 75 | async function loadVideoOrLog (videoId: number) { |
diff --git a/server/lib/job-queue/handlers/move-to-object-storage.ts b/server/lib/job-queue/handlers/move-to-object-storage.ts index 0b68555d1..a1530cc57 100644 --- a/server/lib/job-queue/handlers/move-to-object-storage.ts +++ b/server/lib/job-queue/handlers/move-to-object-storage.ts | |||
@@ -28,6 +28,8 @@ export async function processMoveToObjectStorage (job: Job) { | |||
28 | 28 | ||
29 | const lTags = lTagsBase(video.uuid, video.url) | 29 | const lTags = lTagsBase(video.uuid, video.url) |
30 | 30 | ||
31 | const fileMutexReleaser = await VideoPathManager.Instance.lockFiles(video.uuid) | ||
32 | |||
31 | try { | 33 | try { |
32 | if (video.VideoFiles) { | 34 | if (video.VideoFiles) { |
33 | logger.debug('Moving %d webtorrent files for video %s.', video.VideoFiles.length, video.uuid, lTags) | 35 | logger.debug('Moving %d webtorrent files for video %s.', video.VideoFiles.length, video.uuid, lTags) |
@@ -49,6 +51,10 @@ export async function processMoveToObjectStorage (job: Job) { | |||
49 | } | 51 | } |
50 | } catch (err) { | 52 | } catch (err) { |
51 | await onMoveToObjectStorageFailure(job, err) | 53 | await onMoveToObjectStorageFailure(job, err) |
54 | |||
55 | throw err | ||
56 | } finally { | ||
57 | fileMutexReleaser() | ||
52 | } | 58 | } |
53 | 59 | ||
54 | return payload.videoUUID | 60 | return payload.videoUUID |