Je n'ai rien trouvé dans une recherche très rapide dans leur bugzilla par contre. Je sais juste que le projet bacula a été très embêté par un bug de ce type.
De mémoire, ce n'est pas vraiment de la mémoire perdue, mais de l'allocation à la trop grosse louche ou quelque chose du genre.
]]>Sinon, je crois qu'il y a ou a eu des bugs dans la libc de la redhat 5 sur l'allocation de mémoire (au cas où vous seriez dans ce contexte)… je n'ai pas souvenir que ça ait été remonté ou détecté avec Postgres, mais je sais que le projet bacula, qui utilise aussi son propre allocateur de mémoire, a eu des soucis…
Oui, je suis dans ce contexte, malheureusement.
]]>Dans le code de la libpq, c'est très clairement visible que l'appel à PQisBusy exécute la récupération des données si elles sont disponibles. Il est donc obligé d'allouer un buffer pour la recevoir.
Testez la fuite mémoire en appelant PQisBusy en boucle, déjà (en suivant bien la procédure du consume et clear), histoire de vérifier qu'en fonctionnement normal il n'y a pas de souci.
Sinon, je crois qu'il y a ou a eu des bugs dans la libc de la redhat 5 sur l'allocation de mémoire (au cas où vous seriez dans ce contexte)… je n'ai pas souvenir que ça ait été remonté ou détecté avec Postgres, mais je sais que le projet bacula, qui utilise aussi son propre allocateur de mémoire, a eu des soucis…
]]>je penses, effectivement, que le problème vienst de Valgrind.
Je vais essayer d'utiliser un autre logiciel de détéction des fuites mémoires.
Attention aussi à ce que va dire un valgrind ou autre sur ce qui se passe dans la mémoire postgres… il a sa propre gestion de la mémoire, il me semble qu'elle a tendance à donner l'impression à ces outils qu'il y a des fuites.
Ne croyez pas valgrind aveuglément, vérifiez qu'il y a bien une fuite à cet endroit là.
]]>Serait-ce un Bug POSTGRES ?
]]>j'ai des fuites de mémoire dans mon programme à cause nottamment de PQisBusy :
192 bytes in 1 blocks are definitely lost in loss record 25 of 31
==26082== at 0x4A0610C: malloc (vg_replace_malloc.c:195)
==26082== by 0x3C8340E194: PQmakeEmptyPGresult (in /usr/lib64/libpq.so.5.1)
==26082== by 0x3C83415FAC: ??? (in /usr/lib64/libpq.so.5.1)
==26082== by 0x3C8340D5AF: PQisBusy (in /usr/lib64/libpq.so.5.1)
==26082== by 0x401FC1: is_result_ready(pg_conn*) (replic.cpp:767)
==26082== by 0x404B36: build_request_in() (replic.cpp:452)
==26082== by 0x405368: main (replic.cpp:169)
la je vois un PQmakeEmptyPGresult, je ne sais pas d'où il sort, je sais qu'il n'est pas dans mon code.
J'ai pu lire sur le net que quand PQisBusy return false, postgres cree un objet PGresult, c'est lui la que je dois liberer.
Le problème est que je n y accède pas.