From: Stefan Reiter <s.reiter@proxmox.com>
To: Wolfgang Bumiller <w.bumiller@proxmox.com>
Cc: pbs-devel@lists.proxmox.com
Subject: Re: [pbs-devel] [PATCH v2 pxar 01/20] decoder/aio: add contents() and content_size() calls
Date: Thu, 25 Mar 2021 10:23:59 +0100 [thread overview]
Message-ID: <b181367c-1871-2b1f-5f8a-90b3485b3ef4@proxmox.com> (raw)
In-Reply-To: <20210325090836.r662otu4kyc4mokp@wobu-vie.proxmox.com>
On 3/25/21 10:08 AM, Wolfgang Bumiller wrote:
> On Wed, Mar 24, 2021 at 04:18:08PM +0100, Stefan Reiter wrote:
>> Returns a decoder::Contents without a wrapper type, since in this case
>> we don't want to hide the SeqRead implementation (as done in
>> decoder::sync). For conviencience also implement AsyncRead if "tokio-io"
>> is enabled.
>>
>> Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
>> ---
>>
>> proxmox-backup requires a dependency bump on this!
>>
>> v2:
>> * make contents() call available without tokio-io feature
>> * drop peek() implementation
>>
>> src/decoder/aio.rs | 36 +++++++++++++++++++++++++++++++++++-
>> 1 file changed, 35 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/decoder/aio.rs b/src/decoder/aio.rs
>> index 82030b0..ee4d51f 100644
>> --- a/src/decoder/aio.rs
>> +++ b/src/decoder/aio.rs
>> @@ -5,7 +5,7 @@ use std::io;
>> #[cfg(feature = "tokio-fs")]
>> use std::path::Path;
>>
>> -use crate::decoder::{self, SeqRead};
>> +use crate::decoder::{self, Contents, SeqRead};
>> use crate::Entry;
>>
>> /// Asynchronous `pxar` decoder.
>> @@ -56,6 +56,16 @@ impl<T: SeqRead> Decoder<T> {
>> self.inner.next_do().await.transpose()
>> }
>>
>> + /// Get a reader for the contents of the current entry, if the entry has contents.
>> + pub fn contents(&mut self) -> Option<Contents<T>> {
>> + self.inner.content_reader()
>> + }
>> +
>> + /// Get the size of the current contents, if the entry has contents.
>> + pub fn content_size(&self) -> Option<u64> {
>> + self.inner.content_size()
>> + }
>> +
>> /// Include goodbye tables in iteration.
>> pub fn enable_goodbye_entries(&mut self, on: bool) {
>> self.inner.with_goodbye_tables = on;
>> @@ -67,6 +77,7 @@ mod tok {
>> use std::io;
>> use std::pin::Pin;
>> use std::task::{Context, Poll};
>> + use crate::decoder::{Contents, SeqRead};
>>
>> /// Read adapter for `futures::io::AsyncRead`
>> pub struct TokioReader<T> {
>> @@ -93,6 +104,29 @@ mod tok {
>> }
>> }
>> }
>> +
>> + impl<'a, T: crate::decoder::SeqRead> tokio::io::AsyncRead for Contents<'a, T> {
>> + fn poll_read(
>> + self: Pin<&mut Self>,
>> + cx: &mut Context<'_>,
>> + buf: &mut tokio::io::ReadBuf<'_>,
>> + ) -> Poll<io::Result<()>> {
>> + unsafe {
>> + // Safety: poll_seq_read will *probably* only write to the buffer, so we don't
>> + // initialize it first, instead we treat is a &[u8] immediately and uphold the
>> + // ReadBuf invariants in the conditional below.
>> + let write_buf =
>> + &mut *(buf.unfilled_mut() as *mut [std::mem::MaybeUninit<u8>] as *mut [u8]);
>> + let result = self.poll_seq_read(cx, write_buf);
>> + if let Poll::Ready(Ok(n)) = result {
>> + // if we've written data, advance both initialized and filled bytes cursor
>> + buf.assume_init(buf.filled().len() + n);
>> + buf.advance(n);
>
> The differences here look fishy. The docs about `assume_init()` say it
> marks the "first `n` *unfilled* bytes`, so IMO both calls should use
> just `n` as they both start from the beginning of the unfilled range?
>
Hm, you're right:
https://docs.rs/tokio/1.4.0/src/tokio/io/read_buf.rs.html#240
That doc is a bit confusing IMO...
>> + }
>> + result.map(|_| Ok(()))
>> + }
>> + }
>> + }
>> }
>>
>> #[cfg(feature = "tokio-io")]
>> --
>> 2.20.1
next prev parent reply other threads:[~2021-03-25 9:24 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-24 15:18 [pbs-devel] [PATCH v2 00/20] Single file restore for VM images Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 pxar 01/20] decoder/aio: add contents() and content_size() calls Stefan Reiter
2021-03-25 9:08 ` Wolfgang Bumiller
2021-03-25 9:23 ` Stefan Reiter [this message]
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 02/20] vsock_client: remove wrong comment Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 03/20] vsock_client: remove some &mut restrictions and rustfmt Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 04/20] vsock_client: support authorization header Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 05/20] proxmox_client_tools: move common key related functions to key_source.rs Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 06/20] file-restore: add binary and basic commands Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 07/20] file-restore: allow specifying output-format Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 08/20] server/rest: extract auth to seperate module Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 09/20] server/rest: add ApiAuth trait to make user auth generic Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 10/20] file-restore-daemon: add binary with virtio-vsock API server Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 11/20] file-restore-daemon: add watchdog module Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 12/20] file-restore-daemon: add disk module Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 13/20] add tools/cpio encoding module Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 14/20] file-restore: add qemu-helper setuid binary Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 15/20] file-restore: add basic VM/block device support Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 16/20] debian/client: add postinst hook to rebuild file-restore initramfs Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 17/20] file-restore(-daemon): implement list API Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 18/20] pxar/extract: add sequential variant to extract_sub_dir Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 19/20] tools/zip: add zip_directory helper Stefan Reiter
2021-03-24 15:18 ` [pbs-devel] [PATCH v2 proxmox-backup 20/20] file-restore: add 'extract' command for VM file restore Stefan Reiter
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=b181367c-1871-2b1f-5f8a-90b3485b3ef4@proxmox.com \
--to=s.reiter@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
--cc=w.bumiller@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.