Shuffle servers when checking available jobs

To not favour a specific instance
This commit is contained in:
Chocobozzz 2023-06-22 15:02:27 +02:00
parent 19aeb64b25
commit bc3918b2ae
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
4 changed files with 40 additions and 2 deletions

View File

@ -20,10 +20,14 @@ export async function processStudioTranscoding (options: ProcessOptions<RunnerJo
const { server, job, runnerToken } = options const { server, job, runnerToken } = options
const payload = job.payload const payload = job.payload
logger.info(`Downloading input file ${payload.input.videoFileUrl} for job ${job.jobToken}`)
let outputPath: string let outputPath: string
const inputPath = await downloadInputFile({ url: payload.input.videoFileUrl, runnerToken, job }) const inputPath = await downloadInputFile({ url: payload.input.videoFileUrl, runnerToken, job })
let tmpInputFilePath = inputPath let tmpInputFilePath = inputPath
logger.info(`Input file ${payload.input.videoFileUrl} downloaded for job ${job.jobToken}. Running studio transcoding tasks.`)
try { try {
for (const task of payload.tasks) { for (const task of payload.tasks) {
const outputFilename = 'output-edition-' + buildUUID() + '.mp4' const outputFilename = 'output-edition-' + buildUUID() + '.mp4'

View File

@ -1,4 +1,5 @@
import { remove } from 'fs-extra' import { remove } from 'fs-extra'
import { logger } from 'packages/peertube-runner/shared'
import { join } from 'path' import { join } from 'path'
import { buildUUID } from '@shared/extra-utils' import { buildUUID } from '@shared/extra-utils'
import { import {
@ -16,8 +17,12 @@ export async function processWebVideoTranscoding (options: ProcessOptions<Runner
const { server, job, runnerToken } = options const { server, job, runnerToken } = options
const payload = job.payload const payload = job.payload
logger.info(`Downloading input file ${payload.input.videoFileUrl} for web video transcoding job ${job.jobToken}`)
const inputPath = await downloadInputFile({ url: payload.input.videoFileUrl, runnerToken, job }) const inputPath = await downloadInputFile({ url: payload.input.videoFileUrl, runnerToken, job })
logger.info(`Downloaded input file ${payload.input.videoFileUrl} for job ${job.jobToken}. Running web video transcoding.`)
const ffmpegVod = buildFFmpegVOD({ job, server, runnerToken }) const ffmpegVod = buildFFmpegVOD({ job, server, runnerToken })
const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `output-${buildUUID()}.mp4`) const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `output-${buildUUID()}.mp4`)
@ -56,7 +61,12 @@ export async function processHLSTranscoding (options: ProcessOptions<RunnerJobVO
const { server, job, runnerToken } = options const { server, job, runnerToken } = options
const payload = job.payload const payload = job.payload
logger.info(`Downloading input file ${payload.input.videoFileUrl} for HLS transcoding job ${job.jobToken}`)
const inputPath = await downloadInputFile({ url: payload.input.videoFileUrl, runnerToken, job }) const inputPath = await downloadInputFile({ url: payload.input.videoFileUrl, runnerToken, job })
logger.info(`Downloaded input file ${payload.input.videoFileUrl} for job ${job.jobToken}. Running HLS transcoding.`)
const uuid = buildUUID() const uuid = buildUUID()
const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `${uuid}-${payload.output.resolution}.m3u8`) const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `${uuid}-${payload.output.resolution}.m3u8`)
@ -101,9 +111,19 @@ export async function processAudioMergeTranscoding (options: ProcessOptions<Runn
const { server, job, runnerToken } = options const { server, job, runnerToken } = options
const payload = job.payload const payload = job.payload
logger.info(
`Downloading input files ${payload.input.audioFileUrl} and ${payload.input.previewFileUrl} ` +
`for audio merge transcoding job ${job.jobToken}`
)
const audioPath = await downloadInputFile({ url: payload.input.audioFileUrl, runnerToken, job }) const audioPath = await downloadInputFile({ url: payload.input.audioFileUrl, runnerToken, job })
const inputPath = await downloadInputFile({ url: payload.input.previewFileUrl, runnerToken, job }) const inputPath = await downloadInputFile({ url: payload.input.previewFileUrl, runnerToken, job })
logger.info(
`Downloaded input files ${payload.input.audioFileUrl} and ${payload.input.previewFileUrl} ` +
`for job ${job.jobToken}. Running audio merge transcoding.`
)
const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `output-${buildUUID()}.mp4`) const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `output-${buildUUID()}.mp4`)
const ffmpegVod = buildFFmpegVOD({ job, server, runnerToken }) const ffmpegVod = buildFFmpegVOD({ job, server, runnerToken })

View File

@ -1,7 +1,7 @@
import { ensureDir, readdir, remove } from 'fs-extra' import { ensureDir, readdir, remove } from 'fs-extra'
import { join } from 'path' import { join } from 'path'
import { io, Socket } from 'socket.io-client' import { io, Socket } from 'socket.io-client'
import { pick, wait } from '@shared/core-utils' import { pick, shuffle, wait } from '@shared/core-utils'
import { PeerTubeProblemDocument, ServerErrorCode } from '@shared/models' import { PeerTubeProblemDocument, ServerErrorCode } from '@shared/models'
import { PeerTubeServer as PeerTubeServerCommand } from '@shared/server-commands' import { PeerTubeServer as PeerTubeServerCommand } from '@shared/server-commands'
import { ConfigManager } from '../shared' import { ConfigManager } from '../shared'
@ -175,7 +175,7 @@ export class RunnerServer {
let hadAvailableJob = false let hadAvailableJob = false
for (const server of this.servers) { for (const server of shuffle([ ...this.servers ])) {
try { try {
logger.info('Checking available jobs on ' + server.url) logger.info('Checking available jobs on ' + server.url)

View File

@ -20,8 +20,22 @@ function uniqify <T> (elements: T[]) {
return Array.from(new Set(elements)) return Array.from(new Set(elements))
} }
// Thanks: https://stackoverflow.com/a/12646864
function shuffle <T> (elements: T[]) {
const shuffled = [ ...elements ]
for (let i = shuffled.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[ shuffled[i], shuffled[j] ] = [ shuffled[j], shuffled[i] ]
}
return shuffled
}
export { export {
uniqify, uniqify,
findCommonElement, findCommonElement,
shuffle,
arrayify arrayify
} }