[libvirt] [PATCH 2/2] graphics: remember graphics not auto allocated ports

Giuseppe Scrivano gscrivan at redhat.com
Tue Jun 24 08:57:20 UTC 2014


Ján Tomko <jtomko at redhat.com> writes:

> On 06/23/2014 08:15 PM, Giuseppe Scrivano wrote:
>> When looking for a port to allocate, the port allocator didn't take in
>> consideration ports that are statically set by the user.  Defining
>> these two graphics elements in the XML would cause an error, as the
>> port allocator would try to use the same port for the spice graphics
>> element:
>> 
>>     <graphics type='spice' autoport='yes'/>
>>     <graphics type='vnc' port='5900' autoport='no'/>
>> 
>> The new *[pP]ortAllocated variables keep track of the ports that were
>> successfully registered (either bound or simply tracked as used) by
>> the port allocator to allow a clean rollback on errors.
>> 
>> Closes: https://bugzilla.redhat.com/show_bug.cgi?id=1081881
>> 
>> Signed-off-by: Giuseppe Scrivano <gscrivan at redhat.com>
>> ---
>>  src/conf/domain_conf.h  |  3 ++
>>  src/qemu/qemu_process.c | 79 +++++++++++++++++++++++++++++++++++++++++++------
>>  2 files changed, 73 insertions(+), 9 deletions(-)
>> 
>
>> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>> index 0b8155b..06f1e54 100644
>> --- a/src/qemu/qemu_process.c
>> +++ b/src/qemu/qemu_process.c
>> @@ -3487,6 +3487,7 @@ qemuProcessVNCAllocatePorts(virQEMUDriverPtr driver,
>>          if (virPortAllocatorAcquire(driver->remotePorts, &port) < 0)
>>              return -1;
>>          graphics->data.vnc.port = port;
>> +        graphics->data.vnc.portAllocated = true;
>>      }
>>  
>>      if (graphics->data.vnc.websocket == -1) {
>> @@ -3548,6 +3549,7 @@ qemuProcessSPICEAllocatePorts(virQEMUDriverPtr driver,
>>              goto error;
>>  
>>          graphics->data.spice.port = port;
>> +        graphics->data.spice.portAllocated = true;
>>      }
>>  
>>      if (needTLSPort || graphics->data.spice.tlsPort == -1) {
>> @@ -3573,6 +3575,7 @@ qemuProcessSPICEAllocatePorts(virQEMUDriverPtr driver,
>>                  goto error;
>>  
>>              graphics->data.spice.tlsPort = tlsPort;
>> +            graphics->data.spice.tlsPortAllocated = true;
>>          }
>>      }
>>  
>> @@ -3803,6 +3806,36 @@ int qemuProcessStart(virConnectPtr conn,
>>  
>>      for (i = 0; i < vm->def->ngraphics; ++i) {
>>          virDomainGraphicsDefPtr graphics = vm->def->graphics[i];
>> +        if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
>> +            !graphics->data.vnc.autoport) {
>> +            if (virPortAllocatorSetUsed(driver->remotePorts,
>> +                                        graphics->data.vnc.port,
>> +                                        true) < 0) {
>
> virPortAllocatorSetUsed doesn't error out if the static port is already marked
> as used. If it's already used by another domain, this one fails to start and
> releases the port in qemuProcessStop.
>
> If you change it to fail on occupied ports, it will also catch duplicit static
> ports, but only in the port allocator range. I expect someone will file a bug
> about conflicting ports out of that range as well :)

sorry, it had to be failing on occupied ports, I'll change it in v2.

>
>> +                goto cleanup;
>> +            }
>> +
>> +            graphics->data.vnc.portAllocated = true;
>> +
>> +        } else if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE &&
>> +                   !graphics->data.spice.autoport) {
>
> If either of the ports is -1, you shouldn't be reserving them. (For VNC, we
> set autoport to true if port is -1 when parsing the XML. For SPICE, this only
> happens if both ports are -1).

I will modify it to reserve a port only if !autoport && port != -1 and
fix the release part too.

Thanks,
Giuseppe




More information about the libvir-list mailing list