Partage
  • Partager sur Facebook
  • Partager sur Twitter

FTP.storlines semble bloquant

    8 décembre 2010 à 16:32:30

    Bonjour ,

    j'ai un problème concernant FTP.storlines , en effet , j'ai développé un petit bout de code qui rapatrie ( via FTP ) des fichiers déposés par des clients ( de 0 à 300Mo )

    Une fois le transfert terminé , une notification est envoyé par mail pour avertir de l'arrivé des nouveaux fichiers .

    les états sont gérés par mysql ( MySQLdb )

    Tout fonctionne correctement sauf lorsque le fichier est d'une taille > 200Mo .

    Dans ce cas , le fichier est transféré en totalité mais mon script de me donne aucune notification , comme si FTP.storlines gardai la main sans jamais la rendre .

    Voici un bout de mon code .. qui selon moi pose probléme .

    Merci d'avance pour votre aide

    ...
    #action du thread ( start )
        def run(self):
     
            #Signale que l'on met en file le fichier
            self.logger.info("%s -- INFO -- Attente du thread -- %s"% (strftime('%c',gmtime()), self.file[1]) )
            
            #aquisition d'un jeton ( semaphore ) ou attente d'une libération
            self.sem.acquire()
     
            #Changement d'état en base => 2 upload en cours
            self.sql.execute("UPDATE "+str(self.conf.get("DDB","TBL_ETAT"))+" SET "+str(self.conf.get("DDB","CHAMP_ETAT"))+" = 2 WHERE "+str(self.conf.get("DDB","CHAMP_ID"))+" = "+str(self.file[0]))
     
            try:
                #jeton acquis , signalement du lancement de l'upload du fichier
                self.logger.info("%s -- INFO -- Execution du thread -- %s"% (strftime('%c',gmtime()), self.file[1]) )
     
                #envoie du fichier au module FTP
                cret = self._send_file()
                
                #test du code retour 0 = OK
                if(cret != 1):
                    
                    #Changement d'état en base => 3 upload terminé si tout est ok
                    self.sql.execute("UPDATE "+str(self.conf.get("DDB","TBL_ETAT"))+" SET "+str(self.conf.get("DDB","CHAMP_ETAT"))+" = 3 WHERE "+str(self.conf.get("DDB","CHAMP_ID"))+" = "+str(self.file[0]))
     
                    #notification 
                    self.notify_by_mail('data_newfilenotify')
                    self.logger.info("%s -- INFO -- Notify new file -- %s"% (strftime('%c',gmtime()), self.file[1]) )
     
                else:
                    #remet l'etat du fichier à 0 pour reesayer
                    self.sql.execute("UPDATE "+str(self.conf.get("DDB","TBL_ETAT"))+" SET "+str(self.conf.get("DDB","CHAMP_ETAT"))+" = 0 WHERE "+str(self.conf.get("DDB","CHAMP_ID"))+" = "+str(self.file[0]))
     
                    #notification 
                    self.notify_by_mail('data_retryfilenotify')
                    self.logger.info("%s -- ERR -- Notify retry file -- %s"% (strftime('%c',gmtime()), self.file[1]) )
     
            finally:
                #signalement de la fin de l'upload donc du thread
                self.logger.info("%s -- INFO -- Fin du thread -- %s"% (strftime('%c',gmtime()), self.file[1]) )
     
                #libération du jeton pour laisser la place à un autre
                self.sem.release()
     
     
     
        #Méthode _send_file gére les transactions avec le serveur FTP 
        def _send_file(self):
     
            try:
                #ouverture du fichier data
                f = open(self.file[3]+self.file[1],'rb')
                
            except IOError:
                #erreur à l'ouverture du fichier
                self.logger.info('%s -- ERR -- sendFile error opening [%s] -- etat devient 404' % (strftime('%c',gmtime()), self.file[1]) )
     
                #Changement d'état en base => 404 Fichier introuvable
                self.sql.execute("UPDATE "+str(self.conf.get("DDB","TBL_ETAT"))+" SET "+str(self.conf.get("DDB","CHAMP_ETAT"))+" = 404 WHERE "+str(self.conf.get("DDB","CHAMP_ID"))+" = "+str(self.file[0]))
     
                #notification erreur
                self.notify_by_mail('data_emergencynotify')
                self.logger.info("%s -- INFO -- Notify error -- %s"% (strftime('%c',gmtime()), self.file[1]) )
     
                #quit la fonction
                return 1
     
     
            try:
                #connection au serveur FTP
                ftp =   FTP( self.conf.get("FTP", "HOST") )
                #Login avec user <-> password
                ftp.login( self.conf.get("FTP", "USER"), self.conf.get("FTP", "PASSWORD"))
                
                try:
                    #creation du repertoire destination
                    self.logger.info("%s -- INFO -- Creation repertoire -- %s"% (strftime('%c',gmtime()), self.file[4]) )
                    ftp.mkd(self.file[4])
     
                except error_perm, resp:
     
                    #si le repertoire existe déjà .. on signale et on passe
                    self.logger.info("%s -- WARN -- Repertoire deja existant -- %s"% (strftime('%c',gmtime()), self.file[1]) )
     
                finally:
     
                    #on se déplace dans le repertoire finale
                    ftp.cwd(self.file[4])
     
                    #info du lancement d'upload du fichier
                    self.logger.info("%s -- INFO -- Depot du fichier -- %s"% (strftime('%c',gmtime()), self.file[1]) )
                    
                    try:
     
                        #Lancement de l'upload proprement dit#
                        ftp.storbinary('STOR %s' %self.file[1], f)
     
                    except all_errors, resp:
     
                        #remet l'etat du fichier à 0 pour reesayer
                        self.sql.execute("UPDATE "+str(self.conf.get("DDB","TBL_ETAT"))+" SET "+str(self.conf.get("DDB","CHAMP_ETAT"))+" = 0 WHERE "+str(self.conf.get("DDB","CHAMP_ID"))+" = "+str(self.file[0]))
     
                        self.logger.info("%s -- ERR -- %s etat devient 0 Erreur transfert du fichier -- %s"% (strftime('%c',gmtime()), resp, self.file[1]) )
                        #Retour erreur
                        return 1
     
                #code retour
                return 0
            
            except error_perm, resp:
     
                #Changement d'état en base => 500 Probleme de connection ou d'ecriture
                self.sql.execute("UPDATE "+str(self.conf.get("DDB","TBL_ETAT"))+" SET "+str(self.conf.get("DDB","CHAMP_ETAT"))+" = 500 WHERE "+str(self.conf.get("DDB","CHAMP_ID"))+" = "+str(self.file[0]))
     
                self.logger.info("%s -- ERR -- %s etat devient 500 -- %s"% (strftime('%c',gmtime()), resp, self.file[1]) )
     
                #notification erreur
                self.logger.info("%s -- INFO -- Notify error -- %s"% (strftime('%c',gmtime()), self.file[1]) )
                self.notify_by_mail('data_emergencynotify')
     
                return 1
     
            except all_errors, resp:
     
                #Changement d'état en base => 500 Probleme de connection ou d'ecriture
                self.sql.execute("UPDATE "+str(self.conf.get("DDB","TBL_ETAT"))+" SET "+str(self.conf.get("DDB","CHAMP_ETAT"))+" = 500 WHERE "+str(self.conf.get("DDB","CHAMP_ID"))+" = "+str(self.file[0]))
     
                self.logger.info("%s -- ERR -- %s etat devient 500 -- %s"% (strftime('%c',gmtime()), resp, self.file[1]) )
     
                #notification erreur
                self.logger.info("%s -- INFO -- Notify error -- %s"% (strftime('%c',gmtime()), self.file[1]) )
                self.notify_by_mail('data_emergencynotify')
                
                return 1
            
            finally:
     
                #fermeture du fichier
                self.logger.info("%s -- INFO -- Fermeture du fichier -- %s"% (strftime('%c',gmtime()), self.file[1]) )
                f.close()
                #cloture de la connection FTP
                self.logger.info("%s -- INFO -- Deconnection du FTP -- %s"% (strftime('%c',gmtime()), self.file[1]) )
                ftp.quit()
    ...
    
    • Partager sur Facebook
    • Partager sur Twitter
      11 décembre 2010 à 10:42:51

      Salut.

      Je ne suis pas rentré dans ton code en détail, mais si tu as un problème au-delà d'une certaine taille de fichier, je pense qu'un moyen simple de l'expliquer serait que ta connexion à la BDD timeoute parce que le fichier met "trop" longtemps à être transféré depuis le FTP…

      Peut-être qu'en te déconnectant de la BDD avant de commencer le transfert, et en te reconnectant à la fin, le problème ne se posera plus ?

      Edit: Par contre, rien à voir, mais l'envoi des messages de log est très redondant dans ton code, ce qui, couplé avec les trop nombreux commentaires et les sauts de ligne inutiles, rend ton code plus difficile à suivre... Je pense que tu pourrais rendre le tout beaucoup plus léger et lisible en créant des méthodes "logerror, logwarning, loginfo" dans ta classe logger histoire de factoriser ça.
      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !

      FTP.storlines semble bloquant

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown