mirror of
https://github.com/borgbackup/borg.git
synced 2026-06-12 02:17:54 -04:00
Merge pull request #7452 from snsmac/fix/no_perm_retry
Do not retry on permission errors
This commit is contained in:
commit
c187d7c8e6
2 changed files with 38 additions and 0 deletions
|
|
@ -1,3 +1,4 @@
|
|||
import errno
|
||||
import sys
|
||||
import argparse
|
||||
import logging
|
||||
|
|
@ -370,6 +371,10 @@ class CreateMixIn:
|
|||
self.print_warning("Unknown file type: %s", path)
|
||||
return
|
||||
except (BackupError, BackupOSError) as err:
|
||||
if isinstance(err, BackupOSError):
|
||||
if err.errno in (errno.EPERM, errno.EACCES):
|
||||
# Do not try again, such errors can not be fixed by retrying.
|
||||
raise
|
||||
# sleep a bit, so temporary problems might go away...
|
||||
sleep_s = 1000.0 / 1e6 * 10 ** (retry / 2) # retry 0: 1ms, retry 6: 1s, ...
|
||||
time.sleep(sleep_s)
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ from random import randbytes
|
|||
import shutil
|
||||
import socket
|
||||
import stat
|
||||
import subprocess
|
||||
import time
|
||||
import unittest
|
||||
|
||||
|
|
@ -208,6 +209,7 @@ class ArchiverTestCase(ArchiverTestCaseBase):
|
|||
input=flist.encode(),
|
||||
exit_code=0,
|
||||
)
|
||||
assert "retry: 3 of " in out
|
||||
assert "E input/file2" not in out # we managed to read it in the 3rd retry (after 3 failed reads)
|
||||
# repo looking good overall? checks for rc == 0.
|
||||
self.cmd(f"--repo={self.repository_location}", "check", "--debug")
|
||||
|
|
@ -217,6 +219,37 @@ class ArchiverTestCase(ArchiverTestCaseBase):
|
|||
assert "input/file2" in out
|
||||
assert "input/file3" in out
|
||||
|
||||
def test_create_no_permission_file(self):
|
||||
file_path = os.path.join(self.input_path, "file")
|
||||
self.create_regular_file(file_path + "1", size=1000)
|
||||
self.create_regular_file(file_path + "2", size=1000)
|
||||
self.create_regular_file(file_path + "3", size=1000)
|
||||
# revoke read permissions on file2 for everybody, including us:
|
||||
if is_win32:
|
||||
subprocess.run(["icacls.exe", file_path + "2", "/deny", "everyone:(R)"])
|
||||
else:
|
||||
os.chmod(file_path + "2", 0o000)
|
||||
self.cmd(f"--repo={self.repository_location}", "rcreate", RK_ENCRYPTION)
|
||||
flist = "".join(f"input/file{n}\n" for n in range(1, 4))
|
||||
out = self.cmd(
|
||||
f"--repo={self.repository_location}",
|
||||
"create",
|
||||
"--paths-from-stdin",
|
||||
"--list",
|
||||
"test",
|
||||
input=flist.encode(),
|
||||
exit_code=1, # WARNING status: could not back up file2.
|
||||
)
|
||||
assert "retry: 1 of " not in out # retries were NOT attempted!
|
||||
assert "E input/file2" in out # no permissions!
|
||||
# repo looking good overall? checks for rc == 0.
|
||||
self.cmd(f"--repo={self.repository_location}", "check", "--debug")
|
||||
# check files in created archive
|
||||
out = self.cmd(f"--repo={self.repository_location}", "list", "test")
|
||||
assert "input/file1" in out
|
||||
assert "input/file2" not in out # it skipped file2
|
||||
assert "input/file3" in out
|
||||
|
||||
def test_create_content_from_command(self):
|
||||
self.cmd(f"--repo={self.repository_location}", "rcreate", RK_ENCRYPTION)
|
||||
input_data = "some test content"
|
||||
|
|
|
|||
Loading…
Reference in a new issue