From 549c738514b5c1f5da0c5660dba88d3fdab0df18 Mon Sep 17 00:00:00 2001 From: Theo Satabin Date: Thu, 4 Sep 2025 15:04:54 +0200 Subject: [PATCH] Configuration d'un timeout pour les lecture S3 et SWIFT --- .github/workflows/build-and-release.yaml | 13 +- CHANGELOG.md | 226 ++++++++++------------- CONTRIBUTING.md | 16 +- README.md | 1 + include/rok4/storage/Context.h | 1 + include/rok4/utils/LibcurlStruct.h | 13 ++ src/storage/S3Context.cpp | 22 +++ src/storage/S3Context.h | 6 + src/storage/SwiftContext.cpp | 31 ++++ src/storage/SwiftContext.h | 6 + 10 files changed, 201 insertions(+), 134 deletions(-) diff --git a/.github/workflows/build-and-release.yaml b/.github/workflows/build-and-release.yaml index 21969007..66410853 100644 --- a/.github/workflows/build-and-release.yaml +++ b/.github/workflows/build-and-release.yaml @@ -17,6 +17,17 @@ jobs: - name: Checkout project uses: actions/checkout@v3 + - name: Get latest release info + id: query_release_info + uses: release-flow/keep-a-changelog-action@v2 + with: + command: query + version: latest + + - name: Write release notes + run: | + echo "echo {{ steps.query-release-info.outputs.release-notes }} >notes.txt" + - name: Create Release id: create_release uses: ncipollo/release-action@v1 @@ -24,7 +35,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} tag: ${{ github.ref_name }} name: Release ${{ github.ref_name }} - generateReleaseNotes: true + bodyFile: notes.txt draft: false prerelease: false diff --git a/CHANGELOG.md b/CHANGELOG.md index cdc34f66..78ecf0ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,189 +1,167 @@ -## 2.0.5 +# Changelog -### [Fixed] +Tous les changements sont consignés dans ce fichier. -* `LibtiffImage` : Gestion des tiff jpeg de photometrie YCbCr avec les tiffs palettes dans le _getline (élargissement du test) +Le format est basé sur [Keep a Changelog](https://keepachangelog.com/) et ce projet respecte le [Semantic Versioning](https://semver.org/). -## 2.0.4 +## [Unreleased] -### [Fixed] +### Added -* `Merge` : correction du nombre de méthode +- `S3Context` et `SwiftContext` : possibilité de définir un timeout via la variable d'environnement `ROK4_NETWORK_TIMEOUT` (valeur à fournir en seconde) -## 2.0.3 +### Changed -### [Added] +- Refonte du CHANGELOG au format [Keep a Changelog](https://keepachangelog.com/) -* `TiffHeader` : la valeur de nodata est ajoutée dans le header des Geotiff +## [2.0.5] - 2025-07-23 -### [Fixed] +### Fixed -* `Style` : gestion d'une valeur par défaut pour la demande de nodata, en entrée et en sortie +- `LibtiffImage` : Gestion des tiff jpeg de photometrie YCbCr avec les tiffs palettes dans le _getline (élargissement du test) +- `Merge` : correction du nombre de méthode -## 2.0.2 +## [2.0.3] - 2025-04-08 -### [Fixed] +### Added -* `TiffDeflateEncoder` : l'encodage du résultat final n'est pas en deflate (seule la donnée dans le tiff l'est, et non le résultat complet) -* `S3Context` : on retourne bien false lorsqu'une erreur est rencontrée lors du flush (close_to_write) +- `TiffHeader` : la valeur de nodata est ajoutée dans le header des Geotiff +### Fixed -## 2.0.1 +- `Style` : gestion d'une valeur par défaut pour la demande de nodata, en entrée et en sortie -### [Added] +## [2.0.2] - 2025-02-17 -* `Keyword` : ajout d'un exporteur JSON (API Tiles) -* `TileMatrixLimits` : ajout d'un exporteur JSON (API Tiles) +### Fixed -## 2.0.0 +- `TiffDeflateEncoder` : l'encodage du résultat final n'est pas en deflate (seule la donnée dans le tiff l'est, et non le résultat complet) +- `S3Context` : on retourne bien false lorsqu'une erreur est rencontrée lors du flush (close_to_write) -### [Added] +## [2.0.1] - 2024-10-01 -* Internalisation de la lib json -* Ajout d'exporteur XML (via la lib boost) pour les entités Style, BoundingBox, Keyword, LegendURL, TileMatrixLimit et Style -* Création d'un annuaire pour les CRS pour éviter les créations en double +### Added -### [Changed] +- `Keyword` : ajout d'un exporteur JSON (API Tiles) +- `TileMatrixLimits` : ajout d'un exporteur JSON (API Tiles) +- Internalisation de la lib json +- Ajout d'exporteur XML (via la lib boost) pour les entités Style, BoundingBox, Keyword, LegendURL, TileMatrixLimit et Style +- Création d'un annuaire pour les CRS pour éviter les créations en double -* Passage complet en snake case -* Le format de canal contient le nombre de bits d'encodage -* Renommage StyledImage -> PaletteImage -* Renommage lzwEncoder -> LzwCompressor -* Renommage lzwDecoder -> LzwUncompressor -* Renommage pkbEncoder -> PkbCompressor -* Renommage pkbDecoder -> PkbUncompressor +### Changed -### [Deprecated] +- Passage complet en snake case +- Le format de canal contient le nombre de bits d'encodage +- Renommage StyledImage -> PaletteImage +- Renommage lzwEncoder -> LzwCompressor +- Renommage lzwDecoder -> LzwUncompressor +- Renommage pkbEncoder -> PkbCompressor +- Renommage pkbDecoder -> PkbUncompressor -Liste de fonctionnalités dépréciées. +### Removed -### [Removed] +- Suppression de la notion 'inspire' dans la gestion des styles +- Suppression de la classe ConvertedChannelsImage +- Suppression de la gestion de la compilation avec la librairie Kakadu +- Suppression des factory pour les classes filles de Image +- Suppression de la fonctionnalité de crop dans Rok4Image -* Suppression de la notion 'inspire' dans la gestion des styles -* Suppression de la classe ConvertedChannelsImage -* Suppression de la gestion de la compilation avec la librairie Kakadu -* Suppression des factory pour les classes filles de Image -* Suppression de la fonctionnalité de crop dans Rok4Image +### Fixed -### [Fixed] +- Correction du nettoyage des annuaires de TMS et styles -* Correction du nettoyage des annuaires de TMS et styles +## [1.4.0] - 2024-03-21 +### Added -## 1.4.0 - -### [Added] - -* Stockage objet (S3, Swift et Ceph) - * Possibilité de définir un nombre de tentatives pour les lectures (1 par défaut) : variable d'environnement `ROK4_OBJECT_READ_ATTEMPTS` - * Possibilité de définir un nombre de tentatives pour les écritures (1 par défaut) : variable d'environnement `ROK4_OBJECT_WRITE_ATTEMPTS` +- Stockage objet (S3, Swift et Ceph) + * Possibilité de définir un nombre de tentatives pour les lectures (1 par défaut) : variable d'environnement `ROK4_OBJECT_READ_ATTEMPTS` + * Possibilité de définir un nombre de tentatives pour les écritures (1 par défaut) : variable d'environnement `ROK4_OBJECT_WRITE_ATTEMPTS` * Possibilité de définir un temps d'attente, en secondes, entre les tentatives (5 par défaut) : variable d'environnement `ROK4_OBJECT_ATTEMPTS_WAIT` -## 1.3.1 - -### [Fixed] - -* `S3Context` : pour éviter des conflits dans une utilisation multithreadée, la sortie de la fonction HMAC (openssl) est dédiée. +## [1.3.1] - 2024-03-14 -## 1.3.0 +### Added -### [Added] - -* Gestion du multi cluster S3 : +- Gestion du multi cluster S3 : * nom du cluster = hôte du cluster avec le port (pas de protocole) * Pour préciser le cluster auquel on s'adresse, le nom du bucket aura la forme `@` * Les variables d'environnement `ROK4_S3_URL`, `ROK4_S3_KEY` et `ROK4_S3_SECRETKEY` peuvent contenir une liste de valeurs séparées par des virgules * **Dans** les descripteurs de pyramide et leur liste ou les objets symboliques, on peut ne pas préciser le nom du cluster : on sait alors qu'on travaille sur le même cluster que celui de l'objet d'origine -### [Fixed] - -* Attribute : dans les valeurs des attributs, on échappe les éventuelles back quotes - -## 1.2.4 - -### [Fixed] - -* `Cache` : les modifications dans le cache quand il n'est pas par thread (index des dalles, TMS et styles) se font en exclusion mutuelle (mutex lock et unlock) - -## 1.2.3 - -### [Fixed] - -* `Level` : Ajout de pixels de marge lors de la reprojection des données d'un niveau de pyramide - -## 1.2.2 - -### [Fixed] - -* `LibopenjpegImage` : la lecture des images JPEG 2000 tuilées recharge l'image à la lecture de chaque tuile - -## 1.2.1 +### Fixed -### [Fixed] +- `S3Context` : pour éviter des conflits dans une utilisation multithreadée, la sortie de la fonction HMAC (openssl) est dédiée. +- Attribute : dans les valeurs des attributs, on échappe les éventuelles back quotes -* `LegendURL` : la fonction de copie d'une instance recopie bien le format et le href -* `LibtiffImage` : correction du calcul de nombre de tuile dans la largeur lors de la lecture d'une image dont la largeur est un multiple de la taille de la tuile -* `BoundingBox` : lorsque l'on met en phase une bbox, les 4 bords doivent être traités indépendemment les uns des autres (avec un calcul de phase pour chacun) +## [1.2.4] - 2023-12-06 -### [Changed] +### Changed -* La variable d'environnement `ROK4_TMS_NO_CACHE` permet de désactiver le cache de chargement des TMS -* La variable d'environnement `ROK4_STYLES_NO_CACHE` permet de désactiver le cache de chargement des styles +- La variable d'environnement `ROK4_TMS_NO_CACHE` permet de désactiver le cache de chargement des TMS +- La variable d'environnement `ROK4_STYLES_NO_CACHE` permet de désactiver le cache de chargement des styles -## 1.1.2 +### Fixed -### [Changed] +- `Cache` : les modifications dans le cache quand il n'est pas par thread (index des dalles, TMS et styles) se font en exclusion mutuelle (mutex lock et unlock) +- `Level` : Ajout de pixels de marge lors de la reprojection des données d'un niveau de pyramide +- `LibopenjpegImage` : la lecture des images JPEG 2000 tuilées recharge l'image à la lecture de chaque tuile +- `LegendURL` : la fonction de copie d'une instance recopie bien le format et le href +- `LibtiffImage` : correction du calcul de nombre de tuile dans la largeur lors de la lecture d'une image dont la largeur est un multiple de la taille de la tuile +- `BoundingBox` : lorsque l'on met en phase une bbox, les 4 bords doivent être traités indépendemment les uns des autres (avec un calcul de phase pour chacun) -* Le test d'existence d'un objet ou d'un fichier n'est plus une lecture de 1 octet mais une implémentation spécifique à chaque type -* Les TMS et les styles sont cherchés sur le stockage avec et sans extension JSON +## [1.1.2] - 2023-09-14 -### [Fixed] +### Added -* Table - * Correction d'une typo dans l'écriture du metadata.json : filedsCount -> fieldsCount -* Style - * La valeur de nodata en sortie d'un style est la première valeur de la palette (et non la couleur pour la valeur 0) - -## 1.1.1 - -### [Fixed] - -* LibopenjpegImage - * Fixe sur la lecture des images à tuile unique suite au zonage - -## 1.1.0 - -### [Added] - -* LibtiffImage +- LibtiffImage * Capacité à lire des images tuilées * Capacité à lire des images avec palette -### [Changed] +### Changed -* LibopenjpegImage +- Le test d'existence d'un objet ou d'un fichier n'est plus une lecture de 1 octet mais une implémentation spécifique à chaque type +- Les TMS et les styles sont cherchés sur le stockage avec et sans extension JSON +- LibopenjpegImage * Lecture des images à tuile unique par paquet de 256 lignes * Lecture des images tuilées par tuile +### Fixed -## 1.0.3 +- Table + * Correction d'une typo dans l'écriture du metadata.json : filedsCount -> fieldsCount +- Style + * La valeur de nodata en sortie d'un style est la première valeur de la palette (et non la couleur pour la valeur 0) +- LibopenjpegImage + * Fixe sur la lecture des images à tuile unique suite au zonage + +## [1.0.3] - 2023-03-14 Les librairies sont gérées de manière indépendantes, conditionnées pour être installées en tant que dépendance dynamique. Le projet a son propre site, avec toutes les versions et leur documentation. -### [Added] +### Added -* Librairie, partie `utils` : +- Librairie, partie `utils` : * Styles et TMS sont chargés dans un annuaire, qui connait le dossier de stockage des fichiers / objets les définissant * Les pyramide sont chargées depuis leur descripteur, fichier ou objet -* Librairie, partie `storage` : gère un annuaire de contextes de stockages, fichier, Swift, S3 ou Ceph -* Librairie, partie `image` : permet la lecture et le calcul ligne par ligne -* Librairie, partie `datasource` : permet la lecture en une fois d'un buffer de donnée -* Librairie, partie `datasource` : permet la lecture par morceau d'un buffer de donnée -* Librairie, partie `processors` : gère plusieurs noyaux d'interpolation et la conversion de pixel - -* Intégration continue : +- Librairie, partie `storage` : gère un annuaire de contextes de stockages, fichier, Swift, S3 ou Ceph +- Librairie, partie `image` : permet la lecture et le calcul ligne par ligne +- Librairie, partie `datasource` : permet la lecture en une fois d'un buffer de donnée +- Librairie, partie `datasource` : permet la lecture par morceau d'un buffer de donnée +- Librairie, partie `processors` : gère plusieurs noyaux d'interpolation et la conversion de pixel +- Intégration continue : * Compilation du fichier librok4.so et conditionnement dans des paquets debian avec les headers, avec et sans la prise en charge du stockage ceph * Jeu des tests unitaires * Compilation de la documentation et publication sur la branche gh-pages - -* Ajout du mode DEBUG à la compilation \ No newline at end of file +- Ajout du mode DEBUG à la compilation + +[Unreleased]: https://github.com/rok4/core-cpp/compare/v2.0.5...HEAD +[2.0.5]: https://github.com/rok4/core-cpp/compare/v2.0.3...v2.0.5 +[2.0.3]: https://github.com/rok4/core-cpp/compare/v2.0.2...v2.0.3 +[2.0.2]: https://github.com/rok4/core-cpp/compare/v2.0.1...v2.0.2 +[2.0.1]: https://github.com/rok4/core-cpp/compare/v1.4.0...v2.0.1 +[1.4.0]: https://github.com/rok4/core-cpp/compare/v1.3.1...v1.4.0 +[1.3.1]: https://github.com/rok4/core-cpp/compare/v1.2.4...v1.3.1 +[1.2.4]: https://github.com/rok4/core-cpp/compare/v1.1.2...v1.2.4 +[1.1.2]: https://github.com/rok4/core-cpp/compare/v1.0.3...v1.1.2 +[1.0.3]: https://github.com/rok4/core-cpp/releases/tag/v1.0.3 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4c3895db..8ef75cf2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,32 +4,30 @@ Merci d'envisager de contribuer à ce projet ! ## Pull request -Le titre de la PR est utilisé pour constituer automatiquement les notes de release. Vous pouvez préciser en commentaire de votre PR des détails qui seront ajoutés dans le fichier `CHANGELOG.md` par les mainteneurs du projet. - -Le formalisme du changelog est le suivant, en markdown : +Complétez le fichier `CHANGELOG.md`, dans la partie `[Unreleased]`, en précisant les modifications fonctionnelles apportées. Celles ci seront utilisées pour rédiger le message de release sur GitHub. Le format est basé sur [Keep a Changelog](https://keepachangelog.com/). Les sections sont les suivantes : ```md -### [Added] +### Added Liste de nouvelles fonctionnalités. -### [Changed] +### Changed Liste de fonctionnalités existantes modifiées. -### [Deprecated] +### Deprecated Liste de fonctionnalités dépréciées. -### [Removed] +### Removed Liste de foncitonnalités retirées. -### [Fixed] +### Fixed Liste de corrections fonctionnelles. -### [Security] +### Security Liste de corrections de sécurité. ``` diff --git a/README.md b/README.md index 41dc1860..0ab83793 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ Leur définition est contrôlée à l'usage. - `ROK4_SWIFT_TOKEN_FILE` afin de sauvegarder le token d'accès, et ne pas le demander si ce fichier en contient un * Pour configurer l'usage de libcurl (intéraction SWIFT et S3) - `ROK4_SSL_NO_VERIFY` + - `ROK4_NETWORK_TIMEOUT` : temps en secondes d'inactivité d'une requête avant de la stopper. Aucun temps défini côté client si aucune valeur fournie - `HTTP_PROXY` - `HTTPS_PROXY` - `NO_PROXY` diff --git a/include/rok4/storage/Context.h b/include/rok4/storage/Context.h index 554cb6ea..a281f5ba 100644 --- a/include/rok4/storage/Context.h +++ b/include/rok4/storage/Context.h @@ -57,6 +57,7 @@ #define ROK4_OBJECT_READ_ATTEMPTS "ROK4_OBJECT_READ_ATTEMPTS" #define ROK4_OBJECT_WRITE_ATTEMPTS "ROK4_OBJECT_WRITE_ATTEMPTS" #define ROK4_OBJECT_ATTEMPTS_WAIT "ROK4_OBJECT_ATTEMPTS_WAIT" +#define ROK4_NETWORK_TIMEOUT "ROK4_NETWORK_TIMEOUT" /** * \author Institut national de l'information géographique et forestière diff --git a/include/rok4/utils/LibcurlStruct.h b/include/rok4/utils/LibcurlStruct.h index 4948f594..2d7ae56d 100644 --- a/include/rok4/utils/LibcurlStruct.h +++ b/include/rok4/utils/LibcurlStruct.h @@ -49,6 +49,10 @@ #define ROK4_SSL_NO_VERIFY "ROK4_SSL_NO_VERIFY" #endif +#ifndef ROK4_NETWORK_TIMEOUT +#define ROK4_NETWORK_TIMEOUT "ROK4_NETWORK_TIMEOUT" +#endif + #include struct HeaderStruct { @@ -131,4 +135,13 @@ static bool get_ssl_no_verify() { return getenv(ROK4_SSL_NO_VERIFY) != NULL; } +static int get_timeout() { + + int t; + char* e = getenv (ROK4_NETWORK_TIMEOUT); + if (e == NULL || sscanf ( e, "%d", &t ) != 1 ) { + t = 0; + } + return t; +} diff --git a/src/storage/S3Context.cpp b/src/storage/S3Context.cpp index c994523c..c956d4d4 100644 --- a/src/storage/S3Context.cpp +++ b/src/storage/S3Context.cpp @@ -65,6 +65,7 @@ std::vector S3Context::env_secret_keys; std::vector S3Context::env_cluster_names; std::vector S3Context::env_urls; bool S3Context::ssl_no_verify = false; +int S3Context::timeout = 0; bool S3Context::load_env() { if (!env_hosts.empty()) { @@ -133,6 +134,7 @@ bool S3Context::load_env() { } ssl_no_verify = get_ssl_no_verify(); + timeout = get_timeout(); // Analyse des valeurs @@ -348,6 +350,11 @@ int S3Context::read(uint8_t *data, int offset, int size, std::string name) { curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, data_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + if (timeout) { + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + } + BOOST_LOG_TRIVIAL(debug) << "S3 READ START (" << size << ") " << pthread_self(); res = curl_easy_perform(curl); BOOST_LOG_TRIVIAL(debug) << "S3 READ END (" << size << ") " << pthread_self(); @@ -448,6 +455,11 @@ uint8_t *S3Context::read_full(int &size, std::string name) { curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, data_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + if (timeout) { + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + } + res = curl_easy_perform(curl); curl_slist_free_all(list); @@ -627,6 +639,11 @@ bool S3Context::close_to_write(std::string name) { curl_easy_setopt(curl, CURLOPT_POSTFIELDS, &((*(it1->second))[0])); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, it1->second->size()); + if (timeout) { + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + } + res = curl_easy_perform(curl); curl_slist_free_all(list); @@ -712,6 +729,11 @@ bool S3Context::exists(std::string name) { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); } + if (timeout) { + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + } + res = curl_easy_perform(curl); curl_slist_free_all(list); diff --git a/src/storage/S3Context.h b/src/storage/S3Context.h index 39d2c5f3..e2827e07 100644 --- a/src/storage/S3Context.h +++ b/src/storage/S3Context.h @@ -103,6 +103,12 @@ class S3Context : public Context { */ static bool ssl_no_verify; + /** + * \~french \brief Temps avant timeout en secondes + * \~english \brief Timeout value, in seconds + */ + static int timeout; + /** * \~french \brief Charge les informations S3 depuis les variables d'environnement * \~english \brief Load S3 informations from environment variables diff --git a/src/storage/SwiftContext.cpp b/src/storage/SwiftContext.cpp index ce425dbc..c50f9ac8 100644 --- a/src/storage/SwiftContext.cpp +++ b/src/storage/SwiftContext.cpp @@ -89,6 +89,7 @@ SwiftContext::SwiftContext (std::string cont) : Context(), ssl_no_verify(false), } ssl_no_verify = get_ssl_no_verify(); + timeout = get_timeout(); } bool SwiftContext::connection() { @@ -175,6 +176,11 @@ bool SwiftContext::connection() { curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, data_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &chunk); + if (timeout) { + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + } + res = curl_easy_perform(curl); if( CURLE_OK != res) { BOOST_LOG_TRIVIAL(error) << "Cannot authenticate to Keystone"; @@ -253,6 +259,11 @@ bool SwiftContext::connection() { curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void*) &authHdr); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback); + if (timeout) { + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + } + res = curl_easy_perform(curl); if( CURLE_OK != res) { BOOST_LOG_TRIVIAL(error) << "Cannot authenticate to Swift"; @@ -325,6 +336,11 @@ int SwiftContext::read(uint8_t* data, int offset, int size, std::string name) { curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, data_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &chunk); + if (timeout) { + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + } + BOOST_LOG_TRIVIAL(debug) << "SWIFT READ START (" << size << ") " << pthread_self(); res = curl_easy_perform(curl); BOOST_LOG_TRIVIAL(debug) << "SWIFT READ END (" << size << ") " << pthread_self(); @@ -412,6 +428,11 @@ uint8_t* SwiftContext::read_full(int& size, std::string name) { curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, data_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &chunk); + if (timeout) { + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + } + res = curl_easy_perform(curl); curl_slist_free_all(list); @@ -562,6 +583,11 @@ bool SwiftContext::close_to_write(std::string name) { curl_easy_setopt(curl, CURLOPT_POSTFIELDS, &((*(it1->second))[0])); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, it1->second->size()); + if (timeout) { + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + } + res = curl_easy_perform(curl); curl_slist_free_all(list); @@ -646,6 +672,11 @@ bool SwiftContext::exists(std::string name) { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); } + if (timeout) { + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, timeout); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout); + } + res = curl_easy_perform(curl); curl_slist_free_all(list); diff --git a/src/storage/SwiftContext.h b/src/storage/SwiftContext.h index 34137d21..e3b02e96 100644 --- a/src/storage/SwiftContext.h +++ b/src/storage/SwiftContext.h @@ -144,6 +144,12 @@ class SwiftContext : public Context{ */ bool ssl_no_verify; + /** + * \~french \brief Temps avant timeout en secondes + * \~english \brief Timeout value, in seconds + */ + int timeout; + public: