diff options
author | Chocobozzz <me@florianbigard.com> | 2018-03-19 15:02:36 +0100 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2018-03-19 15:22:18 +0100 |
commit | a797728009eb5c26cf55624a4a01e8ecb73f1297 (patch) | |
tree | 3dcfe4870986c9bacdfbd2a671143b5dfc4f47d3 /server/lib | |
parent | 9d145133d82c11edfb2781871076b7063cc3ae3d (diff) | |
download | PeerTube-a797728009eb5c26cf55624a4a01e8ecb73f1297.tar.gz PeerTube-a797728009eb5c26cf55624a4a01e8ecb73f1297.tar.zst PeerTube-a797728009eb5c26cf55624a4a01e8ecb73f1297.zip |
Fix video_share_url duplicate key in transcoding job
Diffstat (limited to 'server/lib')
-rw-r--r-- | server/lib/activitypub/share.ts | 47 | ||||
-rw-r--r-- | server/lib/job-queue/handlers/video-file.ts | 40 |
2 files changed, 49 insertions, 38 deletions
diff --git a/server/lib/activitypub/share.ts b/server/lib/activitypub/share.ts index 53ecd3dab..038f19b7d 100644 --- a/server/lib/activitypub/share.ts +++ b/server/lib/activitypub/share.ts | |||
@@ -12,27 +12,42 @@ async function shareVideoByServerAndChannel (video: VideoModel, t: Transaction) | |||
12 | const serverActor = await getServerActor() | 12 | const serverActor = await getServerActor() |
13 | 13 | ||
14 | const serverShareUrl = getAnnounceActivityPubUrl(video.url, serverActor) | 14 | const serverShareUrl = getAnnounceActivityPubUrl(video.url, serverActor) |
15 | const serverSharePromise = VideoShareModel.create({ | 15 | const serverSharePromise = VideoShareModel.findOrCreate({ |
16 | actorId: serverActor.id, | 16 | defaults: { |
17 | videoId: video.id, | 17 | actorId: serverActor.id, |
18 | url: serverShareUrl | 18 | videoId: video.id, |
19 | }, { transaction: t }) | 19 | url: serverShareUrl |
20 | }, | ||
21 | where: { | ||
22 | url: serverShareUrl | ||
23 | }, | ||
24 | transaction: t | ||
25 | }).then(([ serverShare, created ]) => { | ||
26 | if (created) return sendVideoAnnounceToFollowers(serverActor, serverShare, video, t) | ||
27 | |||
28 | return undefined | ||
29 | }) | ||
20 | 30 | ||
21 | const videoChannelShareUrl = getAnnounceActivityPubUrl(video.url, video.VideoChannel.Actor) | 31 | const videoChannelShareUrl = getAnnounceActivityPubUrl(video.url, video.VideoChannel.Actor) |
22 | const videoChannelSharePromise = VideoShareModel.create({ | 32 | const videoChannelSharePromise = VideoShareModel.findOrCreate({ |
23 | actorId: video.VideoChannel.actorId, | 33 | defaults: { |
24 | videoId: video.id, | 34 | actorId: video.VideoChannel.actorId, |
25 | url: videoChannelShareUrl | 35 | videoId: video.id, |
26 | }, { transaction: t }) | 36 | url: videoChannelShareUrl |
37 | }, | ||
38 | where: { | ||
39 | url: videoChannelShareUrl | ||
40 | }, | ||
41 | transaction: t | ||
42 | }).then(([ videoChannelShare, created ]) => { | ||
43 | if (created) return sendVideoAnnounceToFollowers(serverActor, videoChannelShare, video, t) | ||
27 | 44 | ||
28 | const [ serverShare, videoChannelShare ] = await Promise.all([ | 45 | return undefined |
29 | serverSharePromise, | 46 | }) |
30 | videoChannelSharePromise | ||
31 | ]) | ||
32 | 47 | ||
33 | return Promise.all([ | 48 | return Promise.all([ |
34 | sendVideoAnnounceToFollowers(serverActor, videoChannelShare, video, t), | 49 | serverSharePromise, |
35 | sendVideoAnnounceToFollowers(serverActor, serverShare, video, t) | 50 | videoChannelSharePromise |
36 | ]) | 51 | ]) |
37 | } | 52 | } |
38 | 53 | ||
diff --git a/server/lib/job-queue/handlers/video-file.ts b/server/lib/job-queue/handlers/video-file.ts index bd9412290..1b41d29e8 100644 --- a/server/lib/job-queue/handlers/video-file.ts +++ b/server/lib/job-queue/handlers/video-file.ts | |||
@@ -63,8 +63,10 @@ async function onVideoFileOptimizerSuccess (video: VideoModel) { | |||
63 | 63 | ||
64 | if (video.privacy !== VideoPrivacy.PRIVATE) { | 64 | if (video.privacy !== VideoPrivacy.PRIVATE) { |
65 | // Now we'll add the video's meta data to our followers | 65 | // Now we'll add the video's meta data to our followers |
66 | await sendCreateVideo(video, undefined) | 66 | await sequelizeTypescript.transaction(async t => { |
67 | await shareVideoByServerAndChannel(video, undefined) | 67 | await sendCreateVideo(video, t) |
68 | await shareVideoByServerAndChannel(video, t) | ||
69 | }) | ||
68 | } | 70 | } |
69 | 71 | ||
70 | const { videoFileResolution } = await videoDatabase.getOriginalFileResolution() | 72 | const { videoFileResolution } = await videoDatabase.getOriginalFileResolution() |
@@ -77,27 +79,21 @@ async function onVideoFileOptimizerSuccess (video: VideoModel) { | |||
77 | ) | 79 | ) |
78 | 80 | ||
79 | if (resolutionsEnabled.length !== 0) { | 81 | if (resolutionsEnabled.length !== 0) { |
80 | try { | 82 | const tasks: Promise<any>[] = [] |
81 | await sequelizeTypescript.transaction(async t => { | 83 | |
82 | const tasks: Promise<any>[] = [] | 84 | for (const resolution of resolutionsEnabled) { |
83 | 85 | const dataInput = { | |
84 | for (const resolution of resolutionsEnabled) { | 86 | videoUUID: videoDatabase.uuid, |
85 | const dataInput = { | 87 | resolution |
86 | videoUUID: videoDatabase.uuid, | 88 | } |
87 | resolution | 89 | |
88 | } | 90 | const p = JobQueue.Instance.createJob({ type: 'video-file', payload: dataInput }) |
89 | 91 | tasks.push(p) | |
90 | const p = JobQueue.Instance.createJob({ type: 'video-file', payload: dataInput }) | ||
91 | tasks.push(p) | ||
92 | } | ||
93 | |||
94 | await Promise.all(tasks) | ||
95 | }) | ||
96 | |||
97 | logger.info('Transcoding jobs created for uuid %s.', videoDatabase.uuid, { resolutionsEnabled }) | ||
98 | } catch (err) { | ||
99 | logger.warn('Cannot transcode the video.', err) | ||
100 | } | 92 | } |
93 | |||
94 | await Promise.all(tasks) | ||
95 | |||
96 | logger.info('Transcoding jobs created for uuid %s.', videoDatabase.uuid, { resolutionsEnabled }) | ||
101 | } else { | 97 | } else { |
102 | logger.info('No transcoding jobs created for video %s (no resolutions enabled).') | 98 | logger.info('No transcoding jobs created for video %s (no resolutions enabled).') |
103 | return undefined | 99 | return undefined |