4 var async
= require('async')
6 var logger
= require('./logger')
7 var database
= require('./database')
8 var PoolRequestsDB
= database
.PoolRequestsDB
9 var PodsDB
= database
.PodsDB
10 var utils
= require('./utils')
14 // ----------- Constants -----------
16 // Time to wait between requests to the friends
17 var INTERVAL
= utils
.isTestInstance() ? 10000 : 60000
23 // ----------- Private -----------
26 function removePoolRequestsFromDB (ids
) {
27 PoolRequestsDB
.remove({ _id: { $in: ids
} }, function (err
) {
29 logger
.error('Cannot remove requests from the pool requests database.', { error: err
})
33 logger
.info('Pool requests flushed.')
37 function makePoolRequests () {
38 logger
.info('Making pool requests to friends.')
40 PoolRequestsDB
.find({}, { _id: 1, type: 1, request: 1 }, function (err
, pool_requests
) {
43 if (pool_requests
.length
=== 0) return
56 async
.each(pool_requests
, function (pool_request
, callback_each
) {
57 if (pool_request
.type
=== 'add') {
58 requests
.add
.requests
.push(pool_request
.request
)
59 requests
.add
.ids
.push(pool_request
._id
)
60 } else if (pool_request
.type
=== 'remove') {
61 requests
.remove
.requests
.push(pool_request
.request
)
62 requests
.remove
.ids
.push(pool_request
._id
)
64 throw new Error('Unkown pool request type.')
69 // Send the add requests
70 if (requests
.add
.requests
.length
!== 0) {
71 makePoolRequest('add', requests
.add
.requests
, function (err
) {
72 if (err
) logger
.error('Errors when sent add pool requests.', { error: err
})
74 removePoolRequestsFromDB(requests
.add
.ids
)
78 // Send the remove requests
79 if (requests
.remove
.requests
.length
!== 0) {
80 makePoolRequest('remove', requests
.remove
.requests
, function (err
) {
81 if (err
) logger
.error('Errors when sent remove pool requests.', { error: err
})
83 removePoolRequestsFromDB(requests
.remove
.ids
)
90 function updatePodsScore (good_pods
, bad_pods
) {
91 logger
.info('Updating %d good pods and %d bad pods scores.', good_pods
.length
, bad_pods
.length
)
93 PodsDB
.update({ _id: { $in: good_pods
} }, { $inc: { score: PODS_SCORE
.BONUS
} }, { multi: true }).exec()
94 PodsDB
.update({ _id: { $in: bad_pods
} }, { $inc: { score: PODS_SCORE
.MALUS
} }, { multi: true }, function (err
) {
100 function removeBadPods () {
101 PodsDB
.remove({ score: 0 }, function (err
, result
) {
104 var number_removed
= result
.result
.n
105 if (number_removed
!== 0) logger
.info('Removed %d pod.', number_removed
)
109 function makePoolRequest (type
, requests
, callback
) {
110 if (!callback
) callback = function () {}
112 PodsDB
.find({}, { _id: 1, url: 1, publicKey: 1 }).exec(function (err
, pods
) {
123 if (type
=== 'add') {
124 params
.path
= '/api/' + global
.API_VERSION
+ '/remotevideos/add'
125 } else if (type
=== 'remove') {
126 params
.path
= '/api/' + global
.API_VERSION
+ '/remotevideos/remove'
128 throw new Error('Unkown pool request type.')
134 utils
.makeMultipleRetryRequest(params
, pods
, callbackEachPodFinished
, callbackAllPodsFinished
)
136 function callbackEachPodFinished (err
, response
, body
, url
, pod
, callback_each_pod_finished
) {
137 if (err
|| response
.statusCode
!== 200) {
138 bad_pods
.push(pod
._id
)
139 logger
.error('Error sending secure request to %s pod.', url
, { error: err
})
141 good_pods
.push(pod
._id
)
144 return callback_each_pod_finished()
147 function callbackAllPodsFinished (err
) {
148 if (err
) return callback(err
)
150 updatePodsScore(good_pods
, bad_pods
)
156 // ----------- Public -----------
157 poolRequests
.activate = function () {
158 logger
.info('Pool requests activated.')
159 timer
= setInterval(makePoolRequests
, INTERVAL
)
162 poolRequests
.addToPoolRequests = function (id
, type
, request
) {
163 logger
.debug('Add request to the pool requests.', { id: id
, type: type
, request: request
})
165 PoolRequestsDB
.findOne({ id: id
}, function (err
, entity
) {
166 if (err
) logger
.error(err
)
169 if (entity
.type
=== type
) {
170 logger
.error(new Error('Cannot insert two same requests.'))
174 // Remove the request of the other type
175 PoolRequestsDB
.remove({ id: id
}, function (err
) {
176 if (err
) logger
.error(err
)
179 PoolRequestsDB
.create({ id: id
, type: type
, request: request
}, function (err
) {
180 if (err
) logger
.error(err
)
186 poolRequests
.deactivate = function () {
187 logger
.info('Pool requests deactivated.')
191 module
.exports
= poolRequests