[libvirt] [PATCH v4 1/4] util: change the virStorageNetHostDef type
Prasanna Kalever
pkalever at redhat.com
Mon Dec 12 14:24:47 UTC 2016
On Wed, Dec 7, 2016 at 7:31 PM, Peter Krempa <pkrempa at redhat.com> wrote:
> On Tue, Dec 06, 2016 at 22:51:58 +0530, Prasanna Kumar Kalever wrote:
>> Currently, the Host object looks like
>>
>> struct _virStorageNetHostDef {
>> char *name;
>> char *port;
>> int transport; /* virStorageNetHostTransport */
>> char *socket; /* path to unix socket */
>> }
>>
>> We don't actually need a 'name' and 'port' if the transport type is unix
>> domain sockets, and if the transport is inet tcp/rdma we don't actually
>> care for socket path.
>>
>> With a simple union discrimination we can make this much better
>>
>> struct _virStorageNetHostUnixSockAddr {
>> char *path;
>> };
>>
>> struct _virStorageNetHostInetSockAddr {
>> char *addr;
>> char *port;
>> };
>>
>> struct _virStorageNetHostDef {
>> virStorageNetHostTransport type;
>> union { /* union tag is @type */
>> virStorageNetHostUnixSockAddr uds;
>> virStorageNetHostInetSockAddr inet;
>> } u;
>> };
>
> I'm not really persuaded that this is much better than the current
> state. Data-wise you save one char *. Code wise you add the complexity
> of accessing the enum everywhere.
>
>>
>> This patch performs the required changes in transforming _virStorageNetHostDef
>> to fit union discrimination.
>
> On a machine with xen installed this fails to compile:
>
> xenconfig/xen_xl.c: In function 'xenFormatXLDiskSrcNet':
> xenconfig/xen_xl.c:954:41: error: 'virStorageNetHostDef {aka struct _virStorageNetHostDef}' has no member named 'name'
> if (strchr(src->hosts[i].name, ':'))
> ^
> xenconfig/xen_xl.c:956:50: error: 'virStorageNetHostDef {aka struct _virStorageNetHostDef}' has no member named 'name'
> src->hosts[i].name);
> ^
> xenconfig/xen_xl.c:958:64: error: 'virStorageNetHostDef {aka struct _virStorageNetHostDef}' has no member named 'name'
> virBufferAsprintf(&buf, "%s", src->hosts[i].name);
> ^
> xenconfig/xen_xl.c:960:34: error: 'virStorageNetHostDef {aka struct _virStorageNetHostDef}' has no member named 'port'
> if (src->hosts[i].port)
> ^
> xenconfig/xen_xl.c:961:69: error: 'virStorageNetHostDef {aka struct _virStorageNetHostDef}' has no member named 'port'
> virBufferAsprintf(&buf, "\\\\:%s", src->hosts[i].port);
>
> I suspect there are more than just these in other hypervisor drivers.
HUhhh...
How to make sure that I have covered all the drivers ?
Any long list of all drivers in libvirt or config to compile all the modules ?
Thanks,
--
Prasanna
>
> As said. I'm not a fan of this change. If you want to continue doing
> this, please make sure that you install all VM drivers so that you
> change all the appropriate places.
>
> Also please make sure to use a switch statement in appropriate places as
> described below.
>
>> Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever at redhat.com>
>> ---
>> src/conf/domain_conf.c | 52 +++++++++++----------
>> src/qemu/qemu_command.c | 68 ++++++++++++++--------------
>> src/qemu/qemu_parse_command.c | 44 +++++++++---------
>> src/storage/storage_backend_gluster.c | 21 ++++-----
>> src/storage/storage_driver.c | 7 ++-
>> src/util/virstoragefile.c | 85 ++++++++++++++++++-----------------
>> src/util/virstoragefile.h | 20 +++++++--
>> tests/virstoragetest.c | 2 +-
>> 8 files changed, 160 insertions(+), 139 deletions(-)
>>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 0e879e1..20d4d01 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -5967,6 +5967,7 @@ virDomainStorageHostParse(xmlNodePtr node,
>> int ret = -1;
>> xmlNodePtr child;
>> char *transport = NULL;
>> + char *socket = NULL;
>> virStorageNetHostDef host;
>>
>> memset(&host, 0, sizeof(host));
>> @@ -5976,12 +5977,13 @@ virDomainStorageHostParse(xmlNodePtr node,
>> if (child->type == XML_ELEMENT_NODE &&
>> xmlStrEqual(child->name, BAD_CAST "host")) {
>>
>> - host.transport = VIR_STORAGE_NET_HOST_TRANS_TCP;
>> + host.type = VIR_STORAGE_NET_HOST_TRANS_TCP;
>>
>> /* transport can be tcp (default), unix or rdma. */
>> if ((transport = virXMLPropString(child, "transport"))) {
>> - host.transport = virStorageNetHostTransportTypeFromString(transport);
>> - if (host.transport < 0) {
>> + host.type = virStorageNetHostTransportTypeFromString(transport);
>> + if ((host.type < 0) ||
>> + (host.type >= VIR_STORAGE_NET_HOST_TRANS_LAST)) {
>
> Too many parentheses, the inner terms have the same operator priority as
> with the parentheses.
>
>> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> _("unknown protocol transport type '%s'"),
>> transport);
>
> [...]
>
>> @@ -20322,17 +20325,20 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf,
>>
>> for (n = 0; n < src->nhosts; n++) {
>> virBufferAddLit(buf, "<host");
>> - virBufferEscapeString(buf, " name='%s'",
>> - src->hosts[n].name);
>> - virBufferEscapeString(buf, " port='%s'",
>> - src->hosts[n].port);
>> + if (src->hosts[n].type != VIR_STORAGE_NET_HOST_TRANS_UNIX) {
>> + virBufferEscapeString(buf, " name='%s'",
>> + src->hosts[n].u.inet.addr);
>> + virBufferEscapeString(buf, " port='%s'",
>> + src->hosts[n].u.inet.port);
>> + }
>>
>> - if (src->hosts[n].transport)
>> + if (src->hosts[n].type)
>> virBufferAsprintf(buf, " transport='%s'",
>> - virStorageNetHostTransportTypeToString(src->hosts[n].transport));
>> + virStorageNetHostTransportTypeToString(src->hosts[n].type));
>>
>> - virBufferEscapeString(buf, " socket='%s'",
>> - src->hosts[n].socket);
>> + if (src->hosts[n].type == VIR_STORAGE_NET_HOST_TRANS_UNIX)
>> + virBufferEscapeString(buf, " socket='%s'",
>> + src->hosts[n].u.uds.path);
>>
>> virBufferAddLit(buf, "/>\n");
>
> You need to convert this hunk to use a switch, so the code is
> extensible.
>
>> }
>
> [...]
>
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index 6c457dd..fd62597 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -822,19 +822,18 @@ qemuBuildGlusterDriveJSONHosts(virStorageSourcePtr src)
>>
>> for (i = 0; i < src->nhosts; i++) {
>> host = src->hosts + i;
>> - transport = virStorageNetHostTransportTypeToString(host->transport);
>> - portstr = host->port;
>> + transport = virStorageNetHostTransportTypeToString(host->type);
>>
>> if (virJSONValueObjectCreate(&server, "s:type", transport, NULL) < 0)
>> goto cleanup;
>>
>> - if (!portstr)
>> - portstr = QEMU_DEFAULT_GLUSTER_PORT;
>> -
>> - switch ((virStorageNetHostTransport) host->transport) {
>> + switch ((virStorageNetHostTransport) host->type) {
>> case VIR_STORAGE_NET_HOST_TRANS_TCP:
>> + portstr = host->u.inet.port;
>> + if (!portstr)
>> + portstr = QEMU_DEFAULT_GLUSTER_PORT;
>
> Wrong indentation.
>
>> if (virJSONValueObjectAdd(server,
>> - "s:host", host->name,
>> + "s:host", host->u.inet.addr,
>> "s:port", portstr,
>> NULL) < 0)
>> goto cleanup;
>
> [...]
>
>> @@ -944,15 +943,16 @@ qemuBuildNetworkDriveURI(virStorageSourcePtr src,
>> }
>> }
>>
>> - if (src->hosts->socket &&
>> - virAsprintf(&uri->query, "socket=%s", src->hosts->socket) < 0)
>> + if ((src->hosts->type == VIR_STORAGE_NET_HOST_TRANS_UNIX) &&
>> + (virAsprintf(&uri->query, "socket=%s", src->hosts->u.uds.path) < 0))
>> goto cleanup;
>>
>> if (qemuBuildGeneralSecinfoURI(uri, secinfo) < 0)
>> goto cleanup;
>>
>> - if (VIR_STRDUP(uri->server, src->hosts->name) < 0)
>> - goto cleanup;
>> + if (src->hosts->type != VIR_STORAGE_NET_HOST_TRANS_UNIX)
>> + if (VIR_STRDUP(uri->server, src->hosts->u.inet.addr) < 0)
>> + goto cleanup;
>
> This also should be converted to a switch.
>
>>
>> ret = virURIFormat(uri);
>>
> [...]
>
>> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
>> index 1011bd0..900a801 100644
>> --- a/src/util/virstoragefile.c
>> +++ b/src/util/virstoragefile.c
>> @@ -1603,9 +1603,12 @@ virStorageNetHostDefClear(virStorageNetHostDefPtr def)
>> if (!def)
>> return;
>>
>> - VIR_FREE(def->name);
>> - VIR_FREE(def->port);
>> - VIR_FREE(def->socket);
>> + if (def->type == VIR_STORAGE_NET_HOST_TRANS_UNIX) {
>
> This is not extensible. Use switch and typecast if def->type is not of
> the correct type.
>
>> + VIR_FREE(def->u.uds.path);
>> + } else {
>> + VIR_FREE(def->u.inet.addr);
>> + VIR_FREE(def->u.inet.port);
>> + }
>> }
>>
>>
>> @@ -1643,6 +1646,9 @@ virStorageNetHostDefCopy(size_t nhosts,
>> virStorageNetHostDefPtr ret = NULL;
>> size_t i;
>>
>> + if (!hosts)
>> + return NULL;
>> +
>
> This change is not relevant to the rest of the patch.
>
>> if (VIR_ALLOC_N(ret, nhosts) < 0)
>> goto error;
>>
>
>> @@ -1669,7 +1676,6 @@ virStorageNetHostDefCopy(size_t nhosts,
>> return NULL;
>> }
>>
>> -
>
> Spurious whitespace change.
>
>> void
>> virStorageAuthDefFree(virStorageAuthDefPtr authdef)
>> {
More information about the libvir-list
mailing list