Fix concurrency error when deleting a video

This commit is contained in:
Chocobozzz 2017-09-12 14:17:46 +02:00
parent 6d33593a08
commit 91f6f169b1
3 changed files with 30 additions and 16 deletions

View File

@ -45,6 +45,7 @@ import { VideoCreate, VideoUpdate } from '../../../../shared'
import { abuseVideoRouter } from './abuse'
import { blacklistRouter } from './blacklist'
import { rateVideoRouter } from './rate'
import { VideoInstance } from '../../../models/video/video-interface'
const videosRouter = express.Router()
@ -106,7 +107,7 @@ videosRouter.get('/:id',
videosRouter.delete('/:id',
authenticate,
videosRemoveValidator,
removeVideo
removeVideoRetryWrapper
)
videosRouter.get('/search/:value',
@ -291,7 +292,6 @@ function updateVideoRetryWrapper (req: express.Request, res: express.Response, n
retryTransactionWrapper(updateVideo, options)
.then(() => {
// TODO : include Location of the new video -> 201
return res.type('json').status(204).end()
})
.catch(err => next(err))
@ -396,17 +396,31 @@ function listVideos (req: express.Request, res: express.Response, next: express.
.catch(err => next(err))
}
function removeVideo (req: express.Request, res: express.Response, next: express.NextFunction) {
const videoInstance = res.locals.video
function removeVideoRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) {
const options = {
arguments: [ req, res ],
errorMessage: 'Cannot remove the video with many retries.'
}
videoInstance.destroy()
retryTransactionWrapper(removeVideo, options)
.then(() => {
return res.type('json').status(204).end()
})
.catch(err => next(err))
}
function removeVideo (req: express.Request, res: express.Response) {
const videoInstance: VideoInstance = res.locals.video
return db.sequelize.transaction(t => {
return videoInstance.destroy({ transaction: t })
})
.then(() => {
logger.info('Video with name %s and uuid %s deleted.', videoInstance.name, videoInstance.uuid)
res.type('json').status(204).end()
})
.catch(err => {
logger.error('Errors when removed the video.', err)
return next(err)
throw err
})
}

View File

@ -80,12 +80,12 @@ function updateVideoToFriends (videoData: RemoteVideoUpdateData, transaction: Se
return createRequest(options)
}
function removeVideoToFriends (videoParams: RemoteVideoRemoveData) {
function removeVideoToFriends (videoParams: RemoteVideoRemoveData, transaction: Sequelize.Transaction) {
const options = {
type: ENDPOINT_ACTIONS.REMOVE,
endpoint: REQUEST_ENDPOINTS.VIDEOS,
data: videoParams,
transaction: null
transaction
}
return createRequest(options)
}

View File

@ -300,7 +300,7 @@ function associate (models) {
})
}
function afterDestroy (video: VideoInstance) {
function afterDestroy (video: VideoInstance, options: { transaction: Sequelize.Transaction }) {
const tasks = []
tasks.push(
@ -314,10 +314,10 @@ function afterDestroy (video: VideoInstance) {
tasks.push(
video.removePreview(),
removeVideoToFriends(removeVideoToFriendsParams)
removeVideoToFriends(removeVideoToFriendsParams, options.transaction)
)
// TODO: check files is populated
// Remove physical files and torrents
video.VideoFiles.forEach(file => {
video.removeFile(file),
video.removeTorrent(file)