aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/models/request.js
diff options
context:
space:
mode:
Diffstat (limited to 'server/models/request.js')
-rw-r--r--server/models/request.js59
1 files changed, 37 insertions, 22 deletions
diff --git a/server/models/request.js b/server/models/request.js
index 34a4287ea..f5eec2134 100644
--- a/server/models/request.js
+++ b/server/models/request.js
@@ -2,6 +2,7 @@
2 2
3const each = require('async/each') 3const each = require('async/each')
4const eachLimit = require('async/eachLimit') 4const eachLimit = require('async/eachLimit')
5const values = require('lodash/values')
5const mongoose = require('mongoose') 6const mongoose = require('mongoose')
6const waterfall = require('async/waterfall') 7const waterfall = require('async/waterfall')
7 8
@@ -18,7 +19,16 @@ let lastRequestTimestamp = 0
18 19
19const RequestSchema = mongoose.Schema({ 20const RequestSchema = mongoose.Schema({
20 request: mongoose.Schema.Types.Mixed, 21 request: mongoose.Schema.Types.Mixed,
21 to: [ { type: mongoose.Schema.Types.ObjectId, ref: 'Pod' } ] 22 endpoint: {
23 type: String,
24 enum: [ values(constants.REQUEST_ENDPOINTS) ]
25 },
26 to: [
27 {
28 type: mongoose.Schema.Types.ObjectId,
29 ref: 'Pod'
30 }
31 ]
22}) 32})
23 33
24RequestSchema.statics = { 34RequestSchema.statics = {
@@ -93,7 +103,7 @@ function remainingMilliSeconds () {
93// --------------------------------------------------------------------------- 103// ---------------------------------------------------------------------------
94 104
95// Make a requests to friends of a certain type 105// Make a requests to friends of a certain type
96function makeRequest (toPod, requestsToMake, callback) { 106function makeRequest (toPod, requestEndpoint, requestsToMake, callback) {
97 if (!callback) callback = function () {} 107 if (!callback) callback = function () {}
98 108
99 const params = { 109 const params = {
@@ -101,7 +111,7 @@ function makeRequest (toPod, requestsToMake, callback) {
101 encrypt: true, // Security 111 encrypt: true, // Security
102 sign: true, // To prove our identity 112 sign: true, // To prove our identity
103 method: 'POST', 113 method: 'POST',
104 path: '/api/' + constants.API_VERSION + '/remote/videos', 114 path: '/api/' + constants.API_VERSION + '/remote/' + requestEndpoint,
105 data: requestsToMake // Requests we need to make 115 data: requestsToMake // Requests we need to make
106 } 116 }
107 117
@@ -144,31 +154,34 @@ function makeRequests () {
144 154
145 logger.info('Making requests to friends.') 155 logger.info('Making requests to friends.')
146 156
147 // Requests by pods id 157 // We want to group requests by destinations pod and endpoint
148 const requestsToMake = {} 158 const requestsToMakeGrouped = {}
149 159
150 requests.forEach(function (poolRequest) { 160 requests.forEach(function (poolRequest) {
151 poolRequest.to.forEach(function (toPodId) { 161 poolRequest.to.forEach(function (toPodId) {
152 if (!requestsToMake[toPodId]) { 162 const hashKey = toPodId + poolRequest.endpoint
153 requestsToMake[toPodId] = { 163 if (!requestsToMakeGrouped[hashKey]) {
154 ids: [], 164 requestsToMakeGrouped[hashKey] = {
155 datas: [] 165 toPodId,
166 endpoint: poolRequest.endpoint,
167 ids: [], // pool request ids, to delete them from the DB in the future
168 datas: [] // requests data,
156 } 169 }
157 } 170 }
158 171
159 requestsToMake[toPodId].ids.push(poolRequest._id) 172 requestsToMakeGrouped[hashKey].ids.push(poolRequest._id)
160 requestsToMake[toPodId].datas.push(poolRequest.request) 173 requestsToMakeGrouped[hashKey].datas.push(poolRequest.request)
161 }) 174 })
162 }) 175 })
163 176
164 const goodPods = [] 177 const goodPods = []
165 const badPods = [] 178 const badPods = []
166 179
167 eachLimit(Object.keys(requestsToMake), constants.REQUESTS_IN_PARALLEL, function (toPodId, callbackEach) { 180 eachLimit(Object.keys(requestsToMakeGrouped), constants.REQUESTS_IN_PARALLEL, function (hashKey, callbackEach) {
168 const requestToMake = requestsToMake[toPodId] 181 const requestToMake = requestsToMakeGrouped[hashKey]
169 182
170 // FIXME: mongodb request inside a loop :/ 183 // FIXME: mongodb request inside a loop :/
171 Pod.load(toPodId, function (err, toPod) { 184 Pod.load(requestToMake.toPodId, function (err, toPod) {
172 if (err) { 185 if (err) {
173 logger.error('Error finding pod by id.', { err: err }) 186 logger.error('Error finding pod by id.', { err: err })
174 return callbackEach() 187 return callbackEach()
@@ -176,21 +189,23 @@ function makeRequests () {
176 189
177 // Maybe the pod is not our friend anymore so simply remove it 190 // Maybe the pod is not our friend anymore so simply remove it
178 if (!toPod) { 191 if (!toPod) {
179 logger.info('Removing %d requests of unexisting pod %s.', requestToMake.ids.length, toPodId) 192 const requestIdsToDelete = requestToMake.ids
180 removePodOf.call(self, requestToMake.ids, toPodId) 193
194 logger.info('Removing %d requests of unexisting pod %s.', requestIdsToDelete.length, requestToMake.toPodId)
195 removePodOf.call(self, requestIdsToDelete, requestToMake.toPodId)
181 return callbackEach() 196 return callbackEach()
182 } 197 }
183 198
184 makeRequest(toPod, requestToMake.datas, function (success) { 199 makeRequest(toPod, requestToMake.endpoint, requestToMake.datas, function (success) {
185 if (success === true) { 200 if (success === true) {
186 logger.debug('Removing requests for %s pod.', toPodId, { requestsIds: requestToMake.ids }) 201 logger.debug('Removing requests for %s pod.', requestToMake.toPodId, { requestsIds: requestToMake.ids })
187 202
188 goodPods.push(toPodId) 203 goodPods.push(requestToMake.toPodId)
189 204
190 // Remove the pod id of these request ids 205 // Remove the pod id of these request ids
191 removePodOf.call(self, requestToMake.ids, toPodId, callbackEach) 206 removePodOf.call(self, requestToMake.ids, requestToMake.toPodId, callbackEach)
192 } else { 207 } else {
193 badPods.push(toPodId) 208 badPods.push(requestToMake.toPodId)
194 callbackEach() 209 callbackEach()
195 } 210 }
196 }) 211 })
@@ -260,7 +275,7 @@ function listWithLimitAndRandom (limit, callback) {
260 let start = Math.floor(Math.random() * count) - limit 275 let start = Math.floor(Math.random() * count) - limit
261 if (start < 0) start = 0 276 if (start < 0) start = 0
262 277
263 self.find({ }, { _id: 1, request: 1, to: 1 }).sort({ _id: 1 }).skip(start).limit(limit).exec(callback) 278 self.find().sort({ _id: 1 }).skip(start).limit(limit).exec(callback)
264 }) 279 })
265} 280}
266 281