2017-06-10 15:15:25 -05:00
|
|
|
import * as Sequelize from 'sequelize'
|
|
|
|
|
2017-05-22 13:58:25 -05:00
|
|
|
import { database as db } from '../../initializers/database'
|
2017-07-10 12:43:21 -05:00
|
|
|
import { AbstractRequestScheduler, RequestsObjects } from './abstract-request-scheduler'
|
2017-05-15 15:22:03 -05:00
|
|
|
import { logger } from '../../helpers'
|
2017-07-05 06:26:25 -05:00
|
|
|
import { REQUESTS_LIMIT_PODS, REQUESTS_LIMIT_PER_POD } from '../../initializers'
|
|
|
|
import { RequestsGrouped } from '../../models'
|
2017-07-10 12:43:21 -05:00
|
|
|
import { RequestEndpoint, RemoteVideoRequest } from '../../../shared'
|
2017-05-15 15:22:03 -05:00
|
|
|
|
2017-06-10 15:15:25 -05:00
|
|
|
export type RequestSchedulerOptions = {
|
|
|
|
type: string
|
2017-06-16 03:36:18 -05:00
|
|
|
endpoint: RequestEndpoint
|
2017-06-10 15:15:25 -05:00
|
|
|
data: Object
|
|
|
|
toIds: number[]
|
|
|
|
transaction: Sequelize.Transaction
|
|
|
|
}
|
|
|
|
|
2017-07-05 06:26:25 -05:00
|
|
|
class RequestScheduler extends AbstractRequestScheduler<RequestsGrouped> {
|
2017-02-18 11:37:26 -06:00
|
|
|
constructor () {
|
2017-02-21 14:35:59 -06:00
|
|
|
super()
|
2017-02-18 03:29:36 -06:00
|
|
|
|
2017-02-21 14:35:59 -06:00
|
|
|
// We limit the size of the requests
|
2017-05-15 15:22:03 -05:00
|
|
|
this.limitPods = REQUESTS_LIMIT_PODS
|
|
|
|
this.limitPerPod = REQUESTS_LIMIT_PER_POD
|
2017-02-18 03:29:36 -06:00
|
|
|
|
2017-02-21 14:35:59 -06:00
|
|
|
this.description = 'requests'
|
2017-02-18 03:29:36 -06:00
|
|
|
}
|
|
|
|
|
2017-02-21 14:35:59 -06:00
|
|
|
getRequestModel () {
|
|
|
|
return db.Request
|
2017-02-18 03:29:36 -06:00
|
|
|
}
|
|
|
|
|
2017-02-21 14:35:59 -06:00
|
|
|
getRequestToPodModel () {
|
|
|
|
return db.RequestToPod
|
2017-02-18 03:29:36 -06:00
|
|
|
}
|
|
|
|
|
2017-07-10 12:43:21 -05:00
|
|
|
buildRequestsObjects (requestsGrouped: RequestsGrouped) {
|
|
|
|
const requestsToMakeGrouped: RequestsObjects<RemoteVideoRequest> = {}
|
2017-02-21 14:35:59 -06:00
|
|
|
|
2017-07-05 06:26:25 -05:00
|
|
|
Object.keys(requestsGrouped).forEach(toPodId => {
|
|
|
|
requestsGrouped[toPodId].forEach(data => {
|
2017-02-21 14:35:59 -06:00
|
|
|
const request = data.request
|
|
|
|
const pod = data.pod
|
|
|
|
const hashKey = toPodId + request.endpoint
|
|
|
|
|
|
|
|
if (!requestsToMakeGrouped[hashKey]) {
|
|
|
|
requestsToMakeGrouped[hashKey] = {
|
|
|
|
toPod: pod,
|
|
|
|
endpoint: request.endpoint,
|
|
|
|
ids: [], // request ids, to delete them from the DB in the future
|
|
|
|
datas: [] // requests data,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
requestsToMakeGrouped[hashKey].ids.push(request.id)
|
|
|
|
requestsToMakeGrouped[hashKey].datas.push(request.request)
|
|
|
|
})
|
|
|
|
})
|
2017-02-18 03:29:36 -06:00
|
|
|
|
2017-02-21 14:35:59 -06:00
|
|
|
return requestsToMakeGrouped
|
2017-02-18 03:29:36 -06:00
|
|
|
}
|
|
|
|
|
2017-07-05 06:26:25 -05:00
|
|
|
createRequest ({ type, endpoint, data, toIds, transaction }: RequestSchedulerOptions) {
|
2017-02-18 03:29:36 -06:00
|
|
|
// If there are no destination pods abort
|
2017-07-05 06:26:25 -05:00
|
|
|
if (toIds.length === 0) return undefined
|
2017-02-18 03:29:36 -06:00
|
|
|
|
|
|
|
const createQuery = {
|
|
|
|
endpoint,
|
|
|
|
request: {
|
|
|
|
type: type,
|
|
|
|
data: data
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-06-10 15:15:25 -05:00
|
|
|
const dbRequestOptions: Sequelize.CreateOptions = {
|
2017-02-18 03:29:36 -06:00
|
|
|
transaction
|
|
|
|
}
|
|
|
|
|
2017-07-05 06:26:25 -05:00
|
|
|
return db.Request.create(createQuery, dbRequestOptions)
|
|
|
|
.then(request => {
|
2017-07-07 09:57:28 -05:00
|
|
|
return request.setPods(toIds, dbRequestOptions)
|
2017-07-05 06:26:25 -05:00
|
|
|
})
|
2017-02-18 03:29:36 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
2017-02-21 14:35:59 -06:00
|
|
|
afterRequestsHook () {
|
|
|
|
// Flush requests with no pod
|
2017-07-05 06:26:25 -05:00
|
|
|
this.getRequestModel().removeWithEmptyTo()
|
2017-07-07 11:26:12 -05:00
|
|
|
.catch(err => logger.error('Error when removing requests with no pods.', err))
|
2017-02-18 03:29:36 -06:00
|
|
|
}
|
|
|
|
}
|
2017-05-15 15:22:03 -05:00
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
export {
|
|
|
|
RequestScheduler
|
|
|
|
}
|