ign-packo / PackO

Outil pour le contrôle et la retouche du mosaïquage d'ortho
Other
6 stars 2 forks source link

protection de l'API pour des commandes concurrentes sur la même branche #418

Open gmaillet opened 3 weeks ago

gmaillet commented 3 weeks ago

Pour l'instant il n'y a aucune protection au niveau de l'API pour empêcher de faire deux patchs en même temps ou de faire un undo pendant qu'on traite un patch. C'était un choix assumé au niveau de conception parce que:

En pratique, même si on n'a qu'un seul utilisateur par branche, il n'est pas si simple de garantir de façon certaine qu'il n'y a pas plusieurs modifications lancées en même temps. Surtout si cela ne concerne pas uniquement des modifications, mais aussi la simple lecture du cache. Des conflits sur une branche pourraient se produire en cas de lecture (des WMTS/GetTile générés par un rafraîchissement ou un déplacement) pendant l'application d'un patch, d'un undo ou redo. La probabilité devant encore plus forte si:

Si on veut utiliser un drapeau ou un verrou pour protéger l'API, la seule façon propre de partager l'information entre toutes les instances, c'est d'utiliser la BD Postgres. On pourrait mettre un verrou sur la table des branches (ou sur la ligne qui correspond à la branche qui nous intéresse), mais il faut faire très attention à l'impact sur les performances. En particulier sur les requêtes WMTS/GetTiles qui sont très nombreuses et concernent souvent la même branche (iTowns ou QGis lançant beaucoup de requêtes en parallèle pour rafraichir la vue).

D'après la doc Postgres (https://www.postgresql.org/docs/current/explicit-locking.html) lorsqu'on veut un verrou pour garantir un comportement côté applicatif (et non pour éviter une modification concurrente de la BD), le mécanisme des "Advisory locks" est plus efficace. Il existe une version au niveau de la transaction qui est automatiquement libérée à la fin de la transaction (ce qui élimine les risques de verrou mortel en cas d'erreur en cours de transaction).

En pratique, on pourrait imaginer un:

En faisant une seule demande de verrou par transaction on est certain de ne jamais avoir des demandes croisées qui s'attendent mutuellement.