Today I've spent several hours to find why python program is hangs sometimes.
Using gdb I've found that sometimes ftplib's storbinary hangs at the end of file transfer.
gdb has shown that it hangs at:
... in __libc_recv (fd=?, buf=?, n=8192, flags=-1) at ../sysdeps/unix/sysv/linux/x86_64/recv.c:33
I've added callback argument to storbinary to print last data block (by default blocksize is 8192):
I also found that EOFError happens after creating some number of ftp sessions (sockets). In my case after creating >46 (or 47) simultaneous ftp connection.
Solution was simple - to add timeout argument on ftp creation.
Using gdb I've found that sometimes ftplib's storbinary hangs at the end of file transfer.
gdb has shown that it hangs at:
... in __libc_recv (fd=?, buf=?, n=8192, flags=-1) at ../sysdeps/unix/sysv/linux/x86_64/recv.c:33
def print_last(data): if data < 8192: print len(data) ftp.storbinary('STOR %s' % fn, f, callback=print_last)And after that I've found that program hangs at the end of file transfer.
I also found that EOFError happens after creating some number of ftp sessions (sockets). In my case after creating >46 (or 47) simultaneous ftp connection.
Solution was simple - to add timeout argument on ftp creation.
ftp = ftplib.FTP(self.host, self.username, self.password, timeout=10)