PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Général » Connexion au serveur sensible à la charge » 07/11/2017 13:11:00

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


rjuju a écrit :

Y a-t-il des messages dans les logs de postgres quand cela se produit ?

#2 Re : Général » Connexion au serveur sensible à la charge » 06/11/2017 16:33:57

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é

Marc Cousin a écrit :

Sigpipe, habituellement, ça veut dire que la socket TCP est morte... Il n'y aurait pas un firewall entre le client et le serveur ?

#3 Général » Connexion au serveur sensible à la charge » 06/11/2017 12:44:53

adrien.d
Réponses : 4

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

Pied de page des forums

Propulsé par FluxBB