J'ai une fonction qui a été écrite dans la langue SQL (pas PLPGSQL) qui doit être appelée nocturne de PGAgent. C'était bien courir jusqu'à la nuit dernière. La fonction prend généralement moins de 3 minutes pour exécuter, mais quand je suis arrivé ce matin, il était toujours en cours de 5 heures plus tard.
J'ai interrogé pg_stat_activity et voir que l'appel est suspendu à un wait_event: extension, wait_event_type: extension. J'ai essayé de rechercher cette question et les seules informations que j'ai trouvées sont que la requête attend sur une extension des postgres. Les seules extensions que j'ai actuellement installées sont PLPGSQL, Postgres_FDW, Tablefunc, Adminpack et PGAgent. Les seules extensions qui semblent probablement sont pgagentes - qui appelle la fonction au bon moment, postgres_fdw - Les tables étrangères sont utilisées dans la fonction, mais interroger les tables étrangères en dehors de la fonction semblent fonctionner correctement.
Comment puis-je trouver quelle extension cause-t-elle l'attente et quelles sont les prochaines étapes pour résoudre ce problème? Il y a beaucoup d'informations sur la résolution des verrous, mais je n'ai pas pu trouver quoi que ce soit sur l'extension Wait_Event autre qu'une brève description.
J'ai découvert que le wait_event_type: l'extension faisait référence à celle-ci se bloquée dans une requête transmise à l'emballage de données étrangères. Cependant, le problème ne semble pas être le postgreal_fdw, mais plutôt l'utilisation de la langue SQL pour écrire ma fonction et ne pas utiliser la langue PLPGSQL. J'ai rappelé un post, soit ici, sur Stackoverflow, soit un autre forum qui a mentionné un bogue dans la langue de procédure SQL à Postgres qui verrouillaient de manière inattendue les requêtes de manière intermittente. J'ai réécrit la fonction dans PLPGSQL, qui était très simple, et cela fonctionne parfaitement pendant plus de 3 mois maintenant. J'aimerais pouvoir trouver le fil qui a mentionné le bogue, mais ils avaient dit qu'il avait été signalé à Postgres, et la probabilité d'entre eux la fixant était mince. Utilisez simplement la langue PLPGSQL pour vos fonctions et restez à l'écart de la langue SQL.