[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