[Libguestfs] [PATCH nbdkit] New filter: gzip

Richard W.M. Jones rjones at redhat.com
Fri Jul 10 16:07:41 UTC 2020


On Fri, Jul 10, 2020 at 09:20:29AM -0500, Eric Blake wrote:
> >+++ b/filters/tar/nbdkit-tar-filter.pod
> >@@ -42,11 +42,13 @@ server use:
> >   nbdkit -r curl https://example.com/file.tar \
> >          --filter=tar tar-entry=disk.img
> >-=head2 Open an xz-compressed tar file (read-only)
> >+=head2 Open an gzip-compressed tar file (read-only)
> 
> Should this heading s/gzip-// ?

Yes that's a mistake - fixed.

> >+++ b/tests/Makefile.am
> >@@ -557,23 +557,6 @@ EXTRA_DIST += test-floppy.sh
> >  TESTS += test-full.sh
> >  EXTRA_DIST += test-full.sh
> >-# gzip plugin test.
> >-if HAVE_MKE2FS_WITH_D
> >-if HAVE_ZLIB
> >-LIBGUESTFS_TESTS += test-gzip
> >-check_DATA += disk.gz
> >-CLEANFILES += disk.gz
> 
> Is it worth keeping this around until we actually retire the plugin?

OK I'll extend the test so it tests both.

> >+  /* Get the size of the underlying plugin. */
> >+  compressed_size = next_ops->get_size (nxdata);
> 
> If we wanted, we could save this...
> 
> 
> >+/* Similar to above, whatever the plugin says, extents are not
> >+ * supported.
> >+ */
> >+static int
> >+gzip_can_extents (struct nbdkit_next_ops *next_ops, void *nxdata,
> >+                  void *handle)
> 
> Well, since we stored it as a temp file, we could actually report
> extents off of lseek(SEEK_HOLE).  But that can be added separately,
> if we want it (it goes back to your notion of a library for
> file-based accessor functions).

Sounds tricky :-)

> >+  /* We must call underlying get_size even though we don't use the
> >+   * result, because it caches the plugin size in server/backend.c.
> >+   */
> >+  if (next_ops->get_size (nxdata) == -1)
> >+    return -1;
> 
> ...and verify here that the underlying plugin isn't changing size.
> But probably not necessary.

I added the test anyway because it's easy to do.

> With the tar filter, you HAD to call next_ops->get_size() per
> connection, because you called next_ops->pread() per connection.
> But with this filter, you don't actually have to call
> next_ops->get_size(), because your only use of next_ops->pread() is
> during the initial decompression, and the rest of this filter reads
> from local cache rather than deferring to the plugin.

Good point.

Thanks,

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html




More information about the Libguestfs mailing list