[libvirt] [PATCH] qemu: enable direct migration over IPv6
Ján Tomko
jtomko at redhat.com
Fri Mar 1 12:28:00 UTC 2013
(Replying to myself to correct some mistakes)
On 02/26/13 11:56, Ján Tomko wrote:
> On 02/19/13 17:36, John Ferlan wrote:
>> On 02/15/2013 05:13 AM, Peter Krempa wrote:
>>> On 02/15/13 11:00, Ján Tomko wrote:
>>>> }
>>>> }
>>>>
>>>> + if (getaddrinfo(hostname, NULL, NULL, &info)) {
>>>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("unable to get address info for %s"),
>>>> hostname);
>>>> + goto cleanup;
>>>
>>> Isn't there a possibility to fall back on IPv4 if this fails to minimize
>>> the chance of regressing?
>>>
>>
>> Yeah - this is tricky for some of the reasons I listed above. It seems
>> we need a way to tell or force the target qemu to use one family style
>> over the other because that's what the source resolved to using.
>
> Qemu does support ipv4 or ipv6 flags for hostnames. From a quick glance
> at the git history it seems it always has. Maybe we could always add the
> address family option to the migration URI to force this?
Wrong. It does support these options in inet_listen/inet_connect
functions, but it only uses these for migration since 1.1. For
inet_listen we either pass :: or 0.0.0.0 so there is no need for these
flags and the connection on the source is made by libvirt
>
>>
>> Assuming I'm reading things correctly we are about to tell the target
>> qemu how to start and to listen over the "first" style of address we
>> found in the source hosts' list. The source connect will use that
>> uri_out to perform the migration. The issue I can see becomes what if
>> the target (for some reason) doesn't support/have/use the family that
>> the host found first? When it goes to start up a localhost port, it
>> will fail right? Then what?
>>
>
> No, the perform phase happens on the destination, but the result is
s/perform/prepare/
> still the same. If the families do not match (or they do match but they
> can't connect to each other via that family), migration will fail. Then
> the user either has to change the network configuration or specify the
> IP address directly.
>
...
>>>> + } else {
>>>> + snprintf(migrateFrom, sizeof(migrateFrom),
>>>> + "tcp:0.0.0.0:%d", this_port);
>>>
>>> I thing this would be doable. Just do IPv4 by default if the resolution
>>> fails.
>>>
>>
>> Hmm... which resolution fails do you mean? Perhaps the "feature" needs
>> to be set/check some field that says the target qemu wants/desires IPv6;
>> otherwise, always fall back to use IPv4.
>>
>
> If the hostname specified by the user can only be resolved on the
> source, migration still works, but erroring out on getaddrinfo failure
> would break it.
>
>
> We can definitely tell qemu to listen on v4/v6 if we received an IP
> address. As for hostnames, we can either guess it from how it resolves
> on the source, destination or get the input from the user. Maybe we
> could add a migration flag for this and add ipv4 or ipv6 option to the
> migration URI for qemu based on the presence/absence of this flag. Or
> only do IPv6 migration if a URI with a v6 address or tcp6: scheme was
> present?
Since we don't pass the URI to qemu, adding the ipv{4,6} options makes
no sense.
More information about the libvir-list
mailing list