support drain/undrain feature server from cluster

This commit is contained in:
Hoan HL
2025-10-27 14:34:13 +07:00
parent 0869a73052
commit f5fd4ec9b8
4 changed files with 43 additions and 2 deletions

View File

@@ -0,0 +1,24 @@
const router = require('express').Router();
const {srf} = require('../../..');
router.post('/drain', async(req, res) => {
const {logger} = req.app.locals;
const {setDryUpCalls} = srf.locals;
logger.info('Received drain request via HTTP API');
setDryUpCalls();
res.sendStatus(201);
});
router.post('/undrain', async(req, res) => {
const {logger} = req.app.locals;
const {clearDryUpCalls} = srf.locals;
logger.info('Received undrain request via HTTP API');
clearDryUpCalls();
res.sendStatus(201);
});
module.exports = router;

View File

@@ -8,5 +8,6 @@ api.use('/enqueue', require('./enqueue'));
api.use('/messaging', require('./messaging')); // inbound SMS
api.use('/createMessage', require('./create-message')); // outbound SMS (REST)
api.use('/cluster', require('./cluster'));
module.exports = api;

View File

@@ -71,7 +71,7 @@ function installSrfLocals(srf, logger, {
logger.debug('installing srf locals');
assert(!srf.locals.dbHelpers);
const {tracer} = srf.locals.otel;
const {getSBC, lifecycleEmitter} = require('./sbc-pinger')(logger);
const {getSBC, lifecycleEmitter, setDryUpCalls, clearDryUpCalls} = require('./sbc-pinger')(logger);
const StatsCollector = require('@jambonz/stats-collector');
const stats = srf.locals.stats = new StatsCollector(logger);
@@ -285,6 +285,8 @@ function installSrfLocals(srf, logger, {
},
parentLogger: logger,
getSBC,
setDryUpCalls,
clearDryUpCalls,
getSmpp: () => {
return SMPP_URL;
},

View File

@@ -166,9 +166,23 @@ module.exports = (logger) => {
}, 1000);
}
const setDryUpCalls = () => {
logger.info('setting dryUpCalls flag');
dryUpCalls = true;
};
const clearDryUpCalls = () => {
if (lifecycleEmitter.operationalState !== LifeCycleEvents.ScaleIn) {
logger.info('clearing dryUpCalls flag');
dryUpCalls = false;
}
};
return {
lifecycleEmitter,
getSBC: () => sbcs[idxSbc++ % sbcs.length]
getSBC: () => sbcs[idxSbc++ % sbcs.length],
setDryUpCalls,
clearDryUpCalls,
};
};