Rewrite libguestfs-supermin-helper in C.
authorRichard Jones <rjones@redhat.com>
Fri, 12 Mar 2010 16:20:31 +0000 (16:20 +0000)
committerRichard Jones <rjones@redhat.com>
Fri, 12 Mar 2010 16:21:58 +0000 (16:21 +0000)
commitcb9613b993792c1c4b14fa0d9b5001ff644ac2f4
treef1a91e4082b11a89c79897d52774c4effa7bd0dc
parent891aac7a0c35eb25f853c3960eadf8f1f22ca60b
Rewrite libguestfs-supermin-helper in C.

libguestfs-supermin-helper was previously a shell script.  Although
we had steadily optimized it, there were a number of intractable
hot spots:

  (1) cpio still reads input files in 512 byte chunks; this is *very*
    pessimal behaviour, particularly when SELinux is enabled.
  (2) the hostfiles globbing was done very inefficiently by the shell,
    with the shell rereading the same directory over and over again.

This is a rewrite of this shell script in C.  It is approximately
3 times faster without SELinux, and has an even greater speed difference
with SELinux.

The main features are:

  (a) It never frees memory, making it simpler.  The program is designed
    to run and exit in sub-second times, so this is acceptable.
  (b) It caches directory reads, making the globbing of host files much
    faster (measured this as ~ 4 x speed up).
  (c) It doesn't use external cpio, but instead contains code to write
    newc format cpio files, which is all that the kernel can read.  Unlike
    cpio, this code uses large buffers for reads and writes.
  (d) Ignores missing or unreadable hostfiles, whereas cpio gave a
    warning.
  (e) Checks all return values from system calls.
  (f) With --verbose flag, it will print messages timing itself.

This passes all tests.

Updated with feedback from Jim Meyering.
.gitignore
appliance/Makefile.am
appliance/libguestfs-supermin-helper [deleted file]
appliance/libguestfs-supermin-helper.c [new file with mode: 0644]
bootstrap
m4/.gitignore
po/POTFILES.in
src/Makefile.am
src/guestfs.c