Try to use atomic move for runner live

pull/6000/head
Chocobozzz 2023-10-05 11:09:11 +02:00
parent d970837922
commit 516479f113
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
2 changed files with 19 additions and 8 deletions

12
server/core/helpers/fs.ts Normal file
View File

@ -0,0 +1,12 @@
import { move } from 'fs-extra/esm'
import { rename } from 'fs/promises'
export async function tryAtomicMove (src: string, destination: string) {
try {
await rename(src, destination)
} catch (err) {
if (err?.code !== 'EXDEV') throw err
return move(src, destination, { overwrite: true })
}
}

View File

@ -12,9 +12,10 @@ import { JOB_PRIORITY } from '@server/initializers/constants.js'
import { LiveManager } from '@server/lib/live/index.js'
import { MStreamingPlaylist, MVideo } from '@server/types/models/index.js'
import { MRunnerJob } from '@server/types/models/runners/index.js'
import { move, remove } from 'fs-extra/esm'
import { remove } from 'fs-extra/esm'
import { join } from 'path'
import { AbstractJobHandler } from './abstract-job-handler.js'
import { tryAtomicMove } from '@server/helpers/fs.js'
type CreateOptions = {
video: MVideo
@ -84,25 +85,23 @@ export class LiveRTMPHLSTranscodingJobHandler extends AbstractJobHandler<CreateO
// Always process the chunk first before moving m3u8 that references this chunk
if (updatePayload.type === 'add-chunk') {
await move(
await tryAtomicMove(
updatePayload.videoChunkFile as string,
join(outputDirectory, updatePayload.videoChunkFilename),
{ overwrite: true }
join(outputDirectory, updatePayload.videoChunkFilename)
)
} else if (updatePayload.type === 'remove-chunk') {
await remove(join(outputDirectory, updatePayload.videoChunkFilename))
}
if (updatePayload.resolutionPlaylistFile && updatePayload.resolutionPlaylistFilename) {
await move(
await tryAtomicMove(
updatePayload.resolutionPlaylistFile as string,
join(outputDirectory, updatePayload.resolutionPlaylistFilename),
{ overwrite: true }
join(outputDirectory, updatePayload.resolutionPlaylistFilename)
)
}
if (updatePayload.masterPlaylistFile) {
await move(updatePayload.masterPlaylistFile as string, join(outputDirectory, privatePayload.masterPlaylistName), { overwrite: true })
await tryAtomicMove(updatePayload.masterPlaylistFile as string, join(outputDirectory, privatePayload.masterPlaylistName))
}
logger.debug(