[libvirt] [PATCH V4] Sheepdog: Auto Adding volume and pool refresh.

joel SIMOES joel.simoes at laposte.net
Mon Feb 3 16:55:49 UTC 2014


From: Joel SIMOES <joel.simoes at laposte.net>

Libvirt lose sheepdogs volumes on pool refresh or restart.
When restarting sheepdog pool, all volumes are missing.
This patch add automatically all volume from the added pool.

With Jan Tomko help
---
 src/storage/storage_backend_sheepdog.c | 68 ++++++++++++++++++++++++++++++++--
 1 file changed, 64 insertions(+), 4 deletions(-)

diff --git a/src/storage/storage_backend_sheepdog.c b/src/storage/storage_backend_sheepdog.c
index a6981ce..7a139e7 100644
--- a/src/storage/storage_backend_sheepdog.c
+++ b/src/storage/storage_backend_sheepdog.c
@@ -109,22 +109,82 @@ virStorageBackendSheepdogAddHostArg(virCommandPtr cmd,
     virCommandAddArgFormat(cmd, "%d", port);
 }
 
+static int
+virStorageBackendSheepdogRefreshAllVol(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                       virStoragePoolObjPtr pool)
+{
+    int ret = -1;
+    char *output = NULL;
+    char** lines = NULL;
+    char** cells = NULL;
+    size_t i;
+
+    virCommandPtr cmd = virCommandNewArgList(COLLIE, "vdi", "list", "-r", NULL);
+    virStorageBackendSheepdogAddHostArg(cmd, pool);
+    virCommandSetOutputBuffer(cmd, &output);
+    if (virCommandRun(cmd, NULL) < 0)
+        goto cleanup;
+
+    lines = virStringSplit(output, "\n", 0);
+    if (lines == NULL)
+        goto cleanup;
+
+    for (i = 0; lines[i]; i++) {
+        char *line = lines[i];
+        if (line == NULL)
+            break;
+        cells = virStringSplit(line, " ", 0);
+        if (cells == NULL || virStringListLength(cells) <= 2)
+            continue;
+        char *cell = cells[1];
+        virStorageVolDefPtr vol = NULL;
+        if (VIR_ALLOC(vol) < 0)
+            goto cleanup;
+
+        if (VIR_STRDUP(vol->name, cell) < 0)
+            goto cleanup;
+
+        vol->type = VIR_STORAGE_VOL_BLOCK;
+
+        if (VIR_EXPAND_N(pool->volumes.objs, pool->volumes.count, 1) < 0)
+            goto cleanup;
+        pool->volumes.objs[pool->volumes.count - 1] = vol;
+
+        if (virStorageBackendSheepdogRefreshVol(conn, pool, vol) < 0)
+            goto cleanup;
+        vol = NULL;
+        virStringFreeList(cells);
+    }
+
+    ret = 0;
+
+cleanup:
+    virCommandFree(cmd);
+    virStringFreeList(lines);
+    virStringFreeList(cells);
+    return ret;
+}
+
 
 static int
 virStorageBackendSheepdogRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
                                      virStoragePoolObjPtr pool)
 {
-    int ret;
+    int ret = -1;
     char *output = NULL;
     virCommandPtr cmd;
 
     cmd = virCommandNewArgList(COLLIE, "node", "info", "-r", NULL);
     virStorageBackendSheepdogAddHostArg(cmd, pool);
     virCommandSetOutputBuffer(cmd, &output);
-    ret = virCommandRun(cmd, NULL);
-    if (ret == 0)
-        ret = virStorageBackendSheepdogParseNodeInfo(pool->def, output);
+    if (virCommandRun(cmd, NULL) < 0)
+        goto cleanup;
+
+    if (virStorageBackendSheepdogParseNodeInfo(pool->def, output) < 0)
+        goto cleanup;
 
+    ret = virStorageBackendSheepdogRefreshAllVol(conn, pool);
+cleanup:
     virCommandFree(cmd);
     VIR_FREE(output);
     return ret;
-- 
1.8.3.2




More information about the libvir-list mailing list