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:
parent
77110913c7
commit
2df8b740dd
1 changed files with 7 additions and 4 deletions
|
@ -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):
|
||||||
|
|
Loading…
Reference in a new issue