From bc084d40354ff107c10657d18b4765bd85abdd89 Mon Sep 17 00:00:00 2001 From: jmkerloch <53606373+jmkerloch@users.noreply.github.com> Date: Thu, 19 Oct 2023 10:30:15 +0200 Subject: [PATCH] [fix] disconnect all sources (so bases) when a restart is asked (#94) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [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 --- changelog.md | 4 ++ package.json | 2 +- src/js/base/base.js | 8 +-- src/js/base/baseManager.js | 1 + src/js/service/service.js | 33 ++++++++++++- src/js/service/serviceInsider.js | 9 +++- src/js/sources/pgrSource.js | 12 +++-- src/js/sources/sourceManager.js | 84 ++++++++++++++++++++++++++++++++ src/js/sources/valhallaSource.js | 2 +- 9 files changed, 142 insertions(+), 13 deletions(-) diff --git a/changelog.md b/changelog.md index 99e4781..72f7252 100644 --- a/changelog.md +++ b/changelog.md @@ -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 diff --git a/package.json b/package.json index 26f0edd..55b19da 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/js/base/base.js b/src/js/base/base.js index b20e576..903ed33 100644 --- a/src/js/base/base.js +++ b/src/js/base/base.js @@ -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"); @@ -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; diff --git a/src/js/base/baseManager.js b/src/js/base/baseManager.js index bbe8201..e10c69b 100644 --- a/src/js/base/baseManager.js +++ b/src/js/base/baseManager.js @@ -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. diff --git a/src/js/service/service.js b/src/js/service/service.js index be7c5b3..e444041 100644 --- a/src/js/service/service.js +++ b/src/js/service/service.js @@ -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 @@ -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); + } + }); } diff --git a/src/js/service/serviceInsider.js b/src/js/service/serviceInsider.js index 1c100bb..a8ce4bf 100644 --- a/src/js/service/serviceInsider.js +++ b/src/js/service/serviceInsider.js @@ -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 { diff --git a/src/js/sources/pgrSource.js b/src/js/sources/pgrSource.js index 2efb414..9e4033f 100644 --- a/src/js/sources/pgrSource.js +++ b/src/js/sources/pgrSource.js @@ -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 { @@ -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; } @@ -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"); } diff --git a/src/js/sources/sourceManager.js b/src/js/sources/sourceManager.js index 8b23b6f..fa8b192 100644 --- a/src/js/sources/sourceManager.js +++ b/src/js/sources/sourceManager.js @@ -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); @@ -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 @@ -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; + } + + } + } diff --git a/src/js/sources/valhallaSource.js b/src/js/sources/valhallaSource.js index b02250d..b15adb5 100644 --- a/src/js/sources/valhallaSource.js +++ b/src/js/sources/valhallaSource.js @@ -96,7 +96,7 @@ module.exports = class valhallaSource extends Source { * * @function * @name disconnect - * @description Déconnection + * @description Déconnexion * */ async disconnect() {