X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fpod.js;h=8e2d488e109dd4036287e839adbfee6a2f699324;hb=85cd99dc84cea7e9f428f251214bcdae428a9843;hp=b3c6db8e881aa45e09afe688310ce3d8de6d37c2;hpb=bd14d16a29e2f90805d04b48378188517741a071;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/pod.js b/server/models/pod.js index b3c6db8e8..8e2d488e1 100644 --- a/server/models/pod.js +++ b/server/models/pod.js @@ -1,8 +1,11 @@ 'use strict' +const each = require('async/each') const map = require('lodash/map') +const waterfall = require('async/waterfall') const constants = require('../initializers/constants') +const logger = require('../helpers/logger') const customPodsValidators = require('../helpers/custom-validators').pods // --------------------------------------------------------------------------- @@ -32,12 +35,20 @@ module.exports = function (sequelize, DataTypes) { isInt: true, max: constants.FRIEND_SCORE.MAX } + }, + email: { + type: DataTypes.STRING(400), + allowNull: false, + validate: { + isEmail: true + } } }, { indexes: [ { - fields: [ 'host' ] + fields: [ 'host' ], + unique: true }, { fields: [ 'score' ] @@ -54,6 +65,7 @@ module.exports = function (sequelize, DataTypes) { listBadPods, load, loadByHost, + updatePodsScore, removeAll }, instanceMethods: { @@ -71,6 +83,7 @@ function toFormatedJSON () { const json = { id: this.id, host: this.host, + email: this.email, score: this.score, createdAt: this.createdAt } @@ -135,7 +148,12 @@ function listAllIds (transaction, callback) { }) } -function listRandomPodIdsWithRequest (limit, callback) { +function listRandomPodIdsWithRequest (limit, tableWithPods, tableWithPodsJoins, callback) { + if (!callback) { + callback = tableWithPodsJoins + tableWithPodsJoins = '' + } + const self = this self.count().asCallback(function (err, count) { @@ -157,7 +175,7 @@ function listRandomPodIdsWithRequest (limit, callback) { where: { id: { $in: [ - this.sequelize.literal('SELECT "podId" FROM "RequestToPods"') + this.sequelize.literal(`SELECT DISTINCT "${tableWithPods}"."podId" FROM "${tableWithPods}" ${tableWithPodsJoins}`) ] } } @@ -198,3 +216,58 @@ function loadByHost (host, callback) { function removeAll (callback) { return this.destroy().asCallback(callback) } + +function updatePodsScore (goodPods, badPods) { + const self = this + + logger.info('Updating %d good pods and %d bad pods scores.', goodPods.length, badPods.length) + + if (goodPods.length !== 0) { + this.incrementScores(goodPods, constants.PODS_SCORE.BONUS, function (err) { + if (err) logger.error('Cannot increment scores of good pods.', { error: err }) + }) + } + + if (badPods.length !== 0) { + this.incrementScores(badPods, constants.PODS_SCORE.MALUS, function (err) { + if (err) logger.error('Cannot decrement scores of bad pods.', { error: err }) + removeBadPods.call(self) + }) + } +} + +// --------------------------------------------------------------------------- + +// Remove pods with a score of 0 (too many requests where they were unreachable) +function removeBadPods () { + const self = this + + waterfall([ + function findBadPods (callback) { + self.sequelize.models.Pod.listBadPods(function (err, pods) { + if (err) { + logger.error('Cannot find bad pods.', { error: err }) + return callback(err) + } + + return callback(null, pods) + }) + }, + + function removeTheseBadPods (pods, callback) { + each(pods, function (pod, callbackEach) { + pod.destroy().asCallback(callbackEach) + }, function (err) { + return callback(err, pods.length) + }) + } + ], function (err, numberOfPodsRemoved) { + if (err) { + logger.error('Cannot remove bad pods.', { error: err }) + } else if (numberOfPodsRemoved) { + logger.info('Removed %d pods.', numberOfPodsRemoved) + } else { + logger.info('No need to remove bad pods.') + } + }) +}