Tâche #11500
Scénario #11288: Résoudre les problèmes d'instabilité constatés sur Zéphir 2.3.16
Limiter les risques de timeout des appels faits par les clients à la synchronisation
Description
Des logs de ce type peuvent apparaître dans le backend Zéphir :
May 5 18:34:45 zephir zephir_backend: [-] Unhandled error in Deferred: May 5 18:34:45 zephir zephir_backend: [-] Unhandled Error May 5 18:34:45 zephir zephir_backend: [-] #011Traceback (most recent call last): May 5 18:34:45 zephir zephir_backend: [-] #011 File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 325, in unpause May 5 18:34:45 zephir zephir_backend: [-] #011 self._runCallbacks() May 5 18:34:45 zephir zephir_backend: [-] #011 File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 371, in _runCallbacks May 5 18:34:45 zephir zephir_backend: [-] #011 self.result = callback(self.result, *args, **kw) May 5 18:34:45 zephir zephir_backend: [-] #011 File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 330, in _continue May 5 18:34:45 zephir zephir_backend: [-] #011 self.unpause() May 5 18:34:45 zephir zephir_backend: [-] #011 File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 325, in unpause May 5 18:34:45 zephir zephir_backend: [-] #011 self._runCallbacks() May 5 18:34:45 zephir zephir_backend: [-] #011--- <exception caught here> --- May 5 18:34:45 zephir zephir_backend: [-] #011 File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 371, in _runCallbacks May 5 18:34:45 zephir zephir_backend: [-] #011 self.result = callback(self.result, *args, **kw) May 5 18:34:45 zephir zephir_backend: [-] #011 File "/usr/lib/python2.6/dist-packages/twisted/web/xmlrpc.py", line 148, in _cbRender May 5 18:34:45 zephir zephir_backend: [-] #011 request.finish() May 5 18:34:45 zephir zephir_backend: [-] #011 File "/usr/lib/python2.6/dist-packages/twisted/web/http.py", line 900, in finish May 5 18:34:45 zephir zephir_backend: [-] #011 "Request.finish called on a request after its connection was lost; " May 5 18:34:45 zephir zephir_backend: [-] #011exceptions.RuntimeError: Request.finish called on a request after its connection was lost; use Request.notifyFinish to keep track of this.
Après étude et utilisation de la fonction notifyFinish sur l'ensemble des requêtes reçues par le backend, le problème semble venir de la fonction maj_site (uucp_rpc.py) appelée par les clients lors de la synchronisation avec Zéphir.
Si la fonction met trop longtemps à répondre, le client abandonne l'appel (timeout xmlrpc), et ce message apparaît lorsque Zéphir termine le traitement des données remontées.
Révisions associées
Réponse plus rapide de la fonction maj_site (synchronisation des clients)
- envoi de la réponse au client dès que le md5 de l'archive est validé
- les traitements des données se font ensuite en mode deferred
ref #11500 @45m
Historique
#1 Mis à jour par Bruno Boiget il y a presque 9 ans
exemple de code pour détecter quelles fonctions se terminent après perte de la connexion client (dans backend/xmlrpceole.py) :
def request_error(err, uri, user, function, args): print "Requête terminée prématurément :" print " * ", uri print " * ", user print " * ", function print " * ", args
modification du début de la fonction render de la classe XMLRPCEole :
def render(self,request): """examine la requête transmise par le client et apelle la procédure correspondante si ses autorisations sont suffisantes""" # test de l'authentification request.content.seek(0, 0) args, functionPath = xmlrpclib.loads(request.content.read()) cred_user = request.getUser() cred_password = request.getPassword() request.notifyFinish().addErrback(request_error, request.uri, cred_user, args, functionPath)
#2 Mis à jour par Bruno Boiget il y a presque 9 ans
- Restant à faire (heures) changé de 2.0 à 0.25
#3 Mis à jour par Bruno Boiget il y a presque 9 ans
- Statut changé de En cours à Résolu
#4 Mis à jour par Joël Cuissinat il y a presque 9 ans
- Statut changé de Résolu à Fermé
- Restant à faire (heures) changé de 0.25 à 0.0