[libvirt] [PATCH 25/25] qemu: command: Add support for multi-host gluster disks

Prasanna Kalever pkalever at redhat.com
Tue Jul 26 11:51:37 UTC 2016


On Mon, Jul 25, 2016 at 11:42 PM, Peter Krempa <pkrempa at redhat.com> wrote:
> From: Prasanna Kumar Kalever <prasanna.kalever at redhat.com>
>
> To allow using failover with gluster it's necessary to specify multiple
> volume hosts. Add support for starting qemu with such configurations.
>
> Signed-off-by: Peter Krempa <pkrempa at redhat.com>
> ---
>  docs/formatdomain.html.in                          |   2 +-
>  src/qemu/qemu_command.c                            | 102 +++++++++++++++++++++
>  .../qemuxml2argv-disk-drive-network-gluster.args   |   9 +-
>  .../qemuxml2argv-disk-drive-network-gluster.xml    |   9 ++
>  .../qemuxml2xmlout-disk-drive-network-gluster.xml  |  10 ++
>  5 files changed, 130 insertions(+), 2 deletions(-)
>
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 59a8bb9..8efd6af 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -2280,7 +2280,7 @@
>                <tr>
>                  <td> gluster </td>
>                  <td> a server running glusterd daemon </td>
> -                <td> only one </td>
> +                <td> one or more (<span class="since">Since 2.1.0</span>), just one prior to that </td>
>                  <td> 24007 </td>
>                </tr>
>              </table>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 5a5df7d..5a50fa1 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -689,6 +689,101 @@ qemuBuildRBDSecinfoURI(virBufferPtr buf,
>
>
>  #define QEMU_DEFAULT_NBD_PORT "10809"
> +#define QEMU_DEFAULT_GLUSTER_PORT "24007"
> +
> +/* builds the hosts array */
> +static virJSONValuePtr
> +qemuBuildGlusterDriveJSONHosts(virStorageSourcePtr src)
> +{
> +    virJSONValuePtr servers = NULL;
> +    virJSONValuePtr server = NULL;
> +    virJSONValuePtr ret = NULL;
> +    virStorageNetHostDefPtr host;
> +    const char *transport;
> +    const char *portstr;
> +    size_t i;
> +
> +    if (!(servers = virJSONValueNewArray()))
> +        goto cleanup;
> +
> +    for (i = 0; i < src->nhosts; i++) {
> +        host = src->hosts + i;
> +        transport = virStorageNetHostTransportTypeToString(host->transport);
> +        portstr = host->port;
> +
> +        if (virJSONValueObjectCreate(&server, "s:type", transport, NULL) < 0)
> +            goto cleanup;
> +
> +        if (!portstr)
> +            portstr = QEMU_DEFAULT_GLUSTER_PORT;
> +
> +        switch ((virStorageNetHostTransport) host->transport) {
> +        case VIR_STORAGE_NET_HOST_TRANS_TCP:
> +            if (virJSONValueObjectAdd(server,
> +                                      "s:host", host->name,
> +                                      "s:port", portstr,
> +                                      NULL) < 0)
> +                goto cleanup;
> +            break;
> +
> +        case VIR_STORAGE_NET_HOST_TRANS_UNIX:
> +            if (virJSONValueObjectAdd(server,
> +                                      "s:socket", host->socket,
> +                                      NULL) < 0)
> +                goto cleanup;
> +            break;
> +
> +        case VIR_STORAGE_NET_HOST_TRANS_RDMA:
> +        case VIR_STORAGE_NET_HOST_TRANS_LAST:
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("transport protocol '%s' is not yet supported"),
> +                           transport);
> +            goto cleanup;
> +        }
> +
> +        if (virJSONValueArrayAppend(servers, server) < 0)
> +            goto cleanup;
> +
> +        server = NULL;
> +    }
> +
> +    ret = servers;
> +    servers = NULL;
> +
> + cleanup:
> +    virJSONValueFree(servers);
> +    virJSONValueFree(server);
> +
> +    return ret;
> +}
> +
> +
> +static virJSONValuePtr
> +qemuBuildGlusterDriveJSON(virStorageSourcePtr src)
> +{
> +    const char *protocol = virStorageNetProtocolTypeToString(src->protocol);
> +    virJSONValuePtr servers = NULL;
> +    virJSONValuePtr ret = NULL;
> +
> +    if (!(servers = qemuBuildGlusterDriveJSONHosts(src)))
> +        return NULL;
> +
> +     /* { driver:"gluster",
> +      *   volume:"testvol",
> +      *   path:"/a.img",
> +      *    server :[{type:"tcp", host:"1.2.3.4", port:24007},
> +      *             {type:"unix", socket:"/tmp/glusterd.socket"}, ...],
> +      *    driver:"qcow2" }
> +      */
> +    if (virJSONValueObjectCreate(&ret,
> +                                 "s:driver", protocol,
> +                                 "s:volume", src->volume,
> +                                 "s:path", src->path,
> +                                 "a:server", servers, NULL) < 0)
> +          virJSONValueFree(servers);
> +
> +    return ret;
> +}
>
>
>  static char *
> @@ -932,7 +1027,14 @@ qemuGetDriveSourceProps(virStorageSourcePtr src,
>      case VIR_STORAGE_TYPE_VOLUME:
>      case VIR_STORAGE_TYPE_NONE:
>      case VIR_STORAGE_TYPE_LAST:
> +        break;
> +
>      case VIR_STORAGE_TYPE_NETWORK:
> +        if (src->protocol == VIR_STORAGE_NET_PROTOCOL_GLUSTER &&
> +            src->nhosts > 1) {
> +            if (!(fileprops = qemuBuildGlusterDriveJSON(src)) < 0)

ouch!
comparing boolean result with constant 0

--
Prasanna

> +                return -1;
> +        }
>          break;
>      }
>
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.args
> index 5668f15..634ed75 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.args
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.args
> @@ -24,4 +24,11 @@ id=virtio-disk0 \
>  -drive 'file=gluster+unix:///Volume2/Image?socket=/path/to/sock,format=raw,\
>  if=none,id=drive-virtio-disk1' \
>  -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk1,\
> -id=virtio-disk1
> +id=virtio-disk1 \
> +-drive file.driver=gluster,file.volume=Volume3,file.path=/Image.qcow2,\
> +file.server.0.type=tcp,file.server.0.host=example.org,file.server.0.port=6000,\
> +file.server.1.type=tcp,file.server.1.host=example.org,file.server.1.port=24007,\
> +file.server.2.type=unix,file.server.2.socket=/path/to/sock,format=qcow2,\
> +if=none,id=drive-virtio-disk2 \
> +-device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk2,\
> +id=virtio-disk2
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.xml
> index 0c66e7f..ef30e8c 100644
> --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.xml
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-gluster.xml
> @@ -28,6 +28,15 @@
>        </source>
>        <target dev='vdb' bus='virtio'/>
>      </disk>
> +    <disk type='network' device='disk'>
> +      <driver name='qemu' type='qcow2'/>
> +      <source protocol='gluster' name='Volume3/Image.qcow2'>
> +        <host name='example.org' port='6000'/>
> +        <host name='example.org'/>
> +        <host transport='unix' socket='/path/to/sock'/>
> +      </source>
> +      <target dev='vdc' bus='virtio'/>
> +    </disk>
>      <controller type='usb' index='0'/>
>      <controller type='pci' index='0' model='pci-root'/>
>      <input type='mouse' bus='ps2'/>
> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-gluster.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-gluster.xml
> index 160fd9d..8e0add5 100644
> --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-gluster.xml
> +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-network-gluster.xml
> @@ -30,6 +30,16 @@
>        <target dev='vdb' bus='virtio'/>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
>      </disk>
> +    <disk type='network' device='disk'>
> +      <driver name='qemu' type='qcow2'/>
> +      <source protocol='gluster' name='Volume3/Image.qcow2'>
> +        <host name='example.org' port='6000'/>
> +        <host name='example.org'/>
> +        <host transport='unix' socket='/path/to/sock'/>
> +      </source>
> +      <target dev='vdc' bus='virtio'/>
> +      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
> +    </disk>
>      <controller type='usb' index='0'>
>        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
>      </controller>
> --
> 2.9.0
>




More information about the libvir-list mailing list