Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[fix] disconnect all sources (so bases) when a restart is asked #94

Merged
merged 5 commits into from
Oct 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# CHANGELOG

## 2.2.3
FIXED:
- Sources were not disconnected during a restart #93

## 2.2.2
FIXED:
- Route requests not working with pgr resources
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "road2",
"version": "2.2.2",
"version": "2.2.3",
"description": "Calcul d'itinéraire",
"author": "RDEV - IGN",
"main": "src/js/road2.js",
Expand Down
8 changes: 4 additions & 4 deletions src/js/base/base.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ module.exports = class Base {

if (this._pool) {
await this._pool.connect();
LOGGER.info("Connecte a la base de données");
LOGGER.info("Pool connecté à la base");
this._connected = true;
} else {
throw errorManager.createError("PG is not available");
Expand All @@ -101,19 +101,19 @@ module.exports = class Base {
*
* @function
* @name disconnect
* @description Déconnection à la base pgRouting
* @description Déconnexion à la base pgRouting
*
*/
async disconnect() {

try {

LOGGER.info("Deconnection de la base...");
LOGGER.info("Déconnexion de la base...");

if (this._pool) {

await this._pool.end(() => {
LOGGER.info("Deconnection du pool effectuee");
LOGGER.info("Déconnexion du pool effectuee");
});

this._connected = false;
Expand Down
1 change: 1 addition & 0 deletions src/js/base/baseManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ module.exports = class baseManager {

// on vérifie d'abord que la base n'a pas déjà été créée
if (this._baseCatalog[dbConfigPath]) {
LOGGER.debug("Base's already loaded");
return true;
} else {
// TODO la base n'existe pas, on vérifie que le contenu de la conf n'est pas le même qu'une base déjà chargée.
Expand Down
33 changes: 31 additions & 2 deletions src/js/service/service.js
Original file line number Diff line number Diff line change
Expand Up @@ -882,6 +882,28 @@ module.exports = class Service {

}

/**
*
* @function
* @name disconnectSources
* @description Déconnecter toutes les sources du service
*
*/
async disconnectSources() {

LOGGER.info("Déconnexion des sources du service...");

// Connexion des sources
if (!(await this._sourceManager.disconnectAllSources())) {
LOGGER.fatal("Impossible de déconnecter toutes les sources du service");
return false;
} else {
LOGGER.info("Les sources du service potentiellement déconnectables ont été déconnectées");
return true;
}

}

/**
*
* @function
Expand Down Expand Up @@ -1027,13 +1049,20 @@ module.exports = class Service {
LOGGER.debug("Réception du signal SIGTERM pour arrêter le service");

if (await this.stopServers()) {
LOGGER.debug("Les serveurs sont bien arrêtés, on peut sortir du service (exit)")
process.exit(0);
LOGGER.debug("Les serveurs sont bien arrêtés");
} else {
LOGGER.fatal("Les serveurs ne se sont pas bien arrếtés");
process.exit(1);
}

if (await this.disconnectSources()) {
LOGGER.debug("Les sources sont bien déconnectées, on peut sortir du service (exit)");
process.exit(0);
} else {
LOGGER.fatal("Les sources ne se sont pas bien déconnectées");
process.exit(2);
}

});

}
Expand Down
9 changes: 8 additions & 1 deletion src/js/service/serviceInsider.js
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,14 @@ module.exports = class ServiceInsider extends ServiceAdministered {
LOGGER.debug("Arrêt d'un service dans le même processus");

if (await this._serviceInstance.stopServers()) {
LOGGER.debug("Service arrêté.");
LOGGER.debug("Servers arrêtés.");
} else {
LOGGER.error("Le service n'a pu être arrêté");
return false;
}

if (await this._serviceInstance.disconnectSources()) {
LOGGER.debug("Sources déconnectées.");
this._serviceInstance = null;
return true;
} else {
Expand Down
12 changes: 8 additions & 4 deletions src/js/sources/pgrSource.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,11 @@ module.exports = class pgrSource extends Source {
*/
async connect() {

LOGGER.debug("Connection to the base asked from a pgrSource...");

if (!this._base.connected) {

LOGGER.debug("pgrSource need to connect itself to the base");
// Connection à la base de données
try {

Expand All @@ -157,6 +160,7 @@ module.exports = class pgrSource extends Source {

} else {
// Road2 est déjà connecté à la base
LOGGER.debug("pgrSource's already connected to the base");
this._connected = true;
}

Expand All @@ -167,24 +171,24 @@ module.exports = class pgrSource extends Source {
*
* @function
* @name disconnect
* @description Déconnection à la base pgRouting
* @description Déconnexion à la base pgRouting
*
*/
async disconnect() {

LOGGER.info("Tentative de deconnection de la base...");
LOGGER.info("Tentative de déconnexion de la base...");

if (this._base.connected) {

try {

await this._base.disconnect();
LOGGER.info("Deconnection de la base effectuee");
LOGGER.info("Déconnexion de la base effectuee");
this._connected = false;

} catch(err) {

LOGGER.error('deconnection error', err.stack);
LOGGER.error('disconnection error', err.stack);
throw errorManager.createError("Cannot disconnect to source database");

}
Expand Down
84 changes: 84 additions & 0 deletions src/js/sources/sourceManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -942,6 +942,7 @@ module.exports = class sourceManager {
return false;
} else {
base = this._baseManager.getBase(sourceJsonObject.storage.base.dbConfig);
LOGGER.debug("Récuperation de la base configurée dans : " + sourceJsonObject.storage.base.dbConfig);
}
// Création de la source
source = new pgrSource(sourceJsonObject, base);
Expand Down Expand Up @@ -993,6 +994,33 @@ module.exports = class sourceManager {

}

/**
*
* @function
* @name disconnectSource
* @description Fonction utilisée pour déconnecter une source.
* @param {string} sourceId - Id de la source que l'on veut déconnecter
*
*/
async disconnectSource(sourceId) {

LOGGER.info("Déconnexion de la source: " + sourceId);

try {

await this._sources[sourceId].disconnect();
LOGGER.info("Source déconnectee.");
return true;

} catch (err) {

LOGGER.error("Impossible de déconnecter la source.", err);
return false;

}

}

/**
*
* @function
Expand Down Expand Up @@ -1051,4 +1079,60 @@ module.exports = class sourceManager {

}

/**
*
* @function
* @name disconnectAllSources
* @description Déconnecter l'ensemble des sources disponibles dans le manager
*
*/
async disconnectAllSources() {

LOGGER.info("Déconnexion de l'ensemble des sources...");

if (this._loadedSourceId.length === 0) {
LOGGER.warn("Aucune source n'est disponible");
return true;
}

try {
assert.deepStrictEqual(this._loadedSourceConfiguration, {});
LOGGER.error("Aucune source n'a été préalablement chargée");
return false;
} catch (err) {
// tout va bien
}

let nbSourceDisconnected = 0;

for (let i = 0; i < this._loadedSourceId.length; i++) {

LOGGER.info("Source : " + this._loadedSourceId[i]);

if (!(await this.disconnectSource(this._loadedSourceId[i]))) {

LOGGER.error("Source " + this._loadedSourceId[i] + " non déconnectée");
return false;

} else {

LOGGER.info("Source " + this._loadedSourceId[i] + " déconnectée");
nbSourceDisconnected++;

}

}

LOGGER.info("Les déconnexions se sont bien déroulés.");

if (nbSourceDisconnected === 0) {
LOGGER.error("Aucune source n'a pu être déconnectée");
return false;
} else {
LOGGER.info("Au moins une source a été déconnectée");
return true;
}

}

}
2 changes: 1 addition & 1 deletion src/js/sources/valhallaSource.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ module.exports = class valhallaSource extends Source {
*
* @function
* @name disconnect
* @description Déconnection
* @description Déconnexion
*
*/
async disconnect() {
Expand Down
Loading