public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Christian Ebner <c.ebner@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH v4 proxmox-backup 15/58] client: pxar: switch to stack based encoder state
Date: Mon, 29 Apr 2024 14:10:19 +0200	[thread overview]
Message-ID: <20240429121102.315059-16-c.ebner@proxmox.com> (raw)
In-Reply-To: <20240429121102.315059-1-c.ebner@proxmox.com>

... and add the new optional encoder/decoder/accessor parameter to
attach a dedicated payload input/output.

In preparation for look-ahead caching, where a passing around of
per-directory level encoder instances with internal references is
not feasible.

Previously, for each directory level a new encoder instance has been
generated, restricting possible implementation errors. These encoder
instances have been internally linked by references to keep track of
the state changes in a parent child relationship.

This is however not feasible when the encoder has to be passed by
mutable reference, as required by the look-ahead cache
implementation. The encoder has therefore been adapted to use a
single instance implementation with an internal stack keeping track
of the state.

Depends on the bumped pxar library version, including the patches to
optionally attach the dedicated payload input/output.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
 pbs-client/src/pxar/create.rs             | 8 +++++---
 pbs-pxar-fuse/src/lib.rs                  | 2 +-
 proxmox-backup-client/src/catalog.rs      | 2 +-
 proxmox-backup-client/src/main.rs         | 2 +-
 proxmox-backup-client/src/mount.rs        | 2 +-
 proxmox-file-restore/src/main.rs          | 4 ++--
 pxar-bin/src/main.rs                      | 2 +-
 src/api2/admin/datastore.rs               | 2 +-
 src/api2/tape/restore.rs                  | 4 ++--
 src/bin/proxmox_backup_debug/diff.rs      | 2 +-
 src/tape/file_formats/snapshot_archive.rs | 3 ++-
 11 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/pbs-client/src/pxar/create.rs b/pbs-client/src/pxar/create.rs
index 60efb0ce5..c9bf6df85 100644
--- a/pbs-client/src/pxar/create.rs
+++ b/pbs-client/src/pxar/create.rs
@@ -170,7 +170,7 @@ where
         set.insert(stat.st_dev);
     }
 
-    let mut encoder = Encoder::new(&mut writer, &metadata).await?;
+    let mut encoder = Encoder::new(&mut writer, &metadata, None).await?;
 
     let mut patterns = options.patterns;
 
@@ -203,6 +203,8 @@ where
         .archive_dir_contents(&mut encoder, source_dir, true)
         .await?;
     encoder.finish().await?;
+    encoder.close().await?;
+
     Ok(())
 }
 
@@ -663,7 +665,7 @@ impl Archiver {
     ) -> Result<(), Error> {
         let dir_name = OsStr::from_bytes(dir_name.to_bytes());
 
-        let mut encoder = encoder.create_directory(dir_name, metadata).await?;
+        encoder.create_directory(dir_name, metadata).await?;
 
         let old_fs_magic = self.fs_magic;
         let old_fs_feature_flags = self.fs_feature_flags;
@@ -686,7 +688,7 @@ impl Archiver {
             log::info!("skipping mount point: {:?}", self.path);
             Ok(())
         } else {
-            self.archive_dir_contents(&mut encoder, dir, false).await
+            self.archive_dir_contents(encoder, dir, false).await
         };
 
         self.fs_magic = old_fs_magic;
diff --git a/pbs-pxar-fuse/src/lib.rs b/pbs-pxar-fuse/src/lib.rs
index bf196b6c4..dff7aac31 100644
--- a/pbs-pxar-fuse/src/lib.rs
+++ b/pbs-pxar-fuse/src/lib.rs
@@ -66,7 +66,7 @@ impl Session {
         let file = std::fs::File::open(archive_path)?;
         let file_size = file.metadata()?.len();
         let reader: Reader = Arc::new(accessor::sync::FileReader::new(file));
-        let accessor = Accessor::new(reader, file_size).await?;
+        let accessor = Accessor::new(reader, file_size, None).await?;
         Self::mount(accessor, options, verbose, mountpoint)
     }
 
diff --git a/proxmox-backup-client/src/catalog.rs b/proxmox-backup-client/src/catalog.rs
index 72b22e67f..db919477f 100644
--- a/proxmox-backup-client/src/catalog.rs
+++ b/proxmox-backup-client/src/catalog.rs
@@ -220,7 +220,7 @@ async fn catalog_shell(param: Value) -> Result<(), Error> {
     let reader = BufferedDynamicReader::new(index, chunk_reader);
     let archive_size = reader.archive_size();
     let reader: pbs_pxar_fuse::Reader = Arc::new(BufferedDynamicReadAt::new(reader));
-    let decoder = pbs_pxar_fuse::Accessor::new(reader, archive_size).await?;
+    let decoder = pbs_pxar_fuse::Accessor::new(reader, archive_size, None).await?;
 
     client.download(CATALOG_NAME, &mut tmpfile).await?;
     let index = DynamicIndexReader::new(tmpfile)
diff --git a/proxmox-backup-client/src/main.rs b/proxmox-backup-client/src/main.rs
index 32fe914c4..287005024 100644
--- a/proxmox-backup-client/src/main.rs
+++ b/proxmox-backup-client/src/main.rs
@@ -1453,7 +1453,7 @@ async fn restore(
 
         if let Some(target) = target {
             pbs_client::pxar::extract_archive(
-                pxar::decoder::Decoder::from_std(reader)?,
+                pxar::decoder::Decoder::from_std(reader, None)?,
                 Path::new(target),
                 feature_flags,
                 |path| {
diff --git a/proxmox-backup-client/src/mount.rs b/proxmox-backup-client/src/mount.rs
index 4a2f83357..67fd23468 100644
--- a/proxmox-backup-client/src/mount.rs
+++ b/proxmox-backup-client/src/mount.rs
@@ -296,7 +296,7 @@ async fn mount_do(param: Value, pipe: Option<OwnedFd>) -> Result<Value, Error> {
         let reader = BufferedDynamicReader::new(index, chunk_reader);
         let archive_size = reader.archive_size();
         let reader: pbs_pxar_fuse::Reader = Arc::new(BufferedDynamicReadAt::new(reader));
-        let decoder = pbs_pxar_fuse::Accessor::new(reader, archive_size).await?;
+        let decoder = pbs_pxar_fuse::Accessor::new(reader, archive_size, None).await?;
 
         let session =
             pbs_pxar_fuse::Session::mount(decoder, options, false, Path::new(target.unwrap()))
diff --git a/proxmox-file-restore/src/main.rs b/proxmox-file-restore/src/main.rs
index 50875a636..dbab69942 100644
--- a/proxmox-file-restore/src/main.rs
+++ b/proxmox-file-restore/src/main.rs
@@ -457,7 +457,7 @@ async fn extract(
 
             let archive_size = reader.archive_size();
             let reader = LocalDynamicReadAt::new(reader);
-            let decoder = Accessor::new(reader, archive_size).await?;
+            let decoder = Accessor::new(reader, archive_size, None).await?;
             extract_to_target(decoder, &path, target, format, zstd).await?;
         }
         ExtractPath::VM(file, path) => {
@@ -483,7 +483,7 @@ async fn extract(
                     false,
                 )
                 .await?;
-                let decoder = Decoder::from_tokio(reader).await?;
+                let decoder = Decoder::from_tokio(reader, None).await?;
                 extract_sub_dir_seq(&target, decoder).await?;
 
                 // we extracted a .pxarexclude-cli file auto-generated by the VM when encoding the
diff --git a/pxar-bin/src/main.rs b/pxar-bin/src/main.rs
index 2bbe90e34..d475da4e3 100644
--- a/pxar-bin/src/main.rs
+++ b/pxar-bin/src/main.rs
@@ -26,7 +26,7 @@ fn extract_archive_from_reader<R: std::io::Read>(
     options: PxarExtractOptions,
 ) -> Result<(), Error> {
     pbs_client::pxar::extract_archive(
-        pxar::decoder::Decoder::from_std(reader)?,
+        pxar::decoder::Decoder::from_std(reader, None)?,
         Path::new(target),
         feature_flags,
         |path| {
diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs
index 3ea174998..068b6a61e 100644
--- a/src/api2/admin/datastore.rs
+++ b/src/api2/admin/datastore.rs
@@ -1803,7 +1803,7 @@ pub fn pxar_file_download(
         let archive_size = reader.archive_size();
         let reader = LocalDynamicReadAt::new(reader);
 
-        let decoder = Accessor::new(reader, archive_size).await?;
+        let decoder = Accessor::new(reader, archive_size, None).await?;
         let root = decoder.open_root().await?;
         let path = OsStr::from_bytes(file_path).to_os_string();
         let file = root
diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs
index 84557bce1..11fb2b4cd 100644
--- a/src/api2/tape/restore.rs
+++ b/src/api2/tape/restore.rs
@@ -1069,7 +1069,7 @@ fn restore_snapshots_to_tmpdir(
                     "File {file_num}: snapshot archive {source_datastore}:{snapshot}",
                 );
 
-                let mut decoder = pxar::decoder::sync::Decoder::from_std(reader)?;
+                let mut decoder = pxar::decoder::sync::Decoder::from_std(reader, None)?;
 
                 let target_datastore = match store_map.target_store(&source_datastore) {
                     Some(datastore) => datastore,
@@ -1685,7 +1685,7 @@ fn restore_snapshot_archive<'a>(
     reader: Box<dyn 'a + TapeRead>,
     snapshot_path: &Path,
 ) -> Result<bool, Error> {
-    let mut decoder = pxar::decoder::sync::Decoder::from_std(reader)?;
+    let mut decoder = pxar::decoder::sync::Decoder::from_std(reader, None)?;
     match try_restore_snapshot_archive(worker, &mut decoder, snapshot_path) {
         Ok(_) => Ok(true),
         Err(err) => {
diff --git a/src/bin/proxmox_backup_debug/diff.rs b/src/bin/proxmox_backup_debug/diff.rs
index 5b68941a4..140c573c1 100644
--- a/src/bin/proxmox_backup_debug/diff.rs
+++ b/src/bin/proxmox_backup_debug/diff.rs
@@ -277,7 +277,7 @@ async fn open_dynamic_index(
     let reader = BufferedDynamicReader::new(index, chunk_reader);
     let archive_size = reader.archive_size();
     let reader: Arc<dyn ReadAt + Send + Sync> = Arc::new(LocalDynamicReadAt::new(reader));
-    let accessor = Accessor::new(reader, archive_size).await?;
+    let accessor = Accessor::new(reader, archive_size, None).await?;
 
     Ok((lookup_index, accessor))
 }
diff --git a/src/tape/file_formats/snapshot_archive.rs b/src/tape/file_formats/snapshot_archive.rs
index 252384b50..43d1cf9c3 100644
--- a/src/tape/file_formats/snapshot_archive.rs
+++ b/src/tape/file_formats/snapshot_archive.rs
@@ -59,7 +59,7 @@ pub fn tape_write_snapshot_archive<'a>(
         }
 
         let mut encoder =
-            pxar::encoder::sync::Encoder::new(PxarTapeWriter::new(writer), &root_metadata)?;
+            pxar::encoder::sync::Encoder::new(PxarTapeWriter::new(writer), &root_metadata, None)?;
 
         for filename in file_list.iter() {
             let mut file = snapshot_reader.open_file(filename).map_err(|err| {
@@ -89,6 +89,7 @@ pub fn tape_write_snapshot_archive<'a>(
             }
         }
         encoder.finish()?;
+        encoder.close()?;
         Ok(())
     });
 
-- 
2.39.2



_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


  parent reply	other threads:[~2024-04-29 12:11 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-29 12:10 [pbs-devel] [PATCH v4 pxar proxmox-backup 00/58] fix #3174: improve file-level backup Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 01/58] format/examples: add header type `PXAR_PAYLOAD_REF` Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 02/58] decoder: add method to read payload references Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 03/58] decoder: factor out skip part from skip_entry Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 04/58] encoder: add optional output writer for file payloads Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 05/58] encoder: move to stack based state tracking Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 06/58] decoder/accessor: add optional payload input stream Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 07/58] decoder: set payload input range when decoding via accessor Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 08/58] encoder: add payload reference capability Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 09/58] encoder: add payload position capability Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 10/58] encoder: add payload advance capability Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 11/58] encoder/format: finish payload stream with marker Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 12/58] format: add payload stream start marker Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 13/58] format/encoder/decoder: new pxar entry type `Version` Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 pxar 14/58] format/encoder/decoder: new pxar entry type `Prelude` Christian Ebner
2024-04-29 12:10 ` Christian Ebner [this message]
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 16/58] client: backup: factor out extension from backup target Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 17/58] client: pxar: combine writers into struct Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 18/58] client: pxar: add optional pxar payload writer instance Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 19/58] client: pxar: optionally split metadata and payload streams Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 20/58] client: helper: add helpers for creating reader instances Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 21/58] client: helper: add method for split archive name mapping Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 22/58] client: restore: read payload from dedicated index Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 23/58] tools: cover extension for split pxar archives Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 24/58] restore: " Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 25/58] client: mount: make split pxar archives mountable Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 26/58] api: datastore: refactor getting local chunk reader Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 27/58] api: datastore: attach optional payload " Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 28/58] catalog: shell: make split pxar archives accessible Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 29/58] www: cover metadata extension for pxar archives Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 30/58] file restore: factor out getting pxar reader Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 31/58] file restore: cover split metadata and payload archives Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 32/58] file restore: show more error context when extraction fails Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 33/58] pxar: add optional payload input for achive restore Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 34/58] pxar: add more context to extraction error Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 35/58] client: pxar: include payload offset in entry listing Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 36/58] pxar: show padding in debug output on archive list Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 37/58] datastore: dynamic index: add method to get digest Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 38/58] client: pxar: helper for lookup of reusable dynamic entries Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 39/58] upload stream: implement reused chunk injector Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 40/58] client: chunk stream: add struct to hold injection state Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 41/58] client: streams: add channels for dynamic entry injection Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 42/58] specs: add backup detection mode specification Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 43/58] client: implement prepare reference method Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 44/58] client: pxar: add method for metadata comparison Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 45/58] pxar: caching: add look-ahead cache types Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 46/58] fix #3174: client: pxar: enable caching and meta comparison Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 47/58] client: backup writer: add injected chunk count to stats Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 48/58] pxar: create: keep track of reused chunks and files Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 49/58] pxar: create: show chunk injection stats debug output Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 50/58] client: pxar: add helper to handle optional preludes Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 51/58] client: pxar: opt encode cli exclude patterns as Prelude Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 52/58] docs: file formats: describe split pxar archive file layout Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 53/58] docs: add section describing change detection mode Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 54/58] test-suite: add detection mode change benchmark Christian Ebner
2024-04-29 12:10 ` [pbs-devel] [PATCH v4 proxmox-backup 55/58] test-suite: add bin to deb, add shell completions Christian Ebner
2024-04-29 12:11 ` [pbs-devel] [PATCH v4 proxmox-backup 56/58] datastore: chunker: add Chunker trait Christian Ebner
2024-04-29 12:11 ` [pbs-devel] [PATCH v4 proxmox-backup 57/58] datastore: chunker: implement chunker for payload stream Christian Ebner
2024-04-29 12:11 ` [pbs-devel] [PATCH v4 proxmox-backup 58/58] client: chunk stream: switch payload stream chunker Christian Ebner
2024-05-07 16:00 ` [pbs-devel] [PATCH v4 pxar proxmox-backup 00/58] fix #3174: improve file-level backup Christian Ebner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240429121102.315059-16-c.ebner@proxmox.com \
    --to=c.ebner@proxmox.com \
    --cc=pbs-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal