[libvirt] [PATCH v3 RESEND] vhost-user: add support reconnect for vhost-user ports

Michal Privoznik mprivozn at redhat.com
Fri Oct 27 12:39:14 UTC 2017


On 10/09/2017 02:19 AM, ZhiPeng Lu wrote:
> For vhost-user ports, Open vSwitch acts as the server and QEMU the client.
> When OVS crashes or restarts, the QEMU process should be reconnected to
> OVS.
> 
> Signed-off-by: ZhiPeng Lu <lu.zhipeng at zte.com.cn>
> ---
>  docs/schemas/domaincommon.rng                      | 26 ++++++++------
>  src/conf/domain_conf.c                             | 40 ++++++++++++++++++----
>  src/conf/domain_conf.h                             | 10 +++---
>  src/qemu/qemu_command.c                            |  2 +-
>  src/qemu/qemu_domain.c                             |  2 +-
>  src/qemu/qemu_monitor_json.c                       |  2 +-
>  .../qemuxml2argv-net-vhostuser-multiq.args         |  4 +--
>  .../qemuxml2argv-net-vhostuser-multiq.xml          |  8 +++--
>  8 files changed, 65 insertions(+), 29 deletions(-)
> 
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 76852ab..3f4ed82 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -2327,6 +2327,18 @@
>        </attribute>
>      </optional>
>    </define>
> +  <define name="reconnect">
> +    <element name="reconnect">
> +      <attribute name="enabled">
> +        <ref name="virYesNo"/>
> +      </attribute>
> +      <optional>
> +        <attribute name="timeout">
> +          <ref name="unsignedInt"/>
> +        </attribute>
> +      </optional>
> +    </element>
> +  </define>
>  
>    <!--
>        An interface description can either be of type bridge in which case
> @@ -2388,6 +2400,9 @@
>                    <value>client</value>
>                  </choice>
>                </attribute>
> +              <optional>
> +                 <ref name="reconnect"/>
> +              </optional>

Misaligned.

>                <empty/>
>              </element>
>              <ref name="interface-options"/>
> @@ -3636,16 +3651,7 @@
>            </attribute>
>          </optional>
>          <optional>
> -          <element name="reconnect">
> -            <attribute name="enabled">
> -              <ref name="virYesNo"/>
> -            </attribute>
> -            <optional>
> -              <attribute name="timeout">
> -                <ref name="unsignedInt"/>
> -              </attribute>
> -            </optional>
> -          </element>
> +          <ref name="reconnect"/>
>          </optional>
>          <zeroOrMore>
>            <ref name='devSeclabel'/>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index cc5e79b..b7fc3a5 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -83,6 +83,13 @@ struct _virDomainXMLOption {
>      /* Private data for save image stored in snapshot XML */
>      virSaveCookieCallbacks saveCookie;
>  };
> +static int
> +virDomainDeviceSourceReconnectDefParseXML(virDomainDeviceSourceReconnectDefPtr def,
> +                                       xmlNodePtr node,
> +                                       xmlXPathContextPtr ctxt);
> +static void
> +virDomainDeviceSourceReconnectDefFormat(virBufferPtr buf,
> +                                     virDomainDeviceSourceReconnectDefPtr def);

We don't need these. Just move the function before their first call.

>  
>  #define VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS             \
>      (VIR_DOMAIN_DEF_FORMAT_SECURE |                    \
> @@ -10245,6 +10252,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
>      virNWFilterHashTablePtr filterparams = NULL;
>      virDomainActualNetDefPtr actual = NULL;
>      xmlNodePtr oldnode = ctxt->node;
> +    virDomainDeviceSourceReconnectDef reconnect = {0};
>      int rv, val;
>  
>      if (VIR_ALLOC(def) < 0)
> @@ -10331,6 +10339,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
>                  vhostuser_type = virXMLPropString(cur, "type");
>                  vhostuser_path = virXMLPropString(cur, "path");
>                  vhostuser_mode = virXMLPropString(cur, "mode");
> +                if (virDomainDeviceSourceReconnectDefParseXML(&reconnect, cur, ctxt) < 0)
> +                    goto error;
>              } else if (!def->virtPortProfile
>                         && virXMLNodeNameEqual(cur, "virtualport")) {
>                  if (def->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
> @@ -10552,8 +10562,17 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
>  
>          if (STREQ(vhostuser_mode, "server")) {
>              def->data.vhostuser->data.nix.listen = true;
> +            if (reconnect.enabled != VIR_TRISTATE_BOOL_ABSENT) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                               _("'reconnect' attribute  unsupported "
> +                                 "'server' mode for <interface type='vhostuser'>"));
> +                goto error;
> +           }
>          } else if (STREQ(vhostuser_mode, "client")) {
>              def->data.vhostuser->data.nix.listen = false;
> +            def->data.vhostuser->data.nix.reconnect.enabled = reconnect.enabled;
> +            def->data.vhostuser->data.nix.reconnect.timeout = reconnect.timeout;
> +            reconnect.enabled = VIR_TRISTATE_BOOL_ABSENT;

I'm not quite sure what is the purpose of this line.

>          } else {
>              virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>                             _("Wrong <source> 'mode' attribute "
> @@ -11216,7 +11235,7 @@ virDomainChrDefParseTargetXML(virDomainChrDefPtr def,
>  }
>  
>  static int
> -virDomainChrSourceReconnectDefParseXML(virDomainChrSourceReconnectDefPtr def,
> +virDomainDeviceSourceReconnectDefParseXML(virDomainDeviceSourceReconnectDefPtr def,
>                                         xmlNodePtr node,
>                                         xmlXPathContextPtr ctxt)

Again, misaligned. And I'm not quite sure why are you renaming
Reconnect? I mean, it is still related to ChrSource so I'd leave the
name be as is.

Michal




More information about the libvir-list mailing list