global actions timeout: use SQL for finalized triggers (#85622) #1022
Loading…
Reference in New Issue
No description provided.
Delete Branch "wip/85622-optimize-action-global-timeout"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
J'ai l'impression qu'il manque du fonctionnement le fait que les déclencheurs se déclenchent une seule fois :
@ -435,0 +446,4 @@
statuses = 'c%s' % id(self.value)
formdef_table = self.formdef._table_name
formdef_evolution_table = self.formdef._table_name + '_evolutions'
return f'''EXISTS(
Du ticket :
Je ne capte pas ce qui est entendu par "première transition dans l'état donné", j'aurais imaginé que c'était le cas
trigger.anchor == '1st-arrival'
mais comme seule le cas "finalized" est traité, je suis perdu.Je me suis embrouillé pardon, pour finalized le code regarde la dernière transition dans l'état donné. Je me rends compte que j'ai perdu une subtilité, mais je m'interroge sur son intérêt pour un état final. Si on a une transition vers un état final, puis vers un autre état, puis à nouveau vers l'état final, c'est la date de la première transition qui sera prise en compte. Est-ce-que j'altère le SQL pour prendre ce critère en compte ?
Précision : prendre ce critère en compte veut juste dire "réduire le risque de faux positifs" dans la requête SQL. Le code qui choisit et valide la date à prendre est toujours présent, ce qui fait que si le SQL renvoit plus d'objets qu'il n'en faut, ce n'est pas un problème.
Oui il me semble important que ça se déclenche sur la même situation qu'avant.
Ha mais ça ne change pas du tout le déclenchement. Là on ne fait que filtrer ce sur quoi on va travailler, le code qui vérifie le déclenchement reste en place bien entendu.
Sur toulouse je mesure moins de 3% des formdata qui sont passés deux fois par un état final, donc je considère que c'est suffisamment peu fréquent pour qu'on ne complique pas considérablement le code pour optimiser ça (en tout cas pour le moment).
En effet, je l'ai perdu en réécrivant la boucle. J'ai envoyé un commit qui reprend ça.
418b751997
tob08f6dd5bb
Il me semble que non, il s'agit de ne pas, pour un formdata, jouer plusieurs fois un déclencheur; dans la boucle d'origine on fait tourner ça par formdata :
vs dans ton ajout, où ça passe en haut de la boucle,
et ça n'aura pas d'incidence sur les formdata, et l'exécution multiple pourra y avoir lieu.
A priori cette modification aux tests permet de détecter la situation :
J'ai ajouté un commit avec ce code.
Merci, je comprends mieux l'idée. J'ai corrigé en ce sens normalement.
a594b576b1
tobf7071f416
Ok ça tourne mais je ne le sens pas encore (désolé pour la subjectivité), et j'aurais dû commencer par là, je manque d'éléments d'analyse, tu pourrais remonter et partager davantage de celle-ci, type pointer une démarche précise, l'action de workflow concernée, etc. ?
Particulièrement, de la description initiale "consommation massive de bande passante" je serais curieux de voir si celle-ci vient du nombre de lignes d'évolution ou de la présence de gros "parts" dedans.
(édit : j'entends que le ticket a été écrit vaguement parce que public, ces précisions peuvent bien sûr aller dans un commentaire privé)
Fait sur une note privée.
Ok merci.
@ -435,0 +435,4 @@
class SpecialTimeoutCriteria(Criteria):
def __init__(self, formdef, statuses, duration, **kwargs):
Je verrais vien un nom plus précis, peut-être "GlobalTimeoutOnFinalizedCriteria" ?
Comme ce n'est pas spécifique aux GlobalTimeout, j'ai préféré StatusReachedTimeoutCriteria, ça te va ?
@ -435,0 +446,4 @@
statuses = 'c%s' % id(self.value)
formdef_table = self.formdef._table_name
formdef_evolution_table = self.formdef._table_name + '_evolutions'
return f'''EXISTS(
J'aimerais bien ici un commentaire explicatif.
?
fait.
@ -435,0 +450,4 @@
SELECT 1 FROM {formdef_evolution_table}
WHERE {formdef_evolution_table}.formdata_id = {formdef_table}.id
AND {formdef_evolution_table}.status = ANY(%({statuses})s)
AND {formdef_evolution_table}.time < NOW() - {duration} * interval '1 day')'''
On est sûr du < plutôt que <= ? Comme ça ne doit pas changer des masses dans le résultat, je jouerais prudent et mettrais <=.
fait.
@ -2078,0 +2087,4 @@
# now we need the criteria for our timeout
criterias.append(SpecialTimeoutCriteria(data_class, endpoint_status_ids, trigger.timeout))
# and we can execute on what remains.
for formdata in data_class.select_iterator(clause=criterias, itersize=200):
Je serais assez pour ne pas dupliquer cette partie, j'envoie un commit supplémentaire dans la branche pour illustrer ça.
60f2e07189
b757531caf
to3d4c533df9
3d4c533df9
tob4274b60ed
Attention ta série de commits est sur ton adresse privée; tu pourrais ajuster ça en squashant le tout ?
997dbffd79
to6cb2f0afef
C'est fait, merci, j'avais pas fait gaffe que mon clone était mal configuré sur mon PC fixe.