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 deactivate: deactivate
,
22 function deactivate () {
23 logger
.info('Pool requests deactivated.')
27 function forceSend () {
28 logger
.info('Force pool requests sending.')
32 function activate () {
33 logger
.info('Pool requests activated.')
34 timer
= setInterval(makePoolRequests
, constants
.INTERVAL
)
37 // ---------------------------------------------------------------------------
39 module
.exports
= poolRequests
41 // ---------------------------------------------------------------------------
43 function makePoolRequest (type
, requests_to_make
, callback
) {
44 if (!callback
) callback = function () {}
46 Pods
.list(function (err
, pods
) {
47 if (err
) return callback(err
)
54 data: requests_to_make
58 params
.path
= '/api/' + constants
.API_VERSION
+ '/remotevideos/add'
59 } else if (type
=== 'remove') {
60 params
.path
= '/api/' + constants
.API_VERSION
+ '/remotevideos/remove'
62 return callback(new Error('Unkown pool request type.'))
68 requests
.makeMultipleRetryRequest(params
, pods
, callbackEachPodFinished
, callbackAllPodsFinished
)
70 function callbackEachPodFinished (err
, response
, body
, url
, pod
, callback_each_pod_finished
) {
71 if (err
|| (response
.statusCode
!== 200 && response
.statusCode
!== 204)) {
72 bad_pods
.push(pod
._id
)
73 logger
.error('Error sending secure request to %s pod.', url
, { error: err
|| new Error('Status code not 20x') })
75 good_pods
.push(pod
._id
)
78 return callback_each_pod_finished()
81 function callbackAllPodsFinished (err
) {
82 if (err
) return callback(err
)
84 updatePodsScore(good_pods
, bad_pods
)
90 function makePoolRequests () {
91 logger
.info('Making pool requests to friends.')
93 PoolRequests
.list(function (err
, pool_requests
) {
95 logger
.error('Cannot get the list of pool requests.', { err: err
})
99 if (pool_requests
.length
=== 0) return
101 var requests_to_make
= {
112 async
.each(pool_requests
, function (pool_request
, callback_each
) {
113 if (pool_request
.type
=== 'add') {
114 requests_to_make
.add
.requests
.push(pool_request
.request
)
115 requests_to_make
.add
.ids
.push(pool_request
._id
)
116 } else if (pool_request
.type
=== 'remove') {
117 requests_to_make
.remove
.requests
.push(pool_request
.request
)
118 requests_to_make
.remove
.ids
.push(pool_request
._id
)
120 logger
.error('Unkown pool request type.', { request_type: pool_request
.type
})
126 // Send the add requests
127 if (requests_to_make
.add
.requests
.length
!== 0) {
128 makePoolRequest('add', requests_to_make
.add
.requests
, function (err
) {
129 if (err
) logger
.error('Errors when sent add pool requests.', { error: err
})
131 PoolRequests
.removeRequests(requests_to_make
.add
.ids
)
135 // Send the remove requests
136 if (requests_to_make
.remove
.requests
.length
!== 0) {
137 makePoolRequest('remove', requests_to_make
.remove
.requests
, function (err
) {
138 if (err
) logger
.error('Errors when sent remove pool requests.', { error: err
})
140 PoolRequests
.removeRequests(requests_to_make
.remove
.ids
)
147 function removeBadPods () {
148 Pods
.findBadPods(function (err
, pods
) {
150 logger
.error('Cannot find bad pods.', { error: err
})
154 if (pods
.length
=== 0) return
156 var urls
= pluck(pods
, 'url')
157 var ids
= pluck(pods
, '_id')
159 Videos
.removeAllRemotesOf(urls
, function (err
, r
) {
161 logger
.error('Cannot remove videos from a pod that we removing.', { error: err
})
163 var videos_removed
= r
.result
.n
164 logger
.info('Removed %d videos.', videos_removed
)
167 Pods
.removeAllByIds(ids
, function (err
, r
) {
169 logger
.error('Cannot remove bad pods.', { error: err
})
171 var pods_removed
= r
.result
.n
172 logger
.info('Removed %d pods.', pods_removed
)
179 function updatePodsScore (good_pods
, bad_pods
) {
180 logger
.info('Updating %d good pods and %d bad pods scores.', good_pods
.length
, bad_pods
.length
)
182 Pods
.incrementScores(good_pods
, constants
.PODS_SCORE
.BONUS
, function (err
) {
183 if (err
) logger
.error('Cannot increment scores of good pods.')
186 Pods
.incrementScores(bad_pods
, constants
.PODS_SCORE
.MALUS
, function (err
) {
187 if (err
) logger
.error('Cannot increment scores of bad pods.')