]> git.proxmox.com Git - proxmox-backup.git/log
proxmox-backup.git
3 months agoclient: use proxmox_systemd crate
Thomas Lamprecht [Wed, 7 Aug 2024 18:51:20 +0000 (20:51 +0200)]
client: use proxmox_systemd crate

Some systemd code got split out from proxmox-sys and left there
re-exported with a deprecation marker, use the newer crate, the
workspace already depends on proxmox-systemd anyway.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
3 months agocargo fmt
Thomas Lamprecht [Wed, 7 Aug 2024 18:50:28 +0000 (20:50 +0200)]
cargo fmt

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
3 months agodatastore: data blob encode: simplify code
Dominik Csapak [Mon, 5 Aug 2024 09:24:14 +0000 (11:24 +0200)]
datastore: data blob encode: simplify code

by combining the compression call from both encrypted and unencrypted
paths and deciding on the header magic at one site.

No functional changes intended, besides reusing the same buffer for
compression.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
3 months agodatastore: data blob: increase compression throughput
Dominik Csapak [Mon, 5 Aug 2024 09:24:13 +0000 (11:24 +0200)]
datastore: data blob: increase compression throughput

Increase the zstd compression throughput by not using the
`zstd::stream::copy_encode` method, because it seems it uses an
internal buffer size of 32 KiB [0], copies at least once extra in the
target buffer and might have some additional (allocation and/or
syscall) overhead. Due to the amount of wrappers and indirections it's
a bit hard to tell for sure.  In anyway, there can be a reduced
throughput observed if all, the target and source storage and the
network are so fast that the operations from creating chunks, like
compressions, can become the bottleneck.

Instead use the lower-level `zstd_safe::compress` which avoids (big)
allocations, since we provide the target buffer.

In case of a compression error just return the uncompressed data,
there's nothing we can do and saving uncompressed data is better than
having none. Additionally, log any such error besides the one for the
target buffer being too small.

Some benchmarks on my machine (Intel i7-12700K with DDR5-4800 memory
using a ASUS Prime Z690-A motherboard) from a tmpfs to a datastore on
tmpfs:

Type                without patches (MiB/s)  with patches (MiB/s)
.img file           ~614                     ~767
pxar one big file   ~657                     ~807
pxar small files    ~576                     ~627

The new approach is faster by a factor of 1.19.

Note that the new approach should not have a measurable negative
impact, e.g. (peak) memory usage wise. That is because we always
reserved a vector with max-data-size (data length + header length) and
thus did not have to add a new buffer, rather we actually removed the
buffer that the high-level zstd wrapper crate used internally.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
3 months agodatastore: data blob: allow checking for zstd internal buffer-to-small error
Dominik Csapak [Mon, 5 Aug 2024 09:24:12 +0000 (11:24 +0200)]
datastore: data blob: allow checking for zstd internal buffer-to-small error

We want to check the error code of zstd not to be 'Destination buffer
to small' (dstSize_tooSmall),  but currently there is no practical API
that is also public. So we introduce a helper that uses the internal
logic of zstd to determine the error.

Since this is not guaranteed to be a stable api, add a test for that
so we catch that error early on build. This should be fine, as long as
the zstd behavior only changes with e.g. major debian upgrades, which
is normally the only time where the zstd version is updated.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
 [ TL: re-order fn, rename test and reword comments ]
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
3 months agodatastore: test DataBlob encode/decode roundtrip
Dominik Csapak [Mon, 5 Aug 2024 09:24:11 +0000 (11:24 +0200)]
datastore: test DataBlob encode/decode roundtrip

so that we can be sure we can decode an encoded blob again

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
3 months agodatastore: remove unused data blob writer
Dominik Csapak [Mon, 5 Aug 2024 09:24:10 +0000 (11:24 +0200)]
datastore: remove unused data blob writer

This is leftover code that is not currently used outside of its own
tests.

Should we need it again, we can just revert this commit.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
3 months agofix typos in variables and function names
Maximiliano Sandoval [Wed, 7 Aug 2024 12:10:45 +0000 (14:10 +0200)]
fix typos in variables and function names

Variables, methods and functions in public API were not changed.

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
3 months agofix typos in strings
Maximiliano Sandoval [Wed, 7 Aug 2024 12:10:44 +0000 (14:10 +0200)]
fix typos in strings

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
3 months agofix typos in docs an manual pages
Maximiliano Sandoval [Wed, 7 Aug 2024 12:10:43 +0000 (14:10 +0200)]
fix typos in docs an manual pages

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
3 months agofix typos in rust documentation blocks
Maximiliano Sandoval [Wed, 7 Aug 2024 12:10:42 +0000 (14:10 +0200)]
fix typos in rust documentation blocks

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
3 months agofix typos in comments
Maximiliano Sandoval [Wed, 7 Aug 2024 12:10:41 +0000 (14:10 +0200)]
fix typos in comments

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
3 months agodocs: add external metrics server page
Gabriel Goller [Wed, 7 Aug 2024 12:37:36 +0000 (14:37 +0200)]
docs: add external metrics server page

Add External Metrics page to PBS's documentation. Most of it is copied
from the PVE documentation, minus the Graphite part.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
3 months agoreplace proxmox_sys::systemd with proxmox_systemd calls
Wolfgang Bumiller [Tue, 6 Aug 2024 12:13:58 +0000 (14:13 +0200)]
replace proxmox_sys::systemd with proxmox_systemd calls

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
3 months agobump h2 to 0.4
Fabian Grünbichler [Thu, 25 Jul 2024 11:06:54 +0000 (13:06 +0200)]
bump h2 to 0.4

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
3 months agoremove use of proxmox_lang::error::io_err_other
Wolfgang Bumiller [Fri, 26 Jul 2024 10:17:09 +0000 (12:17 +0200)]
remove use of proxmox_lang::error::io_err_other

by now its functionality is provided by std::io::Error::other

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
4 months agoupdate to proxmox-log 0.2 and proxmox-rest-server 0.7
Wolfgang Bumiller [Wed, 24 Jul 2024 12:34:56 +0000 (14:34 +0200)]
update to proxmox-log 0.2 and proxmox-rest-server 0.7

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
4 months agoclient: avoid unnecessary allocation in AES benchmark
Dietmar Maurer [Fri, 19 Jul 2024 10:01:15 +0000 (12:01 +0200)]
client: avoid unnecessary allocation in AES benchmark

Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
4 months agoimage backup: use 4M input buffer
Fabian Grünbichler [Wed, 17 Jul 2024 13:08:27 +0000 (15:08 +0200)]
image backup: use 4M input buffer

with the default 8k input buffer size, the client will spend most of the time
polling instead of reading/chunking/uploading.

tested with 16G random data file from tmpfs to fresh datastore backed by tmpfs,
without encryption.

stock:

Time (mean ± σ):     36.064 s ±  0.655 s    [User: 21.079 s, System: 26.415 s]
  Range (min … max):   35.663 s … 36.819 s    3 runs

patched:

 Time (mean ± σ):     23.591 s ±  0.807 s    [User: 16.532 s, System: 18.629 s]
  Range (min … max):   22.663 s … 24.125 s    3 runs

Summary
  patched ran
    1.53 ± 0.06 times faster than stock

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
4 months agoexample: improve chunking speed example
Fabian Grünbichler [Wed, 17 Jul 2024 13:08:26 +0000 (15:08 +0200)]
example: improve chunking speed example

by dropping the print-per-chunk and making the input buffer size configurable
(8k is the default when using `new()`).

this allows benchmarking various input buffer sizes. basically the same code is
used for image-based backups in proxmox-backup-client, but just the
reading and chunking part. looking at the flame graphs the smaller input
buffer sizes clearly show most of time spent polling, instead of
reading+copying (or reading and scanning and copying).

for a fixed chunk size stream with a 16G input file on tmpfs:

fixed 1M ran
    1.06 ± 0.17 times faster than fixed 4M
    1.22 ± 0.11 times faster than fixed 16M
    1.25 ± 0.09 times faster than fixed 512k
    1.31 ± 0.10 times faster than fixed 256k
    1.55 ± 0.13 times faster than fixed 128k
    1.92 ± 0.15 times faster than fixed 64k
    3.09 ± 0.31 times faster than fixed 32k
    4.76 ± 0.32 times faster than fixed 16k
    8.08 ± 0.59 times faster than fixed 8k

(from 15.275s down to 1.890s)

dynamic chunk stream, same input:

dynamic 4M ran
    1.01 ± 0.03 times faster than dynamic 1M
    1.03 ± 0.03 times faster than dynamic 16M
    1.06 ± 0.04 times faster than dynamic 512k
    1.07 ± 0.03 times faster than dynamic 128k
    1.12 ± 0.03 times faster than dynamic 64k
    1.15 ± 0.20 times faster than dynamic 256k
    1.23 ± 0.03 times faster than dynamic 32k
    1.47 ± 0.04 times faster than dynamic 16k
    1.92 ± 0.05 times faster than dynamic 8k

(from 26.5s down to 13.772s)

same input file on ext4 on LVM on CT2000P5PSSD8 (with caches dropped for each run):

fixed 4M ran
   1.06 ± 0.02 times faster than fixed 16M
   1.10 ± 0.01 times faster than fixed 1M
   1.12 ± 0.01 times faster than fixed 512k
   1.15 ± 0.02 times faster than fixed 128k
   1.17 ± 0.01 times faster than fixed 256k
   1.22 ± 0.02 times faster than fixed 64k
   1.55 ± 0.05 times faster than fixed 32k
   2.00 ± 0.07 times faster than fixed 16k
   3.01 ± 0.15 times faster than fixed 8k

(from 19.807s down to 6.574s)

dynamic 4M ran
    1.04 ± 0.02 times faster than dynamic 512k
    1.04 ± 0.02 times faster than dynamic 128k
    1.04 ± 0.02 times faster than dynamic 16M
    1.06 ± 0.02 times faster than dynamic 1M
    1.06 ± 0.02 times faster than dynamic 256k
    1.08 ± 0.02 times faster than dynamic 64k
    1.16 ± 0.02 times faster than dynamic 32k
    1.34 ± 0.03 times faster than dynamic 16k
    1.70 ± 0.04 times faster than dynamic 8k

(from 31.184s down to 18.378s)

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
4 months agobuild: ensure wrapper config is picked up
Fabian Grünbichler [Wed, 10 Jul 2024 12:29:24 +0000 (14:29 +0200)]
build: ensure wrapper config is picked up

`cargo build` and `cargo install` pick up different config files, by symlinking
the wrapper config into a place with higher precedence than the one in the
top-level git repo dir, we ensure the package build actually picks up the
desired config instead of the one intended for quick dev builds.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
4 months agoserver: pull: fix sync info message for root namespace
Christian Ebner [Mon, 15 Jul 2024 10:15:43 +0000 (12:15 +0200)]
server: pull: fix sync info message for root namespace

The root namespace is displayed as empty string when used in the
format string. Distinguish and explicitly write out the root namespace
in the sync info message shown in the sync jobs task log.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
4 months agowww: sync edit: indetation style fix
Christian Ebner [Mon, 15 Jul 2024 10:15:42 +0000 (12:15 +0200)]
www: sync edit: indetation style fix

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
4 months agoserver: pull: silence clippy to many arguments warning
Christian Ebner [Mon, 15 Jul 2024 10:15:41 +0000 (12:15 +0200)]
server: pull: silence clippy to many arguments warning

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
4 months agoserver: pull: be more specific in module comment
Christian Ebner [Mon, 15 Jul 2024 10:15:40 +0000 (12:15 +0200)]
server: pull: be more specific in module comment

Describe the `pull` direction of the sync operation more precisely
before adding also a `push` direction as synchronization operation.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
4 months agodatastore: data blob: fix typos in comments
Christian Ebner [Mon, 15 Jul 2024 10:15:39 +0000 (12:15 +0200)]
datastore: data blob: fix typos in comments

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
4 months agoapi certs: run cargo fmt
Thomas Lamprecht [Wed, 17 Jul 2024 11:28:05 +0000 (13:28 +0200)]
api certs: run cargo fmt

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agofix #3699: client: prefer xdg cache directory for tmp files
Maximiliano Sandoval [Wed, 17 Jul 2024 10:18:35 +0000 (12:18 +0200)]
fix #3699: client: prefer xdg cache directory for tmp files

Adds a helper to create temporal files in XDG_CACHE_HOME. If we cannot
create a file there, we fallback to /tmp as before.

Note that the temporary files stored by the client might grow
arbitrarily in size, making XDG_RUNTIME_DIR a less desirable option.
Citing the Arch wiki [1]:

> Should not store large files as it may be mounted as a tmpfs.

While the cache directory is most often not backed up by an ephemeral
FS, using the `O_TMPFILE` flag avoids the need for potential cleanup,
e.g. on interruption of a command. As with this flag set the data will
be discarded when the last file descriptor is closed.

[1] https://wiki.archlinux.org/title/XDG_Base_Directory

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
 [ TL: mention TMPFILE flag for clarity ]
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agobump apt-api-types dependency to 1.0.1
Thomas Lamprecht [Wed, 17 Jul 2024 09:44:40 +0000 (11:44 +0200)]
bump apt-api-types dependency to 1.0.1

to pull in the fix for restoring backwards compatibility due to the
digest from that crate using a u8 slice instead of our dedicated
ConfigDigest type, which would serialize to String.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agodatastore: replace deprecated `archive_type` function
Christian Ebner [Wed, 3 Jul 2024 10:11:00 +0000 (12:11 +0200)]
datastore: replace deprecated `archive_type` function

Commit ea584a75 "move more api types for the client" deprecated
the `archive_type` function in favor of the associated function
`ArchiveType::from_path`.

Replace all remaining callers of the deprecated function with its
replacement.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
[WB: and remove the deprecated function]
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
4 months agodatastore: fix typo in comment
Gabriel Goller [Wed, 3 Jul 2024 14:55:06 +0000 (16:55 +0200)]
datastore: fix typo in comment

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
4 months agodatastore: use cached snapshot time string in path
Gabriel Goller [Wed, 3 Jul 2024 15:08:36 +0000 (17:08 +0200)]
datastore: use cached snapshot time string in path

When getting the `full_path` of a snapshot we did not use the cached
time string. By using it we avoid a call to the super-slow libc strftime.

This has some minor performance improvements of circa 7%. That is ~100ms
on my datastore with ~5000 snapshots.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
4 months agodatastore: avoid calculating protected attribute twice
Gabriel Goller [Wed, 3 Jul 2024 15:02:46 +0000 (17:02 +0200)]
datastore: avoid calculating protected attribute twice

The protected status of the snapshot is retrieved twice. This is slow
because it stat's the .protected file multiple times.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
Tested-by: Christian Ebner <c.ebner@proxmox.com>
Reviewed-by: Christian Ebner <c.ebner@proxmox.com>
4 months agodon't directly depend on tracing-subscriber
Wolfgang Bumiller [Fri, 12 Jul 2024 09:19:25 +0000 (11:19 +0200)]
don't directly depend on tracing-subscriber

This was only used for LevelFilter which is also exposed via the
tracing crate directly.

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
4 months agoapi: inherit LogContext in tasks hyper spawns in h2 handlers
Wolfgang Bumiller [Thu, 11 Jul 2024 14:21:35 +0000 (16:21 +0200)]
api: inherit LogContext in tasks hyper spawns in h2 handlers

so that tasks spawn()ed by hyper's h2 code log to the correct place

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
4 months agobump sys and rest-server dependencies to 0.6
Wolfgang Bumiller [Thu, 11 Jul 2024 13:33:43 +0000 (15:33 +0200)]
bump sys and rest-server dependencies to 0.6

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
4 months agoapi: switch from task_log! macro to tracing
Gabriel Goller [Tue, 9 Jul 2024 14:20:13 +0000 (16:20 +0200)]
api: switch from task_log! macro to tracing

Import `proxmox-log` and substitute all `task_log!`
(and task_warn!, task_error!) invocations with tracing calls (info!,
warn!, etc..). Remove worker references where it isn't necessary
anymore.

Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Lukas Wagner <l.wagner@proxmox.com>
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
4 months agoswitch from task_log! macro to tracing
Gabriel Goller [Tue, 9 Jul 2024 14:20:12 +0000 (16:20 +0200)]
switch from task_log! macro to tracing

Import `proxmox-log` and substitute all `task_log!`
(and task_warn!, task_error!) invocations with tracing calls (info!,
warn!, etc..). Remove worker references where it isn't necessary
anymore.

Reviewed-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Lukas Wagner <l.wagner@proxmox.com>
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
4 months agocargo: fix package name
Gabriel Goller [Thu, 11 Jul 2024 08:33:28 +0000 (10:33 +0200)]
cargo: fix package name

s/proxmox-apt-api/proxmox-apt-api-types/

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
4 months agocargo: add local dependencies
Gabriel Goller [Tue, 9 Jul 2024 10:54:26 +0000 (12:54 +0200)]
cargo: add local dependencies

Add local dependencies for new crates `proxmox-apt-api-types` and
`proxmox-config-digest`. Also fix order of deps.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
4 months agobump d/control
Wolfgang Bumiller [Tue, 9 Jul 2024 06:06:17 +0000 (08:06 +0200)]
bump d/control

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
4 months agouse new apt/apt-api-types crate
Dietmar Maurer [Fri, 21 Jun 2024 09:51:30 +0000 (11:51 +0200)]
use new apt/apt-api-types crate

4 months agobump proxmox-tfa dependency to 5.0.0
Wolfgang Bumiller [Wed, 3 Jul 2024 13:27:47 +0000 (15:27 +0200)]
bump proxmox-tfa dependency to 5.0.0

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
4 months agobump version to 3.2.7-1 v3.2.7
Thomas Lamprecht [Wed, 3 Jul 2024 11:33:59 +0000 (13:33 +0200)]
bump version to 3.2.7-1

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agoupdate online help reference info
Thomas Lamprecht [Wed, 3 Jul 2024 08:59:39 +0000 (10:59 +0200)]
update online help reference info

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
4 months agomanager: restore newline in wipe-disk confirmation query
Wolfgang Bumiller [Wed, 3 Jul 2024 09:20:40 +0000 (11:20 +0200)]
manager: restore newline in wipe-disk confirmation query

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
4 months agobackup_manager: use confirmation helper in wipe-disk command
Gabriel Goller [Wed, 19 Jun 2024 10:15:44 +0000 (12:15 +0200)]
backup_manager: use confirmation helper in wipe-disk command

Use `Confirmation` helper in the wipe-disk command prompt.

Improves: 887d83cb (cli: add interactive confirmation for block device wipe, 2023-11-29)
Cc: Markus Frank <m.frank@proxmox.com>
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
4 months agodatastore: fix problem with operations counting
Hannes Laimer [Thu, 25 Apr 2024 09:01:50 +0000 (11:01 +0200)]
datastore: fix problem with operations counting

... if `.chunks/` is not available(deleted/moved) ChunkStore::open
fails, but that would happen after updating the active operations on the
datastore, so no reference that could be dropped is returned. Leading to
the operations counter to always increase. This only updates the counter
when a reference is returned, not before.

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
4 months agohttp_client: keep renewal future running on failed re-auth
Hannes Laimer [Mon, 24 Jun 2024 07:54:38 +0000 (09:54 +0200)]
http_client: keep renewal future running on failed re-auth

The re-authentication request can also fail due to network instability,
and not necesarrily only due to an invalid ticket. In that case it makes
sense to retry refreshing the ticket in 15 minutes. Also, the future does
not depend on a failed re-authentication to be clean up properly, so that
happens already somewhere else, therefore we don't rely on this return
anyway. If the ticket is actually invalid or timed out, the main job
will fail and also terminate the renewal future, same applies if the
network is not just unstable but straight up not working.

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
Reviewed-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
4 months agofix 5304: client: set process uid/gid for .pxarexclude-cli
Christian Ebner [Tue, 30 Apr 2024 15:37:14 +0000 (17:37 +0200)]
fix 5304: client: set process uid/gid for .pxarexclude-cli

The .pxarexclude-cli encodes the exclude patterns the client was
invoked with in the pxar archive as regular file entry. The current
behaviour of setting the uid and gid to default 0 (root) causes
however issues when trying to backup and restore the backup as
non-root user.

Opt for using the uid/gid of the user the executable was called as,
allowing the restore for this user to succeed. Root will succeed
to restore anyways.

Link to issue in bugtracker:
https://bugzilla.proxmox.com/show_bug.cgi?id=5304

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
Tested-by: Gabriel Goller <g.goller@proxmox.com>
4 months agoclient: mount: wait for child to return before exiting
Gabriel Goller [Tue, 18 Jun 2024 14:03:33 +0000 (16:03 +0200)]
client: mount: wait for child to return before exiting

When using the `proxmox-backup-client mount` command, the parent sometimes
exits before we can print any error message. Most notably this happens
when no PBS_REPOSITORY is passed, as this is the first option checked.
If the underlying file descriptor has been closed, wait for the client
to complete and return the error message.

Reported-by: Friedrich Weber <f.weber@proxmox.com>
Suggested-by: Christian Ebner <c.ebner@proxmox.com>
Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
Tested-by: Friedrich Weber <f.weber@proxmox.com>
4 months agoclose #5571: client: fix regression for `map` command
Christian Ebner [Tue, 2 Jul 2024 07:24:14 +0000 (09:24 +0200)]
close #5571: client: fix regression for `map` command

Commit 08fe5052 introduced functionality to mount split pxar archives
(sharing code with the map command), moving the manifest lookup
exclusive to fixed index archives.

However, the lookup now uses the incorrect archive name, not
containing the `.fidx` extension, which is however required for the
lookup in the manifest.

Fix the issue by calling the method with the correct server archive
name including the required extension.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
Tested-by: Gabriel Goller <g.goller@proxmox.com>
Reviewed-by: Gabriel Goller <g.goller@proxmox.com>
Fixes: 08fe5052 ("client: mount: make split pxar archives mountable")
[FG: reworded, add proper "Fixes:" trailer.]
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
4 months agomake: add deb-nostrip target
Fabian Grünbichler [Thu, 27 Jun 2024 08:33:39 +0000 (10:33 +0200)]
make: add deb-nostrip target

it builds about 1.5 times faster than regular `make deb` (shaving off a
whopping 100s on my machine). the resulting debs containing executables are of
course bigger (since the debug symbols are not split out into their own
package, and the ELF linkage stripping is also skipped), but other than the
associated file and memory mapping overhead there should be no difference in
behaviour or performance, and such debs are suitable for local testing (both of
the build process, and the built code).

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
4 months agodon't call contains_key() before remove()
Wolfgang Bumiller [Fri, 28 Jun 2024 07:33:23 +0000 (09:33 +0200)]
don't call contains_key() before remove()

HashMap::remove() returns the value it removes as an Option<>, so
instead of first checking if the key exists before removing it, just
try to remove it and use the returned Option<> to test whether we
should bail!().

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
4 months agotools: add missing cfg(test) macro
Maximiliano Sandoval [Wed, 26 Jun 2024 13:06:03 +0000 (15:06 +0200)]
tools: add missing cfg(test) macro

Fixes the rustc warning:

warning: struct `TestAsyncCacher` is never constructed
  --> pbs-tools/src/async_lru_cache.rs:86:12
   |
86 |     struct TestAsyncCacher {
   |            ^^^^^^^^^^^^^^^
   |
   = note: `#[warn(dead_code)]` on by default

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
4 months agochunk_store: do not explicitly write implied trait
Maximiliano Sandoval [Wed, 26 Jun 2024 13:06:02 +0000 (15:06 +0200)]
chunk_store: do not explicitly write implied trait

Fixes the clippy warning:

warning: this bound is already specified as the supertrait of `std::iter::FusedIterator`
   --> pbs-datastore/src/chunk_store.rs:254:14
    |
254 |         impl Iterator<Item = (Result<proxmox_sys::fs::ReadDirEntry, Error>, usize, bool)>
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implied_bounds_in_impls
    = note: `#[warn(clippy::implied_bounds_in_impls)]` on by default
help: try removing this bound
    |
254 -         impl Iterator<Item = (Result<proxmox_sys::fs::ReadDirEntry, Error>, usize, bool)>
255 -             + std::iter::FusedIterator,
254 +         impl std::iter::FusedIterator<Item = (Result<proxmox_sys::fs::ReadDirEntry, Error>, usize, bool)>,

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
4 months agotools: write multiplication by 01 succinctly
Maximiliano Sandoval [Wed, 26 Jun 2024 13:06:01 +0000 (15:06 +0200)]
tools: write multiplication by 01 succinctly

Fixes the clippy warning:

warning: this multiplication by -1 can be written more succinctly
   --> pbs-client/src/tools/mod.rs:700:58
    |
700 |                         SignedDuration::Negative(val) => -1 * i64::try_from(val.as_secs())?,
    |                                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `-i64::try_from(val.as_secs())?`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#neg_multiply
    = note: `#[warn(clippy::neg_multiply)]` on by default

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
4 months agoapi: remove use of unnecessary pub(self)
Maximiliano Sandoval [Wed, 26 Jun 2024 13:06:00 +0000 (15:06 +0200)]
api: remove use of unnecessary pub(self)

Fixes the clippy warning:

warning: unnecessary `pub(self)`
  --> src/api2/access/mod.rs:35:1
   |
35 | pub(self) async fn user_update_auth<S: AsRef<str>>(
   | ^^^^^^^^^ help: remove it
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_pub_self
   = note: `#[warn(clippy::needless_pub_self)]` on by default

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
4 months agoreplace get(key).is_none() with !contains_key()
Maximiliano Sandoval [Wed, 26 Jun 2024 13:05:59 +0000 (15:05 +0200)]
replace get(key).is_none() with !contains_key()

Fixes the clippy warning:

warning: unnecessary use of `get(&user2).is_none()`
    --> pbs-config/src/acl.rs:1067:36
     |
1067 |                 assert!(node.users.get(&user2).is_none());
     |                         -----------^^^^^^^^^^^^^^^^^^^^^
     |                         |
     |                         help: replace it with: `!node.users.contains_key(&user2)`
     |
     = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_get_then_check

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
4 months agoreplace get(key).is_some() with contains_key()
Maximiliano Sandoval [Wed, 26 Jun 2024 13:05:58 +0000 (15:05 +0200)]
replace get(key).is_some() with contains_key()

Fixes the clippy warning:

warning: unnecessary use of `get(realm).is_some()`
  --> pbs-config/src/domains.rs:68:58
   |
68 |     realm == "pbs" || realm == "pam" || domains.sections.get(realm).is_some()
   |                                                          ^^^^^^^^^^^^^^^^^^^^ help: replace it with: `contains_key(realm)`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_get_then_check

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
4 months agoMakefile: drop outdated comment
Fabian Grünbichler [Thu, 27 Jun 2024 07:43:01 +0000 (09:43 +0200)]
Makefile: drop outdated comment

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
4 months agobuild: fix `nocheck` build
Fabian Grünbichler [Mon, 3 Jun 2024 12:04:50 +0000 (14:04 +0200)]
build: fix `nocheck` build

pbs2to3 was missing from the list of to-be-compiled binaries, and thus was only
compiled as a side-effect of running `cargo test` (which is skipped when the
build is using the `nocheck` build profile).

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
4 months agocargo config: add `debug=true`
Fabian Grünbichler [Tue, 25 Jun 2024 12:21:58 +0000 (14:21 +0200)]
cargo config: add `debug=true`

else debug symbols are stipped with 1.79+.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
4 months agotrivial clippy fixes
Fabian Grünbichler [Tue, 25 Jun 2024 11:37:35 +0000 (13:37 +0200)]
trivial clippy fixes

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
5 months agorun cargo fmt
Fabian Grünbichler [Mon, 24 Jun 2024 08:02:07 +0000 (10:02 +0200)]
run cargo fmt

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
5 months agotrivial clippy fixes
Fabian Grünbichler [Mon, 24 Jun 2024 07:59:27 +0000 (09:59 +0200)]
trivial clippy fixes

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
5 months agobump proxmox-rrd to 0.2 and proxmox-time to 2.0
Wolfgang Bumiller [Thu, 20 Jun 2024 12:08:08 +0000 (14:08 +0200)]
bump proxmox-rrd to 0.2 and proxmox-time to 2.0

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
5 months agobump bitflags to 2.4
Wolfgang Bumiller [Thu, 20 Jun 2024 11:36:59 +0000 (13:36 +0200)]
bump bitflags to 2.4

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
5 months agoupdate README.rst to refer to .cargo/config.toml
Wolfgang Bumiller [Thu, 20 Jun 2024 10:31:18 +0000 (12:31 +0200)]
update README.rst to refer to .cargo/config.toml

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
5 months agofs: update comment to reflect usage of C-string literals
Maximiliano Sandoval [Thu, 20 Jun 2024 09:00:08 +0000 (11:00 +0200)]
fs: update comment to reflect usage of C-string literals

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
5 months agorename .cargo/config to .cargo/config.toml
Wolfgang Bumiller [Thu, 20 Jun 2024 10:24:27 +0000 (12:24 +0200)]
rename .cargo/config to .cargo/config.toml

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
5 months agocargo: use default-features
Maximiliano Sandoval [Thu, 20 Jun 2024 09:00:05 +0000 (11:00 +0200)]
cargo: use default-features

Fixes the compile-time warning:

warning: Cargo.toml: `default_features` is deprecated in favor of `default-features` and will not work in the 2024 edition
(in the `proxmox-router` dependency)

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
5 months agouse XATTR_* constants instead of calling functions
Wolfgang Bumiller [Thu, 20 Jun 2024 09:07:33 +0000 (11:07 +0200)]
use XATTR_* constants instead of calling functions

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
5 months agobump sys dependency to 0.5.7
Wolfgang Bumiller [Thu, 20 Jun 2024 09:08:10 +0000 (11:08 +0200)]
bump sys dependency to 0.5.7

for the new xattr constants

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
5 months agoreplace c_str! macro with c"literals"
Wolfgang Bumiller [Thu, 20 Jun 2024 09:07:10 +0000 (11:07 +0200)]
replace c_str! macro with c"literals"

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
5 months agobuild: use cargo wrapper when building package
Fabian Grünbichler [Wed, 19 Jun 2024 14:38:05 +0000 (16:38 +0200)]
build: use cargo wrapper when building package

else we don't pick up the options set by the wrapper, which include generation
of debug symbols. until rustc 1.77, this was not needed because compiled
binaries always included a non-stripped libstd. now, without this change, the
binaries built with `cargo build --release` have no debug symbols at all
trigger a warning. fix this and include debug symbols when building a package,
like was originally intended for release package builds.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
5 months agobuild: fix SUBCRATES for arbitrary working dirs
Fabian Grünbichler [Wed, 19 Jun 2024 15:47:37 +0000 (17:47 +0200)]
build: fix SUBCRATES for arbitrary working dirs

else this only works if the git working tree is in a dir called
'proxmox-backup'

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
5 months agobuild: adapt workspace member command
Fabian Grünbichler [Wed, 19 Jun 2024 14:00:39 +0000 (16:00 +0200)]
build: adapt workspace member command

to work with cargo 1.77, which changed from

 pbs-api-types 0.1.0 (path+file:///home/fgruenbichler/Sources/proxmox-backup/pbs-api-types)

to

 path+file:///home/fgruenbichler/Sources/proxmox-backup/pbs-api-types#0.1.0

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
5 months agoclose #4763: client: add command to forget backup group
Gabriel Goller [Mon, 3 Jun 2024 08:43:11 +0000 (10:43 +0200)]
close #4763: client: add command to forget backup group

Add the command `proxmox-backup-client group forget <group>` so
that we can forget (delete) whole groups with all the containing
snapshots.
To avoid printing full datastore paths (which are in the error messages)
we filter out the most common one (group not found) and rephrase it.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
[WB: rebased & sorted import statements in client's main.rs]
[WB: replace extract_repository_from_value with
     remove_repository_from_value since the parameter is rejected on
     the remote side]
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
5 months agoclient: add 'remove_repository_from_value' helper
Wolfgang Bumiller [Wed, 19 Jun 2024 09:30:09 +0000 (11:30 +0200)]
client: add 'remove_repository_from_value' helper

'extract_repository_from_value' takes an immutable reference and
doesn't remove the parsed parameter (whereas in contrast in our PVE
codebase, the 'extract_param' method does remove it).

This adds a variant that explicitly removes it called
'remove_repository_from_value'.

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
5 months agopxar: use anyhow::Error in PxarBackupStream
Gabriel Goller [Tue, 18 Jun 2024 14:22:03 +0000 (16:22 +0200)]
pxar: use anyhow::Error in PxarBackupStream

Instead of storing the error as a string in the PxarBackupStream, we
store it as an anyhow::Error. As we can't clone an anyhow::Error, we take
it out from the mutex and return it. This won't change anything as
the consumation of the stream will stop if it gets a Some(Err(..)).

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
5 months agopxar: add UniqueContext helper
Gabriel Goller [Tue, 18 Jun 2024 14:22:02 +0000 (16:22 +0200)]
pxar: add UniqueContext helper

To create a pxar archive, we recursively traverse the target folder.
If there is an error further down and we add a context using anyhow,
the context will be duplicated and we get an output like:

> Error: error at "xattr/xattr.txt": error at "xattr/xattr.txt": E2BIG [skip]

This is obviously not optimal, so in recursive contexts we can use the
UniqueContext, which quickly checks the context from the last item in
the error chain and only adds it if it is unique.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
5 months agopxar: remove ArchiveError
Gabriel Goller [Tue, 18 Jun 2024 14:22:01 +0000 (16:22 +0200)]
pxar: remove ArchiveError

The sole purpose of the ArchiveError was to add the file-path to the
error. Using anyhow::Error we can add this information using the context
and don't need this struct anymore.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
5 months agoui: gc job edit: fix i18n gettext usage
Thomas Lamprecht [Tue, 18 Jun 2024 14:12:14 +0000 (16:12 +0200)]
ui: gc job edit: fix i18n gettext usage

String concatenating a variable with some static text as gettext
parameter cannot really work, and it also does not make sense to do
most of the time, as even if we'd use some overly generic format
string like '{0} (disabled)', it would be not easy to translate
correctly in all languages in such a generic way.

So just use the actual full string, which is already contained in our
translation catalogue anyway…

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
5 months agodocs: drop blanket statement recommending against remote storage
Thomas Lamprecht [Mon, 17 Jun 2024 15:06:55 +0000 (17:06 +0200)]
docs: drop blanket statement recommending against remote storage

This is basically semantic revert of e5c0d80c ("docs: add note for not
using remote storages") that, while well intended, has a few problems,
e.g.:
- This is the minimal/recommended requirements section, which should
  list the rough basic specs a setup must/should have. Listing
  everything that is not best to do would bloat this list
  significantly and it's just the wrong place for it, i.e., it isn't a
  recommended against list.
- while it's true that a remote storage will basically always have
  _some_ overhead over using the same HW with a (modern) local storage
  (file) system, that does **not** mean that the remote storage has
  insufficient performance characteristics. We know of lots of fast
  Ceph setups, even release benchmarks for them, or storages like
  BlockBridge, that provide high performance while being remote.

So avoid this X-Y-problem style argumentation and focus on what is
actually important, even though I naturally get that there are some
users that use slow NFS attached storages, but breaking style here
won't cure them and I'm sure that they are capable of setting up such
a slow local storage that it won't make a real difference compared to
the NFS one.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
5 months agobump proxmox-sys dep to 0.5.6
Wolfgang Bumiller [Mon, 17 Jun 2024 12:06:25 +0000 (14:06 +0200)]
bump proxmox-sys dep to 0.5.6

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
5 months agoMerge branch '3.2.6'
Fabian Grünbichler [Mon, 17 Jun 2024 08:38:02 +0000 (10:38 +0200)]
Merge branch '3.2.6'

branched off to avoid a breaking change on master

5 months agobump version to 3.2.6-1
Fabian Grünbichler [Mon, 17 Jun 2024 08:18:53 +0000 (10:18 +0200)]
bump version to 3.2.6-1

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
5 months agoclient: pxar: fix fuse mount performance for split archives
Christian Ebner [Wed, 12 Jun 2024 13:17:13 +0000 (15:17 +0200)]
client: pxar: fix fuse mount performance for split archives

Adapt to the decoder/accessor method changes introduced in the pxar
library, which were introduced in order to move the consistency check
for metadata and payload data archives.

The new location of the checks allows to access the pxar archive via
a `Split` variant reader instance, without penalization when just
accessing the metadata, not reading any payload data.

This greatly improves performance when accessing fuse mounted
archives.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
bumped dependency after pxar version bump

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
5 months agoconfig: acme: use latest proxmox_sys::fs::ensure_dir_exists
Dietmar Maurer [Thu, 13 Jun 2024 09:58:09 +0000 (11:58 +0200)]
config: acme: use latest proxmox_sys::fs::ensure_dir_exists

Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
5 months agodocs: add note for not using remote storages
Dominik Csapak [Tue, 11 Jun 2024 09:30:46 +0000 (11:30 +0200)]
docs: add note for not using remote storages

such as NFS or SMB. They will not provide the expected performance
and it's better to recommend against them.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
5 months agotape: handle PEWZ like regular early warning
Dominik Csapak [Mon, 10 Jun 2024 11:45:05 +0000 (13:45 +0200)]
tape: handle PEWZ like regular early warning

as a safeguard, should the disabling not work for some reason.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
5 months agotape: disable Programmable Early Warning Zone (PEWZ)
Dominik Csapak [Mon, 10 Jun 2024 11:45:04 +0000 (13:45 +0200)]
tape: disable Programmable Early Warning Zone (PEWZ)

since that leads to errors that we don't currently catch before we
reach the regular early warning on tape.

This can be read/set by the Device Configuration Extension Mode Page.
ignore errors on reading or writing, since it may not be available on
LTO-4

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
5 months agotape: refactor setting the mode page
Dominik Csapak [Mon, 10 Jun 2024 11:45:03 +0000 (13:45 +0200)]
tape: refactor setting the mode page

we'll reuse that code later for a different page/subpage

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
5 months agobump version to 3.2.5-1
Fabian Grünbichler [Mon, 10 Jun 2024 11:45:17 +0000 (13:45 +0200)]
bump version to 3.2.5-1

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
5 months agobump pxar to 0.11.1
Fabian Grünbichler [Mon, 10 Jun 2024 11:39:33 +0000 (13:39 +0200)]
bump pxar to 0.11.1

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
5 months agoextract: don't interpret prelude as OsStr
Fabian Grünbichler [Mon, 10 Jun 2024 11:38:10 +0000 (13:38 +0200)]
extract: don't interpret prelude as OsStr

that would drop the final byte, and the corresponding code has been removed
from pxar now as well.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
5 months agoclient: pxar: encode prelude based on writer variant
Christian Ebner [Mon, 10 Jun 2024 11:06:21 +0000 (13:06 +0200)]
client: pxar: encode prelude based on writer variant

Currently, whether to encode the exlcude patterns passed via cli as
prelude or via the `.pxar-exclude-cli` is based on the presence of
a previous metadata accessor.
That leaves however to the encoding of the file entry instead of the
prelude for split archives in `data` mode and for the first snapshot
in a backup, creating undesired padding in the first payload chunk.

Therefore, use the pxar writer variant to make the decision instead.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
5 months agoclient: pxar: json encode cli exclude pattern in prelude
Christian Ebner [Mon, 10 Jun 2024 11:06:20 +0000 (13:06 +0200)]
client: pxar: json encode cli exclude pattern in prelude

The current encoding is not extensible, so encode the cli exclude
patterns as json instead. By this, the prelude is easily seralized
and deserialized, while remaining human readable.

Originally-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
5 months agofile-restore: list: improve pxar v2 performance
Christian Ebner [Mon, 10 Jun 2024 08:39:33 +0000 (10:39 +0200)]
file-restore: list: improve pxar v2 performance

Do not attach the payload reader for split pxar archives, as only the
metadata has to be accessed for listing.
This avoids that the decoder performs consistency checks with the
payload stream, which require chunk download and decoding, making the
listing unusable slow.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>