diff options
author | Jeff Forcier <jeff@bitprophet.org> | 2014-12-18 13:53:39 -0800 |
---|---|---|
committer | Jeff Forcier <jeff@bitprophet.org> | 2014-12-18 13:53:39 -0800 |
commit | b09d6c0612e8601fb39e4bdb1e6cc45f574ba6f6 (patch) | |
tree | 04d9524670444fe0eaacd26c382598f82d1fb11d | |
parent | 681f32583fe052c0516a2fda67e163169676ad11 (diff) | |
parent | e088252f4d3e3946850787fd854f4a790cb9a8c3 (diff) |
Merge branch '1.14' into 1.15
Conflicts:
sites/www/changelog.rst
-rw-r--r-- | paramiko/proxy.py | 19 | ||||
-rw-r--r-- | sites/www/changelog.rst | 5 |
2 files changed, 17 insertions, 7 deletions
diff --git a/paramiko/proxy.py b/paramiko/proxy.py index 0664ac6e..ca602c4c 100644 --- a/paramiko/proxy.py +++ b/paramiko/proxy.py @@ -24,6 +24,7 @@ import signal from subprocess import Popen, PIPE from select import select import socket +import time from paramiko.ssh_exception import ProxyCommandFailure from paramiko.util import ClosingContextManager @@ -79,20 +80,24 @@ class ProxyCommand(ClosingContextManager): :return: the length of the read content, as an `int` """ try: - start = datetime.now() + start = time.time() while len(self.buffer) < size: + select_timeout = None if self.timeout is not None: - elapsed = (datetime.now() - start).microseconds - timeout = self.timeout * 1000 * 1000 # to microseconds - if elapsed >= timeout: + elapsed = (time.time() - start) + if elapsed >= self.timeout: raise socket.timeout() - r, w, x = select([self.process.stdout], [], [], 0.0) + select_timeout = self.timeout - elapsed + + r, w, x = select( + [self.process.stdout], [], [], select_timeout) if r and r[0] == self.process.stdout: - b = os.read(self.process.stdout.fileno(), 1) + b = os.read( + self.process.stdout.fileno(), size - len(self.buffer)) # Store in class-level buffer for persistence across # timeouts; this makes us act more like a real socket # (where timeouts don't actually drop data.) - self.buffer.append(b) + self.buffer.extend(b) result = ''.join(self.buffer) self.buffer = [] return result diff --git a/sites/www/changelog.rst b/sites/www/changelog.rst index 4e56ad1f..bf76d984 100644 --- a/sites/www/changelog.rst +++ b/sites/www/changelog.rst @@ -2,6 +2,11 @@ Changelog ========= +* :bug:`413` (also :issue:`414`, :issue:`420`, :issue:`454`) Be significantly + smarter about polling & timing behavior when running proxy commands, to avoid + unnecessary (often 100%!) CPU usage. Major thanks to Jason Dunsmore for + report & initial patchset and to Chris Adams & John Morrissey for followup + improvements. * :bug:`455` Tweak packet size handling to conform better to the OpenSSH RFCs; this helps address issues with interactive program cursors. Courtesy of Jeff Quast. |