Skip to content

Commit

Permalink
Prevent concurrency issues when sending m3u8 file
Browse files Browse the repository at this point in the history
  • Loading branch information
Chocobozzz committed Oct 24, 2022
1 parent 0177101 commit b3ce360
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 3 deletions.
11 changes: 9 additions & 2 deletions server/lib/live/shared/muxing-session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { mapSeries } from 'bluebird'
import { FSWatcher, watch } from 'chokidar'
import { FfmpegCommand } from 'fluent-ffmpeg'
import { appendFile, ensureDir, readFile, stat } from 'fs-extra'
import PQueue from 'p-queue'
import { basename, join } from 'path'
import { EventEmitter } from 'stream'
import { getLiveMuxingCommand, getLiveTranscodingCommand } from '@server/helpers/ffmpeg'
Expand All @@ -21,7 +22,6 @@ import { LiveSegmentShaStore } from '../live-segment-sha-store'
import { buildConcatenatedName } from '../live-utils'

import memoizee = require('memoizee')

interface MuxingSessionEvents {
'live-ready': (options: { videoId: number }) => void

Expand Down Expand Up @@ -278,11 +278,18 @@ class MuxingSession extends EventEmitter {
private watchM3U8File () {
this.m3u8Watcher = watch(this.outDirectory + '/*.m3u8')

const sendQueues = new Map<string, PQueue>()

const onChangeOrAdd = async (m3u8Path: string) => {
if (this.streamingPlaylist.storage !== VideoStorage.OBJECT_STORAGE) return

try {
await storeHLSFileFromPath(this.streamingPlaylist, m3u8Path)
if (!sendQueues.has(m3u8Path)) {
sendQueues.set(m3u8Path, new PQueue({ concurrency: 1 }))
}

const queue = sendQueues.get(m3u8Path)
await queue.add(() => storeHLSFileFromPath(this.streamingPlaylist, m3u8Path))
} catch (err) {
logger.error('Cannot store in object storage m3u8 file %s', m3u8Path, { err, ...this.lTags() })
}
Expand Down
2 changes: 1 addition & 1 deletion server/tests/feeds/feeds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ describe('Test syndication feeds', () => {
const jsonObj = JSON.parse(json)
const imageUrl = jsonObj.icon
expect(imageUrl).to.include('/lazy-static/avatars/')
await makeRawRequest({ url: imageUrl })
await makeRawRequest({ url: imageUrl, expectedStatus: HttpStatusCode.OK_200 })
})
})

Expand Down

0 comments on commit b3ce360

Please sign in to comment.