Skip to content

Commit

Permalink
[fix] disconnect all sources (so bases) when a restart is asked (#94)
Browse files Browse the repository at this point in the history
* [fix] disconnect all sources (so bases) when a restart is asked

* [fix] add disconnection of sources in sourceManager

* feat(changelog): update to 2.2.3

* fix(typo): use Déconnexion instead of Deconnection

* fix(typo): connection instead of connexion

---------

Co-authored-by: lgrd
  • Loading branch information
jmkerloch authored Oct 19, 2023
1 parent 9a62f3b commit bc084d4
Show file tree
Hide file tree
Showing 9 changed files with 142 additions and 13 deletions.
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

0 comments on commit bc084d4

Please sign in to comment.