diff options
Diffstat (limited to 'xlators/mgmt/glusterd')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.c | 24 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-store.h | 2 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 49 | 
3 files changed, 69 insertions, 6 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 2e6dd6b43..57809f400 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -579,6 +579,17 @@ glusterd_volume_exclude_options_write (int fd, glusterd_volinfo_t *volinfo)                          goto out;          } +        snprintf (buf, sizeof (buf), "%d", volinfo->op_version); +        ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_OP_VERSION, buf); +        if (ret) +                goto out; + +        snprintf (buf, sizeof (buf), "%d", volinfo->client_op_version); +        ret = gf_store_save_value (fd, GLUSTERD_STORE_KEY_VOL_CLIENT_OP_VERSION, +                                   buf); +        if (ret) +                goto out; +  out:          if (ret)                  gf_log (THIS->name, GF_LOG_ERROR, "Unable to write volume " @@ -1765,7 +1776,6 @@ glusterd_store_retrieve_volume (char    *volname)          gf_store_op_errno_t       op_errno              = GD_STORE_SUCCESS;          ret = glusterd_volinfo_new (&volinfo); -          if (ret)                  goto out; @@ -1778,12 +1788,10 @@ glusterd_store_retrieve_volume (char    *volname)                    GLUSTERD_VOLUME_INFO_FILE);          ret = gf_store_handle_retrieve (path, &volinfo->shandle); -          if (ret)                  goto out;          ret = gf_store_iter_new (volinfo->shandle, &iter); -          if (ret)                  goto out; @@ -1854,6 +1862,12 @@ glusterd_store_retrieve_volume (char    *volname)                  } else if (!strncmp (key, GLUSTERD_STORE_KEY_VOL_BACKEND,                                       strlen (GLUSTERD_STORE_KEY_VOL_BACKEND))) {                          volinfo->backend = atoi (value); +                } else if (!strncmp (key, GLUSTERD_STORE_KEY_VOL_OP_VERSION, +                                strlen (GLUSTERD_STORE_KEY_VOL_OP_VERSION))) { +                        volinfo->op_version = atoi (value); +                } else if (!strncmp (key, GLUSTERD_STORE_KEY_VOL_CLIENT_OP_VERSION, +                                strlen (GLUSTERD_STORE_KEY_VOL_CLIENT_OP_VERSION))) { +                        volinfo->client_op_version = atoi (value);                  } else {                          if (is_key_glusterd_hooks_friendly (key)) { @@ -1932,6 +1946,9 @@ glusterd_store_retrieve_volume (char    *volname)                  volinfo->subvol_count = (volinfo->brick_count /                                           volinfo->dist_leaf_count); +                /* Only calculate volume op-versions if they are not found */ +                if (!volinfo->op_version && !volinfo->client_op_version) +                        gd_update_volume_op_versions (volinfo);          }          if (op_errno != GD_STORE_EOF) @@ -1950,7 +1967,6 @@ glusterd_store_retrieve_volume (char    *volname)          if (ret)                  goto out; -        gd_update_volume_op_versions (volinfo);          list_add_tail (&volinfo->vol_list, &priv->volumes); diff --git a/xlators/mgmt/glusterd/src/glusterd-store.h b/xlators/mgmt/glusterd/src/glusterd-store.h index e4f9e4a0a..9882225ab 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.h +++ b/xlators/mgmt/glusterd/src/glusterd-store.h @@ -56,6 +56,8 @@ typedef enum glusterd_store_ver_ac_{  #define GLUSTERD_STORE_KEY_DEFRAG_OP      "rebalance_op"  #define GLUSTERD_STORE_KEY_USERNAME       "username"  #define GLUSTERD_STORE_KEY_PASSWORD       "password" +#define GLUSTERD_STORE_KEY_VOL_OP_VERSION "op-version" +#define GLUSTERD_STORE_KEY_VOL_CLIENT_OP_VERSION "client-op-version"  #define GLUSTERD_STORE_KEY_BRICK_HOSTNAME "hostname"  #define GLUSTERD_STORE_KEY_BRICK_PATH     "path" diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 0ddf6ca35..b0f9a210f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1916,6 +1916,17 @@ glusterd_add_volume_to_dict (glusterd_volinfo_t *volinfo,                  i++;          } +        /* Add volume op-versions to dict. This prevents volume inconsistencies +         * in the cluster +         */ +        memset (key, 0, sizeof (key)); +        snprintf (key, sizeof (key), "volume%d.op-version", count); +        ret = dict_set_int32 (dict, key, volinfo->op_version); +        if (ret) +                goto out; +        memset (key, 0, sizeof (key)); +        snprintf (key, sizeof (key), "volume%d.client-op-version", count); +        ret = dict_set_int32 (dict, key, volinfo->client_op_version);  out:          GF_FREE (volume_id_str); @@ -2506,6 +2517,8 @@ glusterd_import_volinfo (dict_t *vols, int count,          int                rb_status         = 0;          char               *rebalance_id_str = NULL;          char               *rb_id_str        = NULL; +        int                op_version        = 0; +        int                client_op_version = 0;          GF_ASSERT (vols);          GF_ASSERT (volinfo); @@ -2732,6 +2745,40 @@ glusterd_import_volinfo (dict_t *vols, int count,          ret = glusterd_import_friend_volume_opts (vols, count, new_volinfo);          if (ret)                  goto out; + +        /* Import the volume's op-versions if available else set it to 1. +         * Not having op-versions implies this informtation was obtained from a +         * op-version 1 friend (gluster-3.3), ergo the cluster is at op-version +         * 1 and all volumes are at op-versions 1. +         * +         * Either both the volume op-versions should be absent or both should be +         * present. Only one being present is a failure +         */ +        memset (key, 0, sizeof (key)); +        snprintf (key, sizeof (key), "volume%d.op-version", count); +        ret = dict_get_int32 (vols, key, &op_version); +        if (ret) +                ret = 0; +        memset (key, 0, sizeof (key)); +        snprintf (key, sizeof (key), "volume%d.client-op-version", count); +        ret = dict_get_int32 (vols, key, &client_op_version); +        if (ret) +                ret = 0; + +        if (op_version && client_op_version) { +                new_volinfo->op_version = op_version; +                new_volinfo->client_op_version = client_op_version; +        } else if (((op_version == 0) && (client_op_version != 0)) || +                   ((op_version != 0) && (client_op_version == 0))) { +                ret = -1; +                gf_log ("glusterd", GF_LOG_ERROR, +                        "Only one volume op-version found"); +                goto out; +        } else { +                new_volinfo->op_version = 1; +                new_volinfo->client_op_version = 1; +        } +          ret = glusterd_import_bricks (vols, count, new_volinfo);          if (ret)                  goto out; @@ -2899,8 +2946,6 @@ glusterd_import_friend_volume (dict_t *vols, size_t count)                  (void) glusterd_start_bricks (new_volinfo);          } -        gd_update_volume_op_versions (new_volinfo); -          ret = glusterd_store_volinfo (new_volinfo, GLUSTERD_VOLINFO_VER_AC_NONE);          ret = glusterd_create_volfiles_and_notify_services (new_volinfo);          if (ret)  | 
