aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/models/pod.js
diff options
context:
space:
mode:
authorChocobozzz <florian.bigard@gmail.com>2017-02-21 21:35:59 +0100
committerChocobozzz <florian.bigard@gmail.com>2017-02-26 20:01:26 +0100
commit9e167724f7e933f41d9ea2e1c31772bf4c560a28 (patch)
tree093cb7c1b088f35aaf847f859a313a121c8cd233 /server/models/pod.js
parent0150b17e51df3e9fad8a59133d828c68f8ba672b (diff)
downloadPeerTube-9e167724f7e933f41d9ea2e1c31772bf4c560a28.tar.gz
PeerTube-9e167724f7e933f41d9ea2e1c31772bf4c560a28.tar.zst
PeerTube-9e167724f7e933f41d9ea2e1c31772bf4c560a28.zip
Server: make a basic "quick and dirty update" for videos
This system will be useful to to update some int video attributes (likes, dislikes, views...) The classic system is not used because we need some optimization for scaling
Diffstat (limited to 'server/models/pod.js')
-rw-r--r--server/models/pod.js63
1 files changed, 61 insertions, 2 deletions
diff --git a/server/models/pod.js b/server/models/pod.js
index 79afb737a..14814708e 100644
--- a/server/models/pod.js
+++ b/server/models/pod.js
@@ -1,8 +1,11 @@
1'use strict' 1'use strict'
2 2
3const each = require('async/each')
3const map = require('lodash/map') 4const map = require('lodash/map')
5const waterfall = require('async/waterfall')
4 6
5const constants = require('../initializers/constants') 7const constants = require('../initializers/constants')
8const logger = require('../helpers/logger')
6const customPodsValidators = require('../helpers/custom-validators').pods 9const customPodsValidators = require('../helpers/custom-validators').pods
7 10
8// --------------------------------------------------------------------------- 11// ---------------------------------------------------------------------------
@@ -62,6 +65,7 @@ module.exports = function (sequelize, DataTypes) {
62 listBadPods, 65 listBadPods,
63 load, 66 load,
64 loadByHost, 67 loadByHost,
68 updatePodsScore,
65 removeAll 69 removeAll
66 }, 70 },
67 instanceMethods: { 71 instanceMethods: {
@@ -144,7 +148,7 @@ function listAllIds (transaction, callback) {
144 }) 148 })
145} 149}
146 150
147function listRandomPodIdsWithRequest (limit, callback) { 151function listRandomPodIdsWithRequest (limit, tableRequestPod, callback) {
148 const self = this 152 const self = this
149 153
150 self.count().asCallback(function (err, count) { 154 self.count().asCallback(function (err, count) {
@@ -166,7 +170,7 @@ function listRandomPodIdsWithRequest (limit, callback) {
166 where: { 170 where: {
167 id: { 171 id: {
168 $in: [ 172 $in: [
169 this.sequelize.literal('SELECT "podId" FROM "RequestToPods"') 173 this.sequelize.literal('SELECT "podId" FROM "' + tableRequestPod + '"')
170 ] 174 ]
171 } 175 }
172 } 176 }
@@ -207,3 +211,58 @@ function loadByHost (host, callback) {
207function removeAll (callback) { 211function removeAll (callback) {
208 return this.destroy().asCallback(callback) 212 return this.destroy().asCallback(callback)
209} 213}
214
215function updatePodsScore (goodPods, badPods) {
216 const self = this
217
218 logger.info('Updating %d good pods and %d bad pods scores.', goodPods.length, badPods.length)
219
220 if (goodPods.length !== 0) {
221 this.incrementScores(goodPods, constants.PODS_SCORE.BONUS, function (err) {
222 if (err) logger.error('Cannot increment scores of good pods.', { error: err })
223 })
224 }
225
226 if (badPods.length !== 0) {
227 this.incrementScores(badPods, constants.PODS_SCORE.MALUS, function (err) {
228 if (err) logger.error('Cannot decrement scores of bad pods.', { error: err })
229 removeBadPods.call(self)
230 })
231 }
232}
233
234// ---------------------------------------------------------------------------
235
236// Remove pods with a score of 0 (too many requests where they were unreachable)
237function removeBadPods () {
238 const self = this
239
240 waterfall([
241 function findBadPods (callback) {
242 self.sequelize.models.Pod.listBadPods(function (err, pods) {
243 if (err) {
244 logger.error('Cannot find bad pods.', { error: err })
245 return callback(err)
246 }
247
248 return callback(null, pods)
249 })
250 },
251
252 function removeTheseBadPods (pods, callback) {
253 each(pods, function (pod, callbackEach) {
254 pod.destroy().asCallback(callbackEach)
255 }, function (err) {
256 return callback(err, pods.length)
257 })
258 }
259 ], function (err, numberOfPodsRemoved) {
260 if (err) {
261 logger.error('Cannot remove bad pods.', { error: err })
262 } else if (numberOfPodsRemoved) {
263 logger.info('Removed %d pods.', numberOfPodsRemoved)
264 } else {
265 logger.info('No need to remove bad pods.')
266 }
267 })
268}