From 0f6c50b9b66affc19373f5aeb6d1add83877b897 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 24 Feb 2014 16:12:34 +0100 Subject: [PATCH] gluster: Fix "key" attribute for gluster volumes According to our documentation the "key" value has the following meaning: "Providing an identifier for the volume which identifies a single volume." The currently used keys for gluster volumes consist of the gluster volume name and file path. This can't be considered unique as a different storage server can serve a volume with the same name. Unfortunately I wasn't able to figure out a way to retrieve the gluster volume UUID which would avoid the possibility of having two distinct keys identifying a single volume. Use the full URI as the key for the volume to avoid the more critical ambiguity problem and document the possible change to UUID. --- docs/storage.html.in | 8 +++++--- src/storage/storage_backend_gluster.c | 10 ++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/docs/storage.html.in b/docs/storage.html.in index 2706bc546d..eb38b16abf 100644 --- a/docs/storage.html.in +++ b/docs/storage.html.in @@ -711,12 +711,14 @@ correspond to the files that can be found when mounting the gluster volume. The name is the path relative to the effective mount specified for the pool; and - the key is a path including the gluster volume - name and any subdirectory specified by the pool.

+ the key is a string that identifies a single volume + uniquely. Currently the key attribute consists of the + URI of the volume but it may be changed to a UUID of the volume + in the future.

        <volume>
          <name>myfile</name>
-         <key>volname/myfile</key>
+         <key>gluster://localhost/volname/myfile</key>
          <source>
          </source>
          <capacity unit='bytes'>53687091200</capacity>
diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_gluster.c
index 5e0acc0651..67adda9eb7 100644
--- a/src/storage/storage_backend_gluster.c
+++ b/src/storage/storage_backend_gluster.c
@@ -187,6 +187,7 @@ virStorageBackendGlusterSetMetadata(virStorageBackendGlusterStatePtr state,
                                     const char *name)
 {
     int ret = -1;
+    char *path = NULL;
     char *tmp;
 
     VIR_FREE(vol->key);
@@ -201,12 +202,12 @@ virStorageBackendGlusterSetMetadata(virStorageBackendGlusterStatePtr state,
             goto cleanup;
     }
 
-    if (virAsprintf(&vol->key, "%s%s%s", state->volname, state->dir,
+    if (virAsprintf(&path, "%s%s%s", state->volname, state->dir,
                     vol->name) < 0)
         goto cleanup;
 
     tmp = state->uri->path;
-    if (virAsprintf(&state->uri->path, "/%s", vol->key) < 0) {
+    if (virAsprintf(&state->uri->path, "/%s", path) < 0) {
         state->uri->path = tmp;
         goto cleanup;
     }
@@ -218,9 +219,14 @@ virStorageBackendGlusterSetMetadata(virStorageBackendGlusterStatePtr state,
     VIR_FREE(state->uri->path);
     state->uri->path = tmp;
 
+    /* the path is unique enough to serve as a volume key */
+    if (VIR_STRDUP(vol->key, vol->target.path) < 0)
+        goto cleanup;
+
     ret = 0;
 
  cleanup:
+    VIR_FREE(path);
     return ret;
 }