]>
Commit | Line | Data |
---|---|---|
0b697522 C |
1 | ;(function () { |
2 | 'use strict' | |
3 | ||
4 | var async = require('async') | |
c45f7f84 | 5 | var pluck = require('lodash-node/compat/collection/pluck') |
0b697522 | 6 | |
cda02107 | 7 | var constants = require('../initializers/constants') |
c45f7f84 | 8 | var logger = require('../helpers/logger') |
c173e565 C |
9 | var Pods = require('../models/pods') |
10 | var PoolRequests = require('../models/poolRequests') | |
dac0a531 | 11 | var requests = require('../helpers/requests') |
c173e565 | 12 | var Videos = require('../models/videos') |
0b697522 | 13 | |
0b697522 C |
14 | var timer = null |
15 | ||
c45f7f84 C |
16 | var poolRequests = { |
17 | activate: activate, | |
1fe5076f | 18 | addRequest: addRequest, |
c45f7f84 C |
19 | deactivate: deactivate, |
20 | forceSend: forceSend | |
21 | } | |
22 | ||
1fe5076f C |
23 | function activate () { |
24 | logger.info('Pool requests activated.') | |
25 | timer = setInterval(makePoolRequests, constants.INTERVAL) | |
26 | } | |
27 | ||
28 | function addRequest (id, type, request) { | |
29 | logger.debug('Add request to the pool requests.', { id: id, type: type, request: request }) | |
30 | ||
31 | PoolRequests.findById(id, function (err, entity) { | |
32 | if (err) { | |
33 | logger.error('Cannot find one pool request.', { error: err }) | |
34 | return // Abort | |
35 | } | |
36 | ||
37 | if (entity) { | |
38 | if (entity.type === type) { | |
39 | logger.error('Cannot insert two same requests.') | |
40 | return // Abort | |
41 | } | |
42 | ||
43 | // Remove the request of the other type | |
44 | PoolRequests.removeById(id, function (err) { | |
45 | if (err) { | |
46 | logger.error('Cannot remove a pool request.', { error: err }) | |
47 | return // Abort | |
48 | } | |
49 | }) | |
50 | } else { | |
51 | PoolRequests.create(id, type, request, function (err) { | |
52 | logger.error('Cannot create a pool request.', { error: err }) | |
53 | return // Abort | |
54 | }) | |
55 | } | |
56 | }) | |
57 | } | |
58 | ||
c45f7f84 C |
59 | function deactivate () { |
60 | logger.info('Pool requests deactivated.') | |
61 | clearInterval(timer) | |
62 | } | |
63 | ||
64 | function forceSend () { | |
65 | logger.info('Force pool requests sending.') | |
66 | makePoolRequests() | |
67 | } | |
68 | ||
c45f7f84 C |
69 | // --------------------------------------------------------------------------- |
70 | ||
71 | module.exports = poolRequests | |
72 | ||
73 | // --------------------------------------------------------------------------- | |
74 | ||
dac0a531 | 75 | function makePoolRequest (type, requests_to_make, callback) { |
c45f7f84 C |
76 | if (!callback) callback = function () {} |
77 | ||
c173e565 | 78 | Pods.list(function (err, pods) { |
8425cb89 | 79 | if (err) return callback(err) |
c45f7f84 C |
80 | |
81 | var params = { | |
82 | encrypt: true, | |
83 | sign: true, | |
84 | method: 'POST', | |
85 | path: null, | |
dac0a531 | 86 | data: requests_to_make |
c45f7f84 C |
87 | } |
88 | ||
89 | if (type === 'add') { | |
90 | params.path = '/api/' + constants.API_VERSION + '/remotevideos/add' | |
91 | } else if (type === 'remove') { | |
92 | params.path = '/api/' + constants.API_VERSION + '/remotevideos/remove' | |
93 | } else { | |
8425cb89 | 94 | return callback(new Error('Unkown pool request type.')) |
c45f7f84 C |
95 | } |
96 | ||
97 | var bad_pods = [] | |
98 | var good_pods = [] | |
99 | ||
dac0a531 | 100 | requests.makeMultipleRetryRequest(params, pods, callbackEachPodFinished, callbackAllPodsFinished) |
c45f7f84 C |
101 | |
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') }) | |
106 | } else { | |
107 | good_pods.push(pod._id) | |
108 | } | |
109 | ||
110 | return callback_each_pod_finished() | |
111 | } | |
112 | ||
113 | function callbackAllPodsFinished (err) { | |
114 | if (err) return callback(err) | |
115 | ||
116 | updatePodsScore(good_pods, bad_pods) | |
117 | callback(null) | |
118 | } | |
8d6ae227 C |
119 | }) |
120 | } | |
121 | ||
0b697522 C |
122 | function makePoolRequests () { |
123 | logger.info('Making pool requests to friends.') | |
124 | ||
c173e565 | 125 | PoolRequests.list(function (err, pool_requests) { |
8425cb89 C |
126 | if (err) { |
127 | logger.error('Cannot get the list of pool requests.', { err: err }) | |
128 | return // Abort | |
129 | } | |
0b697522 | 130 | |
155098af C |
131 | if (pool_requests.length === 0) return |
132 | ||
dac0a531 | 133 | var requests_to_make = { |
8d6ae227 C |
134 | add: { |
135 | ids: [], | |
136 | requests: [] | |
137 | }, | |
138 | remove: { | |
139 | ids: [], | |
140 | requests: [] | |
141 | } | |
0b697522 C |
142 | } |
143 | ||
144 | async.each(pool_requests, function (pool_request, callback_each) { | |
145 | if (pool_request.type === 'add') { | |
dac0a531 C |
146 | requests_to_make.add.requests.push(pool_request.request) |
147 | requests_to_make.add.ids.push(pool_request._id) | |
0b697522 | 148 | } else if (pool_request.type === 'remove') { |
dac0a531 C |
149 | requests_to_make.remove.requests.push(pool_request.request) |
150 | requests_to_make.remove.ids.push(pool_request._id) | |
0b697522 | 151 | } else { |
8425cb89 C |
152 | logger.error('Unkown pool request type.', { request_type: pool_request.type }) |
153 | return // abort | |
0b697522 C |
154 | } |
155 | ||
156 | callback_each() | |
157 | }, function () { | |
8d6ae227 | 158 | // Send the add requests |
dac0a531 C |
159 | if (requests_to_make.add.requests.length !== 0) { |
160 | makePoolRequest('add', requests_to_make.add.requests, function (err) { | |
8d6ae227 C |
161 | if (err) logger.error('Errors when sent add pool requests.', { error: err }) |
162 | ||
dac0a531 | 163 | PoolRequests.removeRequests(requests_to_make.add.ids) |
8d6ae227 C |
164 | }) |
165 | } | |
166 | ||
167 | // Send the remove requests | |
dac0a531 C |
168 | if (requests_to_make.remove.requests.length !== 0) { |
169 | makePoolRequest('remove', requests_to_make.remove.requests, function (err) { | |
8d6ae227 C |
170 | if (err) logger.error('Errors when sent remove pool requests.', { error: err }) |
171 | ||
dac0a531 | 172 | PoolRequests.removeRequests(requests_to_make.remove.ids) |
8d6ae227 C |
173 | }) |
174 | } | |
0b697522 C |
175 | }) |
176 | }) | |
177 | } | |
178 | ||
0b697522 | 179 | function removeBadPods () { |
c173e565 | 180 | Pods.findBadPods(function (err, pods) { |
8425cb89 C |
181 | if (err) { |
182 | logger.error('Cannot find bad pods.', { error: err }) | |
183 | return // abort | |
184 | } | |
0b697522 | 185 | |
45239549 C |
186 | if (pods.length === 0) return |
187 | ||
188 | var urls = pluck(pods, 'url') | |
189 | var ids = pluck(pods, '_id') | |
190 | ||
c173e565 | 191 | Videos.removeAllRemotesOf(urls, function (err, r) { |
8425cb89 C |
192 | if (err) { |
193 | logger.error('Cannot remove videos from a pod that we removing.', { error: err }) | |
194 | } else { | |
195 | var videos_removed = r.result.n | |
196 | logger.info('Removed %d videos.', videos_removed) | |
197 | } | |
45239549 | 198 | |
c173e565 | 199 | Pods.removeAllByIds(ids, function (err, r) { |
8425cb89 C |
200 | if (err) { |
201 | logger.error('Cannot remove bad pods.', { error: err }) | |
202 | } else { | |
203 | var pods_removed = r.result.n | |
204 | logger.info('Removed %d pods.', pods_removed) | |
205 | } | |
45239549 C |
206 | }) |
207 | }) | |
0b697522 C |
208 | }) |
209 | } | |
210 | ||
c45f7f84 C |
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) | |
0b697522 | 213 | |
8425cb89 C |
214 | Pods.incrementScores(good_pods, constants.PODS_SCORE.BONUS, function (err) { |
215 | if (err) logger.error('Cannot increment scores of good pods.') | |
216 | }) | |
217 | ||
c173e565 | 218 | Pods.incrementScores(bad_pods, constants.PODS_SCORE.MALUS, function (err) { |
8425cb89 | 219 | if (err) logger.error('Cannot increment scores of bad pods.') |
c45f7f84 | 220 | removeBadPods() |
0b697522 C |
221 | }) |
222 | } | |
0b697522 | 223 | })() |