Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je viens vous demander votre aide aujourd'hui car je remarque qu'au bout de quelques heures (entre 5 et 30), mon client postgresql n'arrive plus à se connecter à la base. Le problème c'est qu'un SIGPIPE est envoyé au programme et cause son arrêt
Le système est une machine CentOS 7. Le serveur PostgreSQL 9.5 a été installé avec les sources pour pouvoir intégrer PL/Python. L'application qui instancie le client est en C++ et comporte plusieurs pipes nommés et un web service SOAP
Le code suivant est exécuté à chaque requête à la base :
/**
* \brief Fonction personnalisée d'exécution d'une requête en base
* \param req Requête à effectuer
* \return res Retour de la requête
*/
PGresult* l_PQexec(const char* req)
{
try
{
pthread_mutex_lock(&g_mutex_bdd);
PGresult* res = NULL;
PGconn* conn = PQsetdbLogin(ipbdd, portbdd, NULL, NULL, bdd, user, pass);
// Vérification de la connection
for(int i=1; PQstatus(conn) != CONNECTION_OK && i<=10; i++)
{
l_printf("[%s] PQexec : Connection à la base de données pour la requête %s échouée, essai %d\n", horodate().c_str(), req, i);
PQfinish(conn);
usleep(2000000);
conn = PQsetdbLogin(ipbdd, portbdd, NULL, NULL, bdd, user, pass);
l_printf("[%s] PQexec : Après la connexion\n Essai d'un PQstatus : ", horodate().c_str());
PQstatus(conn);
}
// Exécution de la requête
if(PQstatus(conn) == CONNECTION_OK)
{
res = PQexec(conn, req);
}
else
{
l_printf("[%s] PQexec : Abandon de l'exécution de la requête %s\n", horodate().c_str(), req);
res = NULL;
}
if(conn != NULL)
PQfinish(conn);
pthread_mutex_unlock(&g_mutex_bdd);
return res;
}
catch(...)
{
l_printf("[%s] PQexec : Exception sur la requête %s\n", horodate().c_str(), req);
return NULL;
}
}
J'aimerais savoir si le problème est connu ou si je suis le seul à l'avoir et si vous avez une solution. Merci à vous
Hors ligne
Sigpipe, habituellement, ça veut dire que la socket TCP est morte... Il n'y aurait pas un firewall entre le client et le serveur ?
Dernière modification par Marc Cousin (06/11/2017 16:31:40)
Marc.
Hors ligne
Pardon, j'ai oublié de préciser que l'application C++ et la base de données sont sur la même machine. De plus, le firewall est totalement désactivé
Sigpipe, habituellement, ça veut dire que la socket TCP est morte... Il n'y aurait pas un firewall entre le client et le serveur ?
Hors ligne
Y a-t-il des messages dans les logs de postgres quand cela se produit ?
Julien.
https://rjuju.github.io/
Hors ligne
Merci pour vos réponses
J'ai regardé dans les logs, rien n'est horodaté donc impossible de savoir quand les erreurs sont apparues mais j'ai les lignes suivantes dans le fichier de log :
LOG: could not send data to client: Relais brisé (pipe)
FATAL: connection to client lost
Cette ligne apparaît parfois après une requête HTTP en PL/Python. Ces requêtes HTTP sont faites très régulièrement.
Il y a une erreur PL/Python qui apparaît aussi souvent avant l'erreur ci-dessus
ERROR: requests.exceptions.ConnectionError: HTTPConnectionPool(host='10.192.21.200', port=80): Max retries exceeded with url: /set_521.htm?CHANNEL_NO=1&DO_STATUS_ENABLE=0&Submit=Submit (Caused by NewConnectionError("<requests.packages.urllib3.connection.HTTPConnection object at 0x31e99d0>: Failed to establish a new connection: [Errno 110] Connexion termin\xc3\xa9e par expiration du d\xc3\xa9lai d'attente",))
La ligne suivante apparaît aussi souvent après une requête HTTP avec la première erreur :
LOG: could not send data to client: Connexion ré-initialisée par le correspondant
Il faut noter que le code PL/Python est un trigger en base et c'est le seul trigger de la base
Y a-t-il des messages dans les logs de postgres quand cela se produit ?
Hors ligne
Pages : 1