[libvirt] [PATCH 1/2] qemu: Allow saving QEMU libvirt state to a pipe

Chen Hanxiao chen_han_xiao at 126.com
Thu Dec 8 14:19:35 UTC 2016



At 2016-12-08 20:08:11, "Peter Krempa" <pkrempa at redhat.com> wrote:
>On Sat, Dec 03, 2016 at 17:45:47 +0800, Chen Hanxiao wrote:
>> From: Chen Hanxiao <chenhanxiao at gmail.com>
>> 
>> Base upon patches from Roy Keene <rkeene at knightpoint.com>
>> 
>> Currently qemuDomainSaveMemory can save vm's config
>> and memory to fd.
>> It writes a magic QEMU_SAVE_PARTIAL firstly,
>> then re-open it to change QEMU_SAVE_PARTIAL as QEMU_SAVE_MAGIC
>> after a success write.
>> 
>> For pipes this is not possible, attempting to re-open the pipe
>> will not connect you to the same consumer.
>> Seeking is also not possible on a pipe.
>> 
>> This patch introduce VIR_DOMAIN_SAVE_PIPE.
>> If set, write QEMU_SAVE_MAGIC directly.
>> Try to write a regular file with VIR_DOMAIN_SAVE_PIPE
>> is not supportted.
>> 
>> This is useful to me for saving a VM state directly to
>> Ceph RBD images without having an intermediate file.
>> 
>> Cc: Roy Keene <rkeene at knightpoint.com>
>> Signed-off-by: Chen Hanxiao <chenhanxiao at gmail.com>
>> ---
>>  include/libvirt/libvirt-domain.h |  1 +
>>  src/qemu/qemu_driver.c           | 71 ++++++++++++++++++++++++++++++----------
>>  2 files changed, 54 insertions(+), 18 deletions(-)
>> 
>> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
>> index a8435ab..c3e4c15 100644
>> --- a/include/libvirt/libvirt-domain.h
>> +++ b/include/libvirt/libvirt-domain.h
>> @@ -1169,6 +1169,7 @@ typedef enum {
>>      VIR_DOMAIN_SAVE_BYPASS_CACHE = 1 << 0, /* Avoid file system cache pollution */
>>      VIR_DOMAIN_SAVE_RUNNING      = 1 << 1, /* Favor running over paused */
>>      VIR_DOMAIN_SAVE_PAUSED       = 1 << 2, /* Favor paused over running */
>> +    VIR_DOMAIN_SAVE_PIPE         = 1 << 3, /* Output is a pipe */
>
>It doesn't have necessarily to be a pipe.

We need a flag to specify that
we need to write QEMU_SAVE_MAGIC directly.
Any suggestion for the name of this flag?

>
>>  } virDomainSaveRestoreFlags;
>>  
>>  int                     virDomainSave           (virDomainPtr domain,
[snip]
>> +
>> +    /*
>> +     * Determine if this file is a PIPE, which could not be reopen.
>> +     */
>> +    if (virFileExists(path)) {
>> +        fd = qemuOpenFile(driver, vm, path, O_RDONLY | O_NONBLOCK, NULL, NULL);
>> +        if (fd < 0)
>> +            goto cleanup;
>> +        if (fstat(fd, &statbuf) < 0)
>> +            goto cleanup;
>> +        if (S_ISFIFO(statbuf.st_mode)) {
>
>You should not try to check this. If the user wishes to write the
>complete header right away, then we should obey it and not have to check
>prior to do so.

My concern is that
when we write to a pipe/fifo, if no one read it, we will hang.
We should prevent from doing this
only when we specify a flag.

Regards,
- Chen
>
>> +            if (flags & VIR_DOMAIN_SAVE_PIPE) {
>> +                canReopen = false;
>> +            } else {
>> +                virReportSystemError(EINVAL, _("%s is not PIPE"), path);
>> +                goto cleanup;
>> +            }
>> +        }
>> +        VIR_FORCE_CLOSE(fd);
>> +    }
>> +
>>      fd = qemuOpenFile(driver, vm, path,
>>                        O_WRONLY | O_TRUNC | O_CREAT | directFlag,
>>                        &needUnlink, &bypassSecurityDriver);




More information about the libvir-list mailing list