2015-12-10 03:17:45 +08:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
function JobCounterService(maxJobsPerHost, metadataBackend) {
|
|
|
|
this.metadataBackend = metadataBackend;
|
|
|
|
this.maxJobsPerHost = maxJobsPerHost || global.settings.max_jobs_per_instance;
|
|
|
|
this.db = 5;
|
|
|
|
}
|
|
|
|
|
|
|
|
JobCounterService.prototype.increment = function (host, callback) {
|
|
|
|
var self = this;
|
|
|
|
var db = this.db;
|
|
|
|
|
|
|
|
this.metadataBackend.redisCmd(db, 'GET', [host], function (err, hostCounter) {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hostCounter >= self.maxJobsPerHost) {
|
|
|
|
return callback(new Error('Limit max job per host is reached: %s jobs', hostCounter));
|
|
|
|
}
|
|
|
|
|
|
|
|
self.metadataBackend.redisCmd(db, 'INCR', [host], function (err /*, hostCounter */) {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
callback();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
JobCounterService.prototype.decrement = function (host, callback) {
|
|
|
|
var self = this;
|
|
|
|
var db = this.db;
|
|
|
|
|
|
|
|
this.metadataBackend.redisCmd(db, 'GET', [host], function (err, hostCounter) {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hostCounter < 0) {
|
2015-12-12 01:08:19 +08:00
|
|
|
return callback(new Error('Limit max job per host is reached').name= 'JobLimitReachedError');
|
2015-12-10 03:17:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
self.metadataBackend.redisCmd(db, 'DECR', [host], function (err /*, hostCounter */) {
|
|
|
|
if (err) {
|
|
|
|
return callback(err);
|
|
|
|
}
|
|
|
|
callback();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports = JobCounterService;
|