From 52b6d97250a88c5f0fa4f8df274816b34f710739 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 12 Mar 2024 09:10:42 +0100 Subject: [PATCH] Fix upload transaction retry --- server/core/lib/local-video-creator.ts | 33 ++++++++++++++++---------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/server/core/lib/local-video-creator.ts b/server/core/lib/local-video-creator.ts index b2e8acc99..5affaf2fa 100644 --- a/server/core/lib/local-video-creator.ts +++ b/server/core/lib/local-video-creator.ts @@ -1,3 +1,4 @@ +import { buildAspectRatio } from '@peertube/peertube-core-utils' import { ffprobePromise } from '@peertube/peertube-ffmpeg' import { LiveVideoCreate, @@ -9,31 +10,30 @@ import { VideoStateType } from '@peertube/peertube-models' import { buildUUID } from '@peertube/peertube-node-utils' +import { retryTransactionWrapper } from '@server/helpers/database-utils.js' +import { LoggerTagsFn, logger } from '@server/helpers/logger.js' +import { CONFIG } from '@server/initializers/config.js' import { sequelizeTypescript } from '@server/initializers/database.js' +import { ScheduleVideoUpdateModel } from '@server/models/video/schedule-video-update.js' import { VideoLiveReplaySettingModel } from '@server/models/video/video-live-replay-setting.js' import { VideoLiveModel } from '@server/models/video/video-live.js' import { VideoPasswordModel } from '@server/models/video/video-password.js' import { VideoSourceModel } from '@server/models/video/video-source.js' import { VideoModel } from '@server/models/video/video.js' -import { MVideoFullLight, MThumbnail, MChannel, MChannelAccountLight, MVideoFile, MUser } from '@server/types/models/index.js' +import { MChannel, MChannelAccountLight, MThumbnail, MUser, MVideoFile, MVideoFullLight } from '@server/types/models/index.js' +import { FilteredModelAttributes } from '@server/types/sequelize.js' +import Ffmpeg from 'fluent-ffmpeg' import { move } from 'fs-extra/esm' import { getLocalVideoActivityPubUrl } from './activitypub/url.js' +import { federateVideoIfNeeded } from './activitypub/videos/federate.js' +import { Hooks } from './plugins/hooks.js' import { generateLocalVideoMiniature, updateLocalVideoMiniatureFromExisting } from './thumbnail.js' import { autoBlacklistVideoIfNeeded } from './video-blacklist.js' +import { replaceChapters, replaceChaptersFromDescriptionIfNeeded } from './video-chapters.js' import { buildNewFile } from './video-file.js' import { addVideoJobsAfterCreation } from './video-jobs.js' import { VideoPathManager } from './video-path-manager.js' import { setVideoTags } from './video.js' -import { FilteredModelAttributes } from '@server/types/sequelize.js' -import { CONFIG } from '@server/initializers/config.js' -import { Hooks } from './plugins/hooks.js' -import Ffmpeg from 'fluent-ffmpeg' -import { ScheduleVideoUpdateModel } from '@server/models/video/schedule-video-update.js' -import { replaceChapters, replaceChaptersFromDescriptionIfNeeded } from './video-chapters.js' -import { LoggerTagsFn, logger } from '@server/helpers/logger.js' -import { retryTransactionWrapper } from '@server/helpers/database-utils.js' -import { federateVideoIfNeeded } from './activitypub/videos/federate.js' -import { buildAspectRatio } from '@peertube/peertube-core-utils' type VideoAttributes = Omit & { duration: number @@ -197,7 +197,6 @@ export class LocalVideoCreator { videoLive.videoId = this.video.id this.video.VideoLive = await videoLive.save({ transaction }) } - if (this.videoFile) { transaction.afterCommit(() => { addVideoJobsAfterCreation({ video: this.video, videoFile: this.videoFile }) @@ -206,6 +205,16 @@ export class LocalVideoCreator { } else { await federateVideoIfNeeded(this.video, true, transaction) } + }).catch(err => { + // Reset elements to reinsert them in the database + this.video.isNewRecord = true + this.videoFile.isNewRecord = true + + for (const t of thumbnails) { + t.isNewRecord = true + } + + throw err }) })