misc: limit /live calls (#83905) #867
No reviewers
Labels
No Label
No Milestone
No Assignees
3 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: entrouvert/wcs#867
Loading…
Reference in New Issue
No description provided.
Delete Branch "wip/83905-limit-live-calls-on-errors"
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?
@ -501,1 +503,4 @@
$('form[data-live-url]').on('wcs:change', function(ev, data) {
if (live_evaluation_pause_timeout_id) {
return
Si jamais on a une pause en cours, on ne fait rien.
@ -690,0 +703,4 @@
live_evaluation_error_count++
live_evaluation_pause_timeout_id = setTimeout(
() => { live_evaluation_pause_timeout_id = null },
live_evaluation_error_count * 1000
S'il y a une erreur on force une pause, de plus en plus longue.
De manière inattendue mais finalement heureuse (je pense), s'il y a un .abort() d'un appel, parce que nouvel événement, ça va aussi entrer dans la gestion d'erreur, et on va donc gagner un rate-limiting aussi sur ce cas.
Question que je me pose : le « abort() » va arriver aussi dans des moments normaux. Typiquement sur un /live un peu lent, qui prendrait une ou deux secondes à être calculé... c'est un peu lent mais pas bogué. Or si l'usager tape tranquillement, on va avoir pas mal de abort() au fur et à mesure de la saisie... et j'ai l'impression qu'on pourrait se retrouver sur une pause indue... (oui, j'ai un peu de mal à lire ce code)
Pas vraiment une demande de modif du patch, mais un peu plus de demande d'explication, peut-être de commentaires dans le code pour se rappeler la mécanique.
@ -502,2 +507,4 @@
}
if (live_evaluation) {
live_evaluation.abort();
De ce que je comprends de l'explication donnée plus bas sur la section « error: » de l'appel ajax, ce abort() va partir sur cette section (j'ai bien compris ?). Si c'est bien ça je verrais bien un commentaire qui le précise ici, parce que perso ça me parait absolument pas évident (je veux dire, je veux bien croire que ça marche, mais je ne m'y attendais pas).
14d7243b18
toa29e59837b
@ -820,24 +820,24 @@ class FormStatusPage(Directory, FormTemplateMixin):
for field in displayed_fields:
result[field.id] = {'visible': field.is_visible(formdata.data, formdata.formdef)}
modified_field_ids = get_request().form.get('modified_field_id[]') or []
Une approche totalement différente, qui s'éloigne du ticket, on ne prête plus d'attention particulière aux erreurs.
Ici côté serveur on change les choses pour accepter une liste de champs modifiés.
@ -506,4 +504,0 @@
if (data && data.modified_field) {
new_data += '&modified_field_id=' + data.modified_field;
if (data.modified_block) new_data += '&modified_block_id=' + data.modified_block;
if (data.modified_block_row) new_data += '&modified_block_row=' + data.modified_block_row;
Ces paramètres de bloc ne seront pas repris, ils ne sont pas utilisés côté serveur.
@ -510,0 +505,4 @@
var $form = $(this)
if (data.modified_field) {
live_evaluation_params[data.modified_field] = true
}
Lors d'une modification, on alimente la variable live_evaluation_params pour garder trace de ce qui a changé.
@ -510,0 +508,4 @@
}
if (live_evaluation === null) {
// no delay for first call
call_live_url($form)
Si jamais c'est le tout début, on fait l'appel à /live.
@ -510,0 +512,4 @@
} else {
if (live_evaluation && live_evaluation.readyState != 4 /* done */ ) {
// live call being processed, delay this one
timeout = 500
Sinon, s'il y a déjà un appel en cours, on reporte d'une demi-seconde.
@ -510,0 +515,4 @@
timeout = 500
} else {
// always call after mini-delay
timeout = 150
Et s'il n'y a pas d'appel en cours, on reporte quand même, de 150ms.
@ -510,0 +520,4 @@
if (live_evaluation_delay_id) {
clearTimeout(live_evaluation_delay_id)
}
live_evaluation_delay_id = setTimeout(() => { call_live_url($form) }, timeout)
Une fois le timeout expiré (et ceux-ci peuvent se succéder en cas d'appels successifs), on envoie alors vers le serveur.
@ -510,1 +530,4 @@
for (let modified_field_id of Object.keys(live_evaluation_params)) {
new_data += '&modified_field_id[]=' + modified_field_id
}
live_evaluation_params = Object() // reset
Pour l'appel, on alimente des paramètres modified_field_id[], pour que ça soit bien tout le temps traité comme une liste.
nouvelle approche
misc: limit /live calls on errors (#83905)to misc: limit /live calls (#83905)Ça me semble bon
a29e59837b
to94ad344364