mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-04-21 16:06:16 -04:00
Refactor startup/shutdown for tests
* `src/node/server.js` can now be run as a script (for normal operation) or imported as a module (for tests). * Move shutdown actions to `src/node/server.js` to be close to the startup actions. * Put startup and shutdown in functions so that tests can call them. * Use `await` instead of callbacks. * Block until the HTTP server is listening to avoid races during test startup. * Add a new `shutdown` hook. * Use the `shutdown` hook to: * close the HTTP server * call `end()` on the stats collection to cancel its timers * call `terminate()` on the Threads.Pool to stop the workers * Exit with exit code 0 (instead of 1) on SIGTERM. * Export the HTTP server so that tests can get the HTTP server's port via `server.address().port` when `settings.port` is 0.
This commit is contained in:
parent
a4be577ed1
commit
a000a93dc6
11 changed files with 171 additions and 151 deletions
|
@ -5,18 +5,20 @@ var fs = require('fs');
|
|||
var path = require('path');
|
||||
var npm = require("npm/lib/npm.js");
|
||||
var _ = require("underscore");
|
||||
const util = require('util');
|
||||
|
||||
var server;
|
||||
var serverName;
|
||||
|
||||
exports.createServer = function () {
|
||||
exports.server = null;
|
||||
|
||||
exports.createServer = async () => {
|
||||
console.log("Report bugs at https://github.com/ether/etherpad-lite/issues")
|
||||
|
||||
serverName = `Etherpad ${settings.getGitCommit()} (https://etherpad.org)`;
|
||||
|
||||
console.log(`Your Etherpad version is ${settings.getEpVersion()} (${settings.getGitCommit()})`);
|
||||
|
||||
exports.restartServer();
|
||||
await exports.restartServer();
|
||||
|
||||
if (settings.ip === "") {
|
||||
// using Unix socket for connectivity
|
||||
|
@ -38,10 +40,10 @@ exports.createServer = function () {
|
|||
}
|
||||
}
|
||||
|
||||
exports.restartServer = function () {
|
||||
if (server) {
|
||||
exports.restartServer = async () => {
|
||||
if (exports.server) {
|
||||
console.log("Restarting express server");
|
||||
server.close();
|
||||
await util.promisify(exports.server.close).bind(exports.server)();
|
||||
}
|
||||
|
||||
var app = express(); // New syntax for express v3
|
||||
|
@ -65,10 +67,10 @@ exports.restartServer = function () {
|
|||
}
|
||||
|
||||
var https = require('https');
|
||||
server = https.createServer(options, app);
|
||||
exports.server = https.createServer(options, app);
|
||||
} else {
|
||||
var http = require('http');
|
||||
server = http.createServer(app);
|
||||
exports.server = http.createServer(app);
|
||||
}
|
||||
|
||||
app.use(function(req, res, next) {
|
||||
|
@ -110,7 +112,12 @@ exports.restartServer = function () {
|
|||
}
|
||||
|
||||
hooks.callAll("expressConfigure", {"app": app});
|
||||
hooks.callAll("expressCreateServer", {"app": app, "server": server});
|
||||
hooks.callAll('expressCreateServer', {app, server: exports.server});
|
||||
|
||||
server.listen(settings.port, settings.ip);
|
||||
}
|
||||
await util.promisify(exports.server.listen).bind(exports.server)(settings.port, settings.ip);
|
||||
};
|
||||
|
||||
exports.shutdown = async (hookName, context) => {
|
||||
if (!exports.server) return;
|
||||
await util.promisify(exports.server.close).bind(exports.server)();
|
||||
};
|
||||
|
|
|
@ -46,11 +46,10 @@ exports.socketio = function (hook_name, args, cb) {
|
|||
});
|
||||
});
|
||||
|
||||
socket.on("restartServer", function () {
|
||||
socket.on('restartServer', async () => {
|
||||
console.log("Admin request to restart server through a socket on /admin/settings");
|
||||
settings.reloadSettings();
|
||||
hooks.aCallAll("restartServer", {}, function () {});
|
||||
|
||||
await hooks.aCallAll('restartServer');
|
||||
});
|
||||
|
||||
});
|
||||
|
|
|
@ -1,39 +1,5 @@
|
|||
var os = require("os");
|
||||
var db = require('../../db/DB');
|
||||
var stats = require('ep_etherpad-lite/node/stats')
|
||||
|
||||
|
||||
exports.onShutdown = false;
|
||||
exports.gracefulShutdown = function(err) {
|
||||
if(err && err.stack) {
|
||||
console.error(err.stack);
|
||||
} else if(err) {
|
||||
console.error(err);
|
||||
}
|
||||
|
||||
// ensure there is only one graceful shutdown running
|
||||
if (exports.onShutdown) {
|
||||
return;
|
||||
}
|
||||
|
||||
exports.onShutdown = true;
|
||||
|
||||
console.log("graceful shutdown...");
|
||||
|
||||
// do the db shutdown
|
||||
db.doShutdown().then(function() {
|
||||
console.log("db sucessfully closed.");
|
||||
|
||||
process.exit(0);
|
||||
});
|
||||
|
||||
setTimeout(function() {
|
||||
process.exit(1);
|
||||
}, 3000);
|
||||
}
|
||||
|
||||
process.on('uncaughtException', exports.gracefulShutdown);
|
||||
|
||||
exports.expressCreateServer = function (hook_name, args, cb) {
|
||||
exports.app = args.app;
|
||||
|
||||
|
@ -46,28 +12,4 @@ exports.expressCreateServer = function (hook_name, args, cb) {
|
|||
console.error(err.stack? err.stack : err.toString());
|
||||
stats.meter('http500').mark()
|
||||
});
|
||||
|
||||
/*
|
||||
* Connect graceful shutdown with sigint and uncaught exception
|
||||
*
|
||||
* Until Etherpad 1.7.5, process.on('SIGTERM') and process.on('SIGINT') were
|
||||
* not hooked up under Windows, because old nodejs versions did not support
|
||||
* them.
|
||||
*
|
||||
* According to nodejs 6.x documentation, it is now safe to do so. This
|
||||
* allows to gracefully close the DB connection when hitting CTRL+C under
|
||||
* Windows, for example.
|
||||
*
|
||||
* Source: https://nodejs.org/docs/latest-v6.x/api/process.html#process_signal_events
|
||||
*
|
||||
* - SIGTERM is not supported on Windows, it can be listened on.
|
||||
* - SIGINT from the terminal is supported on all platforms, and can usually
|
||||
* be generated with <Ctrl>+C (though this may be configurable). It is not
|
||||
* generated when terminal raw mode is enabled.
|
||||
*/
|
||||
process.on('SIGINT', exports.gracefulShutdown);
|
||||
|
||||
// when running as PID1 (e.g. in docker container)
|
||||
// allow graceful shutdown on SIGTERM c.f. #3265
|
||||
process.on('SIGTERM', exports.gracefulShutdown);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue