Atomic live segment file write
This commit is contained in:
parent
65b2ec673d
commit
be3ec61a66
|
@ -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 { basename } from 'path'
|
||||||
import { mapToJSON } from '@server/helpers/core-utils'
|
import { mapToJSON } from '@server/helpers/core-utils'
|
||||||
import { logger, loggerTagsFactory } from '@server/helpers/logger'
|
import { logger, loggerTagsFactory } from '@server/helpers/logger'
|
||||||
import { MStreamingPlaylistVideo } from '@server/types/models'
|
import { MStreamingPlaylistVideo } from '@server/types/models'
|
||||||
import { buildSha256Segment } from '../hls'
|
import { buildSha256Segment } from '../hls'
|
||||||
import { storeHLSFileFromPath } from '../object-storage'
|
import { storeHLSFileFromPath } from '../object-storage'
|
||||||
import PQueue from 'p-queue'
|
|
||||||
|
|
||||||
const lTags = loggerTagsFactory('live')
|
const lTags = loggerTagsFactory('live')
|
||||||
|
|
||||||
|
@ -14,7 +14,10 @@ class LiveSegmentShaStore {
|
||||||
private readonly segmentsSha256 = new Map<string, string>()
|
private readonly segmentsSha256 = new Map<string, string>()
|
||||||
|
|
||||||
private readonly videoUUID: string
|
private readonly videoUUID: string
|
||||||
|
|
||||||
private readonly sha256Path: string
|
private readonly sha256Path: string
|
||||||
|
private readonly sha256PathTMP: string
|
||||||
|
|
||||||
private readonly streamingPlaylist: MStreamingPlaylistVideo
|
private readonly streamingPlaylist: MStreamingPlaylistVideo
|
||||||
private readonly sendToObjectStorage: boolean
|
private readonly sendToObjectStorage: boolean
|
||||||
private readonly writeQueue = new PQueue({ concurrency: 1 })
|
private readonly writeQueue = new PQueue({ concurrency: 1 })
|
||||||
|
@ -26,7 +29,10 @@ class LiveSegmentShaStore {
|
||||||
sendToObjectStorage: boolean
|
sendToObjectStorage: boolean
|
||||||
}) {
|
}) {
|
||||||
this.videoUUID = options.videoUUID
|
this.videoUUID = options.videoUUID
|
||||||
|
|
||||||
this.sha256Path = options.sha256Path
|
this.sha256Path = options.sha256Path
|
||||||
|
this.sha256PathTMP = options.sha256Path + '.tmp'
|
||||||
|
|
||||||
this.streamingPlaylist = options.streamingPlaylist
|
this.streamingPlaylist = options.streamingPlaylist
|
||||||
this.sendToObjectStorage = options.sendToObjectStorage
|
this.sendToObjectStorage = options.sendToObjectStorage
|
||||||
}
|
}
|
||||||
|
@ -66,7 +72,9 @@ class LiveSegmentShaStore {
|
||||||
|
|
||||||
private writeToDisk () {
|
private writeToDisk () {
|
||||||
return this.writeQueue.add(async () => {
|
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) {
|
if (this.sendToObjectStorage) {
|
||||||
const url = await storeHLSFileFromPath(this.streamingPlaylist, this.sha256Path)
|
const url = await storeHLSFileFromPath(this.streamingPlaylist, this.sha256Path)
|
||||||
|
|
Loading…
Reference in New Issue