[paramiko] paramiko stops responding after huge data is transferred !

Dwayne Litzenberger dwayne at oscl.ca
Mon Apr 14 17:02:25 PDT 2008


It's a threading issue.

I managed to catch two threads trying to acquire a Channel.lock at the same time.

It looks like Channel._window_adjust (or other like functions) are sometimes 
being called by threads that do not hold the Channel.lock.

Here are the tracebacks of the two threads on the server (ignore the lockwrapper.py stuff):

==================================
id=-1214578356,thread=MySenderThread,name=channel.py:687: ACQUIRED
  File "/usr/lib/python2.4/threading.py", line 442, in __bootstrap
    self.run()
  File "/usr/lib/python2.4/threading.py", line 422, in run
    self.__target(*self.__args, **self.__kwargs)
  File "./test-server.py", line 39, in _run
    wfile.write(a.encrypt("X" * 1024))
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/file.py", line 330, in write
    self.flush()
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/file.py", line 91, in flush
    self._write_all(self._wbuffer.getvalue())
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/file.py", line 435, in _write_all
    count = self._write(data)
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/channel.py", line 1211, in _write
    self.channel.sendall(data)
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/channel.py", line 760, in sendall
    sent = self.send(s)
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/channel.py", line 687, in send
    self.lock.acquire()
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/lockwrapper.py", line 43, in acquire
    self._log("ACQUIRED")
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/lockwrapper.py", line 23, in _log
    rawdata += "".join(traceback.format_stack())

==================================
id=-1214578356,thread=Transport,name=channel.py:955: ACQUIRING
  File "/usr/lib/python2.4/threading.py", line 442, in __bootstrap
    self.run()
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/transport.py", line 1528, in run
    self._channel_handler_table[ptype](chan, m)
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/channel.py", line 955, in _window_adjust
    self.lock.acquire()
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/lockwrapper.py", line 41, in acquire
    self._log("ACQUIRING")
  File "/home/dwon/rsync-link-backup/paramiko-deadlock-bug/paramiko/lockwrapper.py", line 23, in _log
    rawdata += "".join(traceback.format_stack())

-- 
Dwayne Litzenberger, B.A.Sc.
Information Technology Analyst

Open Systems Canada Limited
#210 - 2332 11th Ave
Regina, SK S4P0K1
Office: (306) 359-OSCL (6725)
http://www.oscl.ca/



More information about the paramiko mailing list