4 var async
= require('async')
5 var pluck
= require('lodash-node/compat/collection/pluck')
7 var constants
= require('../initializers/constants')
8 var logger
= require('../helpers/logger')
9 var Pods
= require('../models/pods')
10 var PoolRequests
= require('../models/poolRequests')
11 var requests
= require('../helpers/requests')
12 var Videos
= require('../models/videos')
18 addRequest: addRequest
,
19 deactivate: deactivate
,
23 function activate () {
24 logger
.info('Pool requests activated.')
25 timer
= setInterval(makePoolRequests
, constants
.INTERVAL
)
28 function addRequest (id
, type
, request
) {
29 logger
.debug('Add request to the pool requests.', { id: id
, type: type
, request: request
})
31 PoolRequests
.findById(id
, function (err
, entity
) {
33 logger
.error('Cannot find one pool request.', { error: err
})
38 if (entity
.type
=== type
) {
39 logger
.error('Cannot insert two same requests.')
43 // Remove the request of the other type
44 PoolRequests
.removeById(id
, function (err
) {
46 logger
.error('Cannot remove a pool request.', { error: err
})
51 PoolRequests
.create(id
, type
, request
, function (err
) {
52 logger
.error('Cannot create a pool request.', { error: err
})
59 function deactivate () {
60 logger
.info('Pool requests deactivated.')
64 function forceSend () {
65 logger
.info('Force pool requests sending.')
69 // ---------------------------------------------------------------------------
71 module
.exports
= poolRequests
73 // ---------------------------------------------------------------------------
75 function makePoolRequest (type
, requests_to_make
, callback
) {
76 if (!callback
) callback = function () {}
78 Pods
.list(function (err
, pods
) {
79 if (err
) return callback(err
)
86 data: requests_to_make
90 params
.path
= '/api/' + constants
.API_VERSION
+ '/remotevideos/add'
91 } else if (type
=== 'remove') {
92 params
.path
= '/api/' + constants
.API_VERSION
+ '/remotevideos/remove'
94 return callback(new Error('Unkown pool request type.'))
100 requests
.makeMultipleRetryRequest(params
, pods
, callbackEachPodFinished
, callbackAllPodsFinished
)
102 function callbackEachPodFinished (err
, response
, body
, url
, pod
, callback_each_pod_finished
) {
103 if (err
|| (response
.statusCode
!== 200 && response
.statusCode
!== 204)) {
104 bad_pods
.push(pod
._id
)
105 logger
.error('Error sending secure request to %s pod.', url
, { error: err
|| new Error('Status code not 20x') })
107 good_pods
.push(pod
._id
)
110 return callback_each_pod_finished()
113 function callbackAllPodsFinished (err
) {
114 if (err
) return callback(err
)
116 updatePodsScore(good_pods
, bad_pods
)
122 function makePoolRequests () {
123 logger
.info('Making pool requests to friends.')
125 PoolRequests
.list(function (err
, pool_requests
) {
127 logger
.error('Cannot get the list of pool requests.', { err: err
})
131 if (pool_requests
.length
=== 0) return
133 var requests_to_make
= {
144 async
.each(pool_requests
, function (pool_request
, callback_each
) {
145 if (pool_request
.type
=== 'add') {
146 requests_to_make
.add
.requests
.push(pool_request
.request
)
147 requests_to_make
.add
.ids
.push(pool_request
._id
)
148 } else if (pool_request
.type
=== 'remove') {
149 requests_to_make
.remove
.requests
.push(pool_request
.request
)
150 requests_to_make
.remove
.ids
.push(pool_request
._id
)
152 logger
.error('Unkown pool request type.', { request_type: pool_request
.type
})
158 // Send the add requests
159 if (requests_to_make
.add
.requests
.length
!== 0) {
160 makePoolRequest('add', requests_to_make
.add
.requests
, function (err
) {
161 if (err
) logger
.error('Errors when sent add pool requests.', { error: err
})
163 PoolRequests
.removeRequests(requests_to_make
.add
.ids
)
167 // Send the remove requests
168 if (requests_to_make
.remove
.requests
.length
!== 0) {
169 makePoolRequest('remove', requests_to_make
.remove
.requests
, function (err
) {
170 if (err
) logger
.error('Errors when sent remove pool requests.', { error: err
})
172 PoolRequests
.removeRequests(requests_to_make
.remove
.ids
)
179 function removeBadPods () {
180 Pods
.findBadPods(function (err
, pods
) {
182 logger
.error('Cannot find bad pods.', { error: err
})
186 if (pods
.length
=== 0) return
188 var urls
= pluck(pods
, 'url')
189 var ids
= pluck(pods
, '_id')
191 Videos
.removeAllRemotesOf(urls
, function (err
, r
) {
193 logger
.error('Cannot remove videos from a pod that we removing.', { error: err
})
195 var videos_removed
= r
.result
.n
196 logger
.info('Removed %d videos.', videos_removed
)
199 Pods
.removeAllByIds(ids
, function (err
, r
) {
201 logger
.error('Cannot remove bad pods.', { error: err
})
203 var pods_removed
= r
.result
.n
204 logger
.info('Removed %d pods.', pods_removed
)
211 function updatePodsScore (good_pods
, bad_pods
) {
212 logger
.info('Updating %d good pods and %d bad pods scores.', good_pods
.length
, bad_pods
.length
)
214 Pods
.incrementScores(good_pods
, constants
.PODS_SCORE
.BONUS
, function (err
) {
215 if (err
) logger
.error('Cannot increment scores of good pods.')
218 Pods
.incrementScores(bad_pods
, constants
.PODS_SCORE
.MALUS
, function (err
) {
219 if (err
) logger
.error('Cannot increment scores of bad pods.')