Erreur 502 Copier un objet

Bonjour,

lors l’utilisation de la fonction Copier d’un projet, une erreur Http 502 apparait pour 3 objets liés à l’objet copiés

je n’ai pas ce problème lors de la création d’un projet

Les codes HTTP 502 sont des codes remontés par les reverse proxies.

502 signifie “bad gateway” = le reverse proxy n’arrive pas à joindre le serveur. Ou en tout cas pas dans le timeout imparti. Peut être coupe-t-il aussi le flux en fonction du contenu retourné, ou d’autres règles de filtrage/rewrite définies à son niveau, etc.

En tout cas il n’y a aucun endroit dans le code Simplicité où on retourne ce code 502 (on ne retourne que des 200, 400, 401, 403, 404 et 500).

Quelle est le contenu de la réponse et les autres headers HTTP associés à ces 502 ? Sur vos copies d’écran on ne voit pas…

URL de la requête : http://karta.dev-sim.cr-bretagne.fr/karta/ui/json/obj?action=search&object=CrbKartaProjetBudDep&inst=panel_ajax_CrbKartaProjetBudDep_kartaProjetBudDepProjetFK&context=19&page=0&inline_documents=infos&inline_thumbnails=true&inline_objects=true&_md=true&_visible=true&_totals=true&parent=CrbKartaProjet&parent_inst=the_ajax_CrbKartaProjet&parent_field=kartaProjetBudDepProjetFK&_=a069f3c9496feed069f51158423237d1ece77297_20200528150731

OK pour les headers HTTP mais quid du contenu de la réponse ? A mon avis l’info est à ce niveau car ce call Ajax ne devrait pas répondre du HTML mais du JSON donc la page HTML retournée doit forcément dire quelque chose d’intéressant.

Ok donc c’est bien une réponse qui vient d’un reverse proxy nginx en amont de Simplicité.

Il faudrait aller voir les logs de ce nginx pour voir s’il y a plus d’info mais ça sent le nginx qui coupe le flux à partir d’une certaine taille de réponse,ou d’un timeout, ou dans le genre.

dans les logs nginx:

2020/05/28 16:35:30 [warn] 20758#20758: *48385 upstream server temporarily disabled while reading response header from upstream, client: 172.16.23.196, server: karta.dev-sim.cr-bretagne.fr, request: “POST /karta/ui/json/obj?action=search&object=CrbKartaProjetBudDep&inst=panel_ajax_CrbKartaProjetBudDep_kartaProjetBudDepProjetFK&context=19&page=0&inline_documents=infos&inline_thumbnails=true&inline_objects=true&_md=true&_visible=true&totals=true&parent=CrbKartaProjet&parent_inst=the_ajax_CrbKartaProjet&parent_field=kartaProjetBudDepProjetFK&=a069f3c9496feed069f51158423237d1ece77297_20200528150731 HTTP/1.1”, upstream: “http://127.0.0.1:10518/karta/ui/json/obj?action=search&object=CrbKartaProjetBudDep&inst=panel_ajax_CrbKartaProjetBudDep_kartaProjetBudDepProjetFK&context=19&page=0&inline_documents=infos&inline_thumbnails=true&inline_objects=true&_md=true&_visible=true&totals=true&parent=CrbKartaProjet&parent_inst=the_ajax_CrbKartaProjet&parent_field=kartaProjetBudDepProjetFK&=a069f3c9496feed069f51158423237d1ece77297_20200528150731”, host: “karta.dev-sim.cr-bretagne.fr”, referrer: “http://karta.dev-sim.cr-bretagne.fr/karta/ui

Je pense que ça veut dire que le flux a été coupé par nginx, je ne sais pas à quoi ça peut être dû timeout, limites de tailles de flux, (micro)coupures réseau, un caractère bizarre dans une donnée (genre le pb discuté dans ce post Vues liste et formulaire plantées si un texte en base contient un caractère mal encodé - #14 by Francois), etc.

Quid des logs Tomcat/Simplicité ? Stacktraces ou autres messages d’erreur à ce niveau ?

Dans la première copie d’écran, on voit un flux Ajax/search de 116Mo zippé en 6Mo.
C’est énorme.

Les réponses /search devrait être du JSON, le HTML est un page d’erreur Bas Getway comme le dit @david.

A mon avis il y a des appels /search front qui remontent trop de données / limitation du volume transféré.

Par contre un /setSysParam n’est pas sensé être volumineux, qu’est-ce qui est envoyé au serveur ?

le search de 116mo est sur l’objet CrbKartaProjetPartenaireEd.
ce que je ne comprends pas puisque je fait une copie de CrbKartaProjet, que CrbKartaProjetPartenaireEd est un objet lié qui sera rempli après par l’utilisateur. Il n’y a pas de référence dans cet objet donc le search ne sert non seulement à rien lors d’une copie mais en plus il ne doit rien ramener.

Pour comparer, j’ai regardé les temps de réponse lors de l’a consultation et lors de la création d’un projet :
consultation d’un projet :


création d’un projet :

Le search de l’objet lié doit se faire après la save/create de la copie.
Il n’y a pas de raison de le faire avant, quand on fait une copie cela fait juste un Get sur l’objet copié + métadata des objets, aucun search UI.

Et on dirait qu’il a copié beaucoup trop de CrbKartaProjetPartenaireEd et pas uniquement les liens de l’objet copié.

  • Quelle est la nature du lien entre ces 2 objets ?
  • La FK est-elle identifiante ? si non il ne faut pas de “copy cascade” sur le lien
  • si oui, il faut vérifier en base le nombre de relations créées par la copy cascade sur ce lien.

Si physiquement la copy est bonne en base, c’est la jointure du search de l’onglet qui est mauvaise (l’onglet ramène tous les CrbKartaProjetPartenaireEd pour 100Mo, et pas ceux du projet) : il faut débugger le SQL pour regarder la jointure de ce search.

  • Est-ce un lien virtuel ? search-spec ?
  • présence de code dans le initList / preSearch… dans CrbKartaProjetPartenaireEd ?
  • code conditionnel avec isNew ou isCopied ?

Je me rappelle vaguement qu’il y avait un provisonning de lignes vierges pour éviter de créer manuellement N lignes en liste, et permettre de saisir 10 lignes en edit-list ensuite ? ça rentre peut être en conflit avec la copy.

c’est un lien 0,n avec suppression en cascade mais pas de copie en cascade.
la fk fait partie de la clé fonctionnelle.

l’erreur 502 apparait après l’action de copier, rien n’a encore eu lieu en base.
j’ai activé les traces SQL. une requête est envoyée à tous les objets liés du projet et comme le projet n’est pas encore créé, le requête fait un select sur tout.

Quand on fait un copie, c’est comme une création et ça ne fait pas de search des relations. On doit être dans un cas particulier, ou l’action pense ouvrir un objet existant avec un row_id différent de “0”.

Ce ne serait pas lié au getTargetObject qui ne renvoit pas “0” mais le row_id du projet à copier ?

je fais la copie à partir de l’objet CrbKartaProjet et pas de l’objet Liste.
je n’ai pas de script pour le hook getTargetObject dans CrbKartaProjet

je vais tester sans getTargetObject

mon test :
j’ai autorisé la copie à partir de mon objet CrbKartaProjetListe
j’ai enlevé le getTargetObject
la copie fonctionne.
aucun search exécuté

il y a donc effectivement un bug avec la copie quand on le fait à partir d’un objet affiché avec un getTargetObject

On ne peut rien faire.
Le getTargetObjet est du code spécifique, donc il faut voir comment il est codé, et comment vos objets sont paramétrés/codés au niveau héritage.

Si l’objet “CrbKartaProjetListe” hérite dans l’objet “CrbKartaProjet” au niveau paramétrage (extends Java ou héritage Rhino), le hook getTargetObjet s’exécutera aussi dans le formulaire par héritage.

Il faut donc mettre un if (getName().equals(“CrbKartaProjetListe”) quelque part pour que le code ne s’exécute pas dans le fils, ou que le fils n’en tienne pas compte.

Sinon s’il faut toujours rediriger vers CrbKartaProjet, le code devrait être juste qq chose comme :

@Override
public String[] getTargetObject(String rowId, String[] row) {
	if (isNew() || isCopied()) rowId = "0";
	return new String[] { "CrbKartaProjet", "the_ajax_CrbKartaProjet", rowId };
}

CrbKartaProjetListe n’hérite pas de CrbKartaProjet.

j’ai codé le getTargetObject comme indiqué et j’ai toujours l’erreur 502

Le 502 doit être lié à une limitation du proxy sur la taille ou la durée de la requête longue. Il faut corriger le fait que la copy doit ramener un objet en création, et pas toute la base (à priori les search des panels sans jointure).

S’il n’y a pas de lien entre les 2 (hormis le getTargetObject sur l’objet Liste), le liste n’a donc aucune influence si vous faites la copy depuis le formulaire CrbKartaProjet qui n’hérite de rien.

Est ce que la copie fonctionnait sans l’objet Liste ?

Y a-t-il du code qui fait des choses dans les instances panel (les objets liés) ?

Code de CrbKartaProjet ?

initCreate
initUpdate
initCopy
preSearch

Quel est le code du getTargetObject ?

Je viens de tester, la copie sans l’objet liste. je rencontre le même problème.
je supprime tous les script de l’objet, les search sur les objets liés ne sont pas exécuté. il y a donc un hook qui pose pb.

le code qui alimente les objets liés est exécuté dans le postCreate.
rien n’est fait dans l’initCopy

quels sont les hook utilisés lors d’une copie ?