[libvirt] [PATCH 2/2] Report an error if port range is exhausted

Daniel P. Berrange berrange at redhat.com
Wed Oct 30 15:24:47 UTC 2013


On Wed, Oct 30, 2013 at 04:20:10PM +0100, Ján Tomko wrote:
> If the port range is full, virPortAllocatorAcquire will
> return 0 and set the port to 0, leaving the error reporting
> to the caller.
> 
> This didn't happen when allocating ports for QEMU's VNC (introduced
> along with the virPortAllocator in dfb1022), VNC WebSockets and
> NBD migration (introduced with these features in f1ad8d2 and 86d90b3)
> ---
>  src/qemu/qemu_migration.c | 14 ++++++++++----
>  src/qemu/qemu_process.c   | 10 ++++++++++
>  2 files changed, 20 insertions(+), 4 deletions(-)
> 
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 5607098..addc78e 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -1114,10 +1114,16 @@ qemuMigrationStartNBDServer(virQEMUDriverPtr driver,
>                                             QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
>              goto cleanup;
>  
> -        if (!port &&
> -            ((virPortAllocatorAcquire(driver->remotePorts, &port) < 0) ||
> -             (qemuMonitorNBDServerStart(priv->mon, listenAddr, port) < 0))) {
> -            goto exit_monitor;
> +        if (!port) {
> +            if (virPortAllocatorAcquire(driver->remotePorts, &port) < 0)
> +                goto exit_monitor;
> +            if (port == 0) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("Unable to find unused port for NBD migration"));
> +                goto exit_monitor;
> +            }
> +            if (qemuMonitorNBDServerStart(priv->mon, listenAddr, port) < 0)
> +                goto exit_monitor;
>          }
>  
>          if (qemuMonitorNBDServerAdd(priv->mon, diskAlias, true) < 0)
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 354e079..3d9bffc 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -3345,12 +3345,22 @@ qemuProcessVNCAllocatePorts(virQEMUDriverPtr driver,
>      if (graphics->data.vnc.autoport) {
>          if (virPortAllocatorAcquire(driver->remotePorts, &port) < 0)
>              return -1;
> +        if (port == 0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("Unable to find an unused port for VNC"));
> +            return -1;
> +        }
>          graphics->data.vnc.port = port;
>      }
>  
>      if (graphics->data.vnc.websocket == -1) {
>          if (virPortAllocatorAcquire(driver->webSocketPorts, &port) < 0)
>              return -1;
> +        if (port == 0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("Unable to find an unused port for VNC WebSocket"));
> +            return -1;
> +        }
>          graphics->data.vnc.websocket = port;
>      }

AFAIK, all callers have to report an error message if port == 0. As we
see from these missing error reports, this is fragile. Lets just make
virPortAllocatorAcquire() return -1 if the ports are exhausted and
report an error itself. This removes the chance that the caller  will
forget.

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list