4 var async
= require('async')
6 var constants
= require('./constants')
7 var logger
= require('./logger')
8 var database
= require('./database')
9 var PoolRequestsDB
= database
.PoolRequestsDB
10 var PodsDB
= database
.PodsDB
11 var utils
= require('./utils')
15 // ----------- Private -----------
18 function removePoolRequestsFromDB (ids
) {
19 PoolRequestsDB
.remove({ _id: { $in: ids
} }, function (err
) {
21 logger
.error('Cannot remove requests from the pool requests database.', { error: err
})
25 logger
.info('Pool requests flushed.')
29 function makePoolRequests () {
30 logger
.info('Making pool requests to friends.')
32 PoolRequestsDB
.find({}, { _id: 1, type: 1, request: 1 }, function (err
, pool_requests
) {
35 if (pool_requests
.length
=== 0) return
48 async
.each(pool_requests
, function (pool_request
, callback_each
) {
49 if (pool_request
.type
=== 'add') {
50 requests
.add
.requests
.push(pool_request
.request
)
51 requests
.add
.ids
.push(pool_request
._id
)
52 } else if (pool_request
.type
=== 'remove') {
53 requests
.remove
.requests
.push(pool_request
.request
)
54 requests
.remove
.ids
.push(pool_request
._id
)
56 throw new Error('Unkown pool request type.')
61 // Send the add requests
62 if (requests
.add
.requests
.length
!== 0) {
63 makePoolRequest('add', requests
.add
.requests
, function (err
) {
64 if (err
) logger
.error('Errors when sent add pool requests.', { error: err
})
66 removePoolRequestsFromDB(requests
.add
.ids
)
70 // Send the remove requests
71 if (requests
.remove
.requests
.length
!== 0) {
72 makePoolRequest('remove', requests
.remove
.requests
, function (err
) {
73 if (err
) logger
.error('Errors when sent remove pool requests.', { error: err
})
75 removePoolRequestsFromDB(requests
.remove
.ids
)
82 function updatePodsScore (good_pods
, bad_pods
) {
83 logger
.info('Updating %d good pods and %d bad pods scores.', good_pods
.length
, bad_pods
.length
)
85 PodsDB
.update({ _id: { $in: good_pods
} }, { $inc: { score: constants
.PODS_SCORE
.BONUS
} }, { multi: true }).exec()
86 PodsDB
.update({ _id: { $in: bad_pods
} }, { $inc: { score: constants
.PODS_SCORE
.MALUS
} }, { multi: true }, function (err
) {
92 function removeBadPods () {
93 PodsDB
.remove({ score: 0 }, function (err
, result
) {
96 var number_removed
= result
.result
.n
97 if (number_removed
!== 0) logger
.info('Removed %d pod.', number_removed
)
101 function makePoolRequest (type
, requests
, callback
) {
102 if (!callback
) callback = function () {}
104 PodsDB
.find({}, { _id: 1, url: 1, publicKey: 1 }).exec(function (err
, pods
) {
115 if (type
=== 'add') {
116 params
.path
= '/api/' + constants
.API_VERSION
+ '/remotevideos/add'
117 } else if (type
=== 'remove') {
118 params
.path
= '/api/' + constants
.API_VERSION
+ '/remotevideos/remove'
120 throw new Error('Unkown pool request type.')
126 utils
.makeMultipleRetryRequest(params
, pods
, callbackEachPodFinished
, callbackAllPodsFinished
)
128 function callbackEachPodFinished (err
, response
, body
, url
, pod
, callback_each_pod_finished
) {
129 if (err
|| response
.statusCode
!== 200) {
130 bad_pods
.push(pod
._id
)
131 logger
.error('Error sending secure request to %s pod.', url
, { error: err
})
133 good_pods
.push(pod
._id
)
136 return callback_each_pod_finished()
139 function callbackAllPodsFinished (err
) {
140 if (err
) return callback(err
)
142 updatePodsScore(good_pods
, bad_pods
)
148 // ----------- Public -----------
149 poolRequests
.activate = function () {
150 logger
.info('Pool requests activated.')
151 timer
= setInterval(makePoolRequests
, constants
.INTERVAL
)
154 poolRequests
.addToPoolRequests = function (id
, type
, request
) {
155 logger
.debug('Add request to the pool requests.', { id: id
, type: type
, request: request
})
157 PoolRequestsDB
.findOne({ id: id
}, function (err
, entity
) {
158 if (err
) logger
.error(err
)
161 if (entity
.type
=== type
) {
162 logger
.error(new Error('Cannot insert two same requests.'))
166 // Remove the request of the other type
167 PoolRequestsDB
.remove({ id: id
}, function (err
) {
168 if (err
) logger
.error(err
)
171 PoolRequestsDB
.create({ id: id
, type: type
, request: request
}, function (err
) {
172 if (err
) logger
.error(err
)
178 poolRequests
.deactivate = function () {
179 logger
.info('Pool requests deactivated.')
183 module
.exports
= poolRequests