[libvirt] [PATCH 2/2] Return -1 in virPortAllocatorAcquire if all ports are used

Ján Tomko jtomko at redhat.com
Thu Oct 31 12:07:27 UTC 2013


Report the error in virPortAllocatorAcquire instead
of doing it in every caller.

The error contains the port range name instead of the intended
use for the port, e.g.:
Unable to find an unused port in range 'display' (65534-65535)
instead of:
Unable to find an unused port for SPICE

This also adds error reporting when the QEMU driver could not
find an unused port for VNC, VNC WebSockets or NBD migration.
---
 src/libxl/libxl_conf.c       |  5 -----
 src/qemu/qemu_migration.c    | 16 ++--------------
 src/qemu/qemu_process.c      | 12 ------------
 src/util/virportallocator.c  |  7 ++++++-
 tests/virportallocatortest.c |  6 ++----
 5 files changed, 10 insertions(+), 36 deletions(-)

diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index d4226b8..e4bb75f 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -947,11 +947,6 @@ libxlMakeVfb(libxlDriverPrivatePtr driver,
 
                 if (virPortAllocatorAcquire(driver->reservedVNCPorts, &port) < 0)
                     return -1;
-                if (port == 0) {
-                    virReportError(VIR_ERR_INTERNAL_ERROR,
-                                   "%s", _("Unable to find an unused VNC port"));
-                    return -1;
-                }
                 l_vfb->data.vnc.port = port;
             }
             x_vfb->vnc.display = l_vfb->data.vnc.port - LIBXL_VNC_PORT_MIN;
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index cb59620..8fb85a8 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -2557,14 +2557,8 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
      * to be a correct hostname which refers to the target machine).
      */
     if (uri_in == NULL) {
-        if (virPortAllocatorAcquire(driver->migrationPorts, &port) < 0) {
+        if (virPortAllocatorAcquire(driver->migrationPorts, &port) < 0)
             goto cleanup;
-        } else if (!port) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("No migration port available within the "
-                             "configured range"));
-            goto cleanup;
-        }
 
         if ((hostname = virGetHostname()) == NULL)
             goto cleanup;
@@ -2619,14 +2613,8 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
         }
 
         if (uri->port == 0) {
-            if (virPortAllocatorAcquire(driver->migrationPorts, &port) < 0) {
+            if (virPortAllocatorAcquire(driver->migrationPorts, &port) < 0)
                 goto cleanup;
-            } else if (!port) {
-                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                               _("No migration port available within the "
-                                 "configured range"));
-                goto cleanup;
-            }
 
             if (well_formed_uri) {
                 uri->port = port;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index bdffdf8..daf081d 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3406,12 +3406,6 @@ qemuProcessSPICEAllocatePorts(virQEMUDriverPtr driver,
         if (virPortAllocatorAcquire(driver->remotePorts, &port) < 0)
             goto error;
 
-        if (port == 0) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("Unable to find an unused port for SPICE"));
-            goto error;
-        }
-
         graphics->data.spice.port = port;
     }
 
@@ -3437,12 +3431,6 @@ qemuProcessSPICEAllocatePorts(virQEMUDriverPtr driver,
             if (virPortAllocatorAcquire(driver->remotePorts, &tlsPort) < 0)
                 goto error;
 
-            if (tlsPort == 0) {
-                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                               _("Unable to find an unused port for SPICE TLS"));
-                virPortAllocatorRelease(driver->remotePorts, port);
-                goto error;
-            }
             graphics->data.spice.tlsPort = tlsPort;
         }
     }
diff --git a/src/util/virportallocator.c b/src/util/virportallocator.c
index 0497978..42e1f28 100644
--- a/src/util/virportallocator.c
+++ b/src/util/virportallocator.c
@@ -156,10 +156,15 @@ int virPortAllocatorAcquire(virPortAllocatorPtr pa,
                 goto cleanup;
             }
             *port = i;
+            ret = 0;
         }
     }
 
-    ret = 0;
+    if (*port == 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Unable to find an unused port in range '%s' (%d-%d)"),
+                       pa->name, pa->start, pa->end);
+    }
 cleanup:
     virObjectUnlock(pa);
     VIR_FORCE_CLOSE(fd);
diff --git a/tests/virportallocatortest.c b/tests/virportallocatortest.c
index 33de782..721356e 100644
--- a/tests/virportallocatortest.c
+++ b/tests/virportallocatortest.c
@@ -118,11 +118,9 @@ static int testAllocAll(const void *args ATTRIBUTE_UNUSED)
         goto cleanup;
     }
 
-    if (virPortAllocatorAcquire(alloc, &p7) < 0)
-        goto cleanup;
-    if (p7 != 0) {
+    if (virPortAllocatorAcquire(alloc, &p7) == 0) {
         if (virTestGetDebug())
-            fprintf(stderr, "Expected 0, got %d", p7);
+            fprintf(stderr, "Expected error, got %d", p7);
         goto cleanup;
     }
 
-- 
1.8.1.5




More information about the libvir-list mailing list