1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2025-02-22 06:01:54 +00:00

RemoteRepository: Fix busy wait in call_many, fixes #940

(cherry picked from commit 731f6241fa)
This commit is contained in:
Andrew Skalski 2016-05-25 18:14:27 -04:00 committed by Julian Andres Klode
parent 77110913c7
commit 2df8b740dd

View file

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