diff options
author | David Timber <dxdt@dev.snart.me> | 2022-09-26 17:24:21 +0800 |
---|---|---|
committer | David Timber <dxdt@dev.snart.me> | 2022-09-27 05:26:33 +0800 |
commit | 6789c980678f46a602d9f82bfc0ec2a3d52a645e (patch) | |
tree | be5dbbcd78c5f6b05cfa7ed3c2e10db5d3eefb4f /src/palhm/__init__.py | |
parent | eb485502b7941b486358c3cdabefdaefeff7843e (diff) |
Fix bugs - AWS S3 backend large files
- Added 'alloc-size' for aws large file upload and localfs preallocation
- Added 'block-size' for localfs(implemented)
- Updated docs
- Fix bug in localfs str() op
Diffstat (limited to 'src/palhm/__init__.py')
-rw-r--r-- | src/palhm/__init__.py | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/palhm/__init__.py b/src/palhm/__init__.py index 091d072..75b1b21 100644 --- a/src/palhm/__init__.py +++ b/src/palhm/__init__.py @@ -18,6 +18,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import platform +import resource import sys import time @@ -381,7 +382,7 @@ class BackupBackend (ABC): def close (self, ctx: GlobalContext): ... @abstractmethod - def sink (self, ctx: GlobalContext, path: str) -> Exec: + def sink (self, ctx: GlobalContext, bo) -> Exec: ... @abstractmethod def rotate (self, ctx: GlobalContext): @@ -478,10 +479,17 @@ class NullBackupBackend (BackupBackend): class LocalfsBackupBackend (BackupBackend): def __init__ (self, param: dict): + def _getpagesize () -> int: + try: + return resource.getpagesize() + except: + return 4096 + self.backup_root = param["root"] self.mkprefix = BackupBackend.mkprefix_iso8601 self.nb_copy_limit = Decimal(param.get("nb-copy-limit", "Infinity")) self.root_size_limit = Decimal(param.get("root-size-limit", "Infinity")) + self.block_size = param.get("block-size", _getpagesize()) self.dmode = int(param.get("dmode", "750"), 8) self.fmode = int(param.get("fmode", "640"), 8) self.cur_backup_path = None @@ -499,13 +507,17 @@ class LocalfsBackupBackend (BackupBackend): def close (self, ctx: GlobalContext): pass - def sink (self, ctx: GlobalContext, path: str) -> Exec: - path = os.sep.join([ self.cur_backup_path, path ]) + def sink (self, ctx: GlobalContext, bo) -> Exec: + path = os.sep.join([ self.cur_backup_path, bo.path ]) os.makedirs(os.path.dirname(path), self.dmode, True) self.sink_list.append(path) + if bo.alloc_size is not None: + try: os.truncate(bo.path, bo.alloc_size) + except: pass + e = Exec() - e.argv = [ "/bin/cp", "/dev/stdin", path ] + e.argv = [ "/bin/dd", "bs=" + str(self.block_size), "of=" + path ] return e @@ -549,7 +561,7 @@ class LocalfsBackupBackend (BackupBackend): root_size_limit: {root_size_limit} dmode: {dmode:o} fmode: {fmode:o}'''.format( - root = self.root, + root = self.backup_root, nb_copy_limit = self.nb_copy_limit, root_size_limit = self.root_size_limit, dmode = self.dmode, @@ -724,6 +736,7 @@ class BackupObject (Runnable): self.pipeline = [] self.path = jobj["path"] self.bbctx = None + self.alloc_size = jobj.get("alloc-size", None) for e in jobj["pipeline"]: ny_exec = Exec.from_conf(ctx, e) @@ -743,7 +756,7 @@ class BackupObject (Runnable): pmap[eh] = p last_stdio = p.stdout - sink_exec = self.bbctx.sink(ctx, self.path) + sink_exec = self.bbctx.sink(ctx, self) sink_p = subprocess.Popen( args = sink_exec.argv, stdin = last_stdio, |