[libvirt] [PATCH 3/6] storage: Handle transient pool removal in driver startup

Ján Tomko jtomko at redhat.com
Fri Jun 24 13:35:56 UTC 2016


On Wed, Jun 22, 2016 at 08:12:13PM -0400, Cole Robinson wrote:
>Currently transient storage pools can end up in a shutoff state
>via driver startup
>
>https://bugzilla.redhat.com/show_bug.cgi?id=1227475
>
>Use storagePoolSetInactive to handle transient pool removal in
>this case. There's some weirdness here though because this can
>happen while we are iterating over the storage pool list
>---
> src/storage/storage_driver.c | 25 +++++++++++++++++--------
> 1 file changed, 17 insertions(+), 8 deletions(-)
>
>diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
>index c7ffea8..45f00e0 100644
>--- a/src/storage/storage_driver.c
>+++ b/src/storage/storage_driver.c
>@@ -102,12 +102,16 @@ storagePoolSetInactive(virStoragePoolObjPtr pool)
>     return ret;
> }
>
>-static void
>+/*
>+ * Returns true if pool was removed from driver->pools, via
>+ * storagePoolSetInactive
>+ */
>+static bool

> storagePoolUpdateState(virStoragePoolObjPtr pool)
> {
>-    bool active;
>+    bool active = false;
>     virStorageBackendPtr backend;
>-    int ret = -1;
>+    bool ret = false;
>     char *stateFile;
>
>     if (!(stateFile = virFileBuildPath(driver->stateDir,
>@@ -123,7 +127,6 @@ storagePoolUpdateState(virStoragePoolObjPtr pool)
>     /* Backends which do not support 'checkPool' are considered
>      * inactive by default.
>      */
>-    active = false;
>     if (backend->checkPool &&
>         backend->checkPool(pool, &active) < 0) {
>         virReportError(VIR_ERR_INTERNAL_ERROR,
>@@ -149,15 +152,15 @@ storagePoolUpdateState(virStoragePoolObjPtr pool)
>     }
>
>     pool->active = active;
>-    ret = 0;
>  error:
>-    if (ret < 0) {
>+    if (!active) {
>+        ret = storagePoolSetInactive(pool);
>         if (stateFile)
>             unlink(stateFile);
>     }
>     VIR_FREE(stateFile);
>
>-    return;
>+    return ret;
> }
>
> static void
>@@ -169,7 +172,13 @@ storagePoolUpdateAllState(void)
>         virStoragePoolObjPtr pool = driver->pools.objs[i];
>
>         virStoragePoolObjLock(pool);
>-        storagePoolUpdateState(pool);
>+        if (storagePoolUpdateState(pool)) {

UpdateState should update the state, not remove pools from the list.

If it marks it as inactive, then we'd call storagePoolSetInactive
here, or even better, a subset of it since we do not need to iterate
over the pool array to find the pool index - we already have it.

Jan
>+            /* The transient pool was removed from the list, while we
>+               are iterating over the list. Adjust the counter backwards
>+               to match */
>+            --i;
>+            continue;
>+        }
>         virStoragePoolObjUnlock(pool);
>     }
> }
>-- 
>2.7.4
>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list




More information about the libvir-list mailing list