Atomic live segment file write

pull/5817/head
Chocobozzz 2023-05-15 11:09:16 +02:00
parent 65b2ec673d
commit be3ec61a66
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
1 changed files with 11 additions and 3 deletions

View File

@ -1,11 +1,11 @@
import { writeJson } from 'fs-extra'
import { move, writeJson } from 'fs-extra'
import PQueue from 'p-queue'
import { basename } from 'path'
import { mapToJSON } from '@server/helpers/core-utils'
import { logger, loggerTagsFactory } from '@server/helpers/logger'
import { MStreamingPlaylistVideo } from '@server/types/models'
import { buildSha256Segment } from '../hls'
import { storeHLSFileFromPath } from '../object-storage'
import PQueue from 'p-queue'
const lTags = loggerTagsFactory('live')
@ -14,7 +14,10 @@ class LiveSegmentShaStore {
private readonly segmentsSha256 = new Map<string, string>()
private readonly videoUUID: string
private readonly sha256Path: string
private readonly sha256PathTMP: string
private readonly streamingPlaylist: MStreamingPlaylistVideo
private readonly sendToObjectStorage: boolean
private readonly writeQueue = new PQueue({ concurrency: 1 })
@ -26,7 +29,10 @@ class LiveSegmentShaStore {
sendToObjectStorage: boolean
}) {
this.videoUUID = options.videoUUID
this.sha256Path = options.sha256Path
this.sha256PathTMP = options.sha256Path + '.tmp'
this.streamingPlaylist = options.streamingPlaylist
this.sendToObjectStorage = options.sendToObjectStorage
}
@ -66,7 +72,9 @@ class LiveSegmentShaStore {
private writeToDisk () {
return this.writeQueue.add(async () => {
await writeJson(this.sha256Path, mapToJSON(this.segmentsSha256))
// Atomic write
await writeJson(this.sha256PathTMP, mapToJSON(this.segmentsSha256))
await move(this.sha256PathTMP, this.sha256Path, { overwrite: true })
if (this.sendToObjectStorage) {
const url = await storeHLSFileFromPath(this.streamingPlaylist, this.sha256Path)