diff --git a/borg/remote.py b/borg/remote.py index e04802314..00c3114a4 100644 --- a/borg/remote.py +++ b/borg/remote.py @@ -20,6 +20,8 @@ BUFSIZE = 10 * 1024 * 1024 +MAX_INFLIGHT = 100 + class ConnectionClosed(Error): """Connection closed by remote host""" @@ -316,7 +318,6 @@ def handle_error(error, res): calls = list(calls) waiting_for = [] - w_fds = [self.stdin_fd] while wait or calls: while waiting_for: try: @@ -330,6 +331,10 @@ def handle_error(error, res): return except KeyError: break + if self.to_send or ((calls or self.preload_ids) and len(waiting_for) < MAX_INFLIGHT): + w_fds = [self.stdin_fd] + else: + w_fds = [] r, w, x = select.select(self.r_fds, w_fds, self.x_fds, 1) if x: raise Exception('FD exception occurred') @@ -362,7 +367,7 @@ def handle_error(error, res): else: sys.stderr.write("Remote: " + line) if w: - while not self.to_send and (calls or self.preload_ids) and len(waiting_for) < 100: + while not self.to_send and (calls or self.preload_ids) and len(waiting_for) < MAX_INFLIGHT: if calls: if is_preloaded: if calls[0] in self.cache: @@ -389,8 +394,6 @@ def handle_error(error, res): # that the fd should be writable if e.errno != errno.EAGAIN: raise - if not self.to_send and not (calls or self.preload_ids): - w_fds = [] self.ignore_responses |= set(waiting_for) def check(self, repair=False, save_space=False):