diff options
| -rw-r--r-- | libglusterfs/src/globals.h | 2 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 13 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-mgmt.c | 69 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 21 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-rpc-ops.c | 1 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-syncop.c | 4 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 95 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 14 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-set.c | 5 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.c | 1 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 4 | 
11 files changed, 200 insertions, 29 deletions
diff --git a/libglusterfs/src/globals.h b/libglusterfs/src/globals.h index 4d8fd8d75a0..a058a0f4ecd 100644 --- a/libglusterfs/src/globals.h +++ b/libglusterfs/src/globals.h @@ -76,6 +76,8 @@  #define GD_OP_VERSION_3_9_1    30901 /* Op-version for GlusterFS 3.9.1 */ +#define GD_OP_VERSION_3_10_0   31000 /* Op-version for GlusterFS 3.10.0 */ +  #define GD_OP_VERSION_4_0_0    40000 /* Op-version for GlusterFS 4.0.0 */  #define GD_OP_VER_PERSISTENT_AFR_XATTRS GD_OP_VERSION_3_6_0 diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 879f1021fd7..9a4b1bf38da 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -4627,7 +4627,8 @@ gd_is_global_option (char *opt_key)          return (strcmp (opt_key, GLUSTERD_SHARED_STORAGE_KEY) == 0 ||                  strcmp (opt_key, GLUSTERD_QUORUM_RATIO_KEY) == 0 || -                strcmp (opt_key, GLUSTERD_GLOBAL_OP_VERSION_KEY) == 0); +                strcmp (opt_key, GLUSTERD_GLOBAL_OP_VERSION_KEY) == 0 || +                strcmp (opt_key, GLUSTERD_MAX_OP_VERSION_KEY) == 0);  out:          return _gf_false; @@ -4672,11 +4673,12 @@ glusterd_get_volume_opts (rpcsvc_request_t *req, dict_t *dict)          }          if (strcasecmp (volname, "all") == 0) { -                ret = glusterd_get_global_options_for_all_vols (dict, +                ret = glusterd_get_global_options_for_all_vols (req, dict,                                                                  &rsp.op_errstr);                  goto out;          } +          ret = dict_get_str (dict, "key", &key);          if (ret) {                  snprintf (err_str, sizeof (err_str), "Failed to get key " @@ -4742,6 +4744,7 @@ glusterd_get_volume_opts (rpcsvc_request_t *req, dict_t *dict)                                  orig_key = key;                                  key = key_fixed;                          } +                          if (gd_is_global_option (key)) {                                  snprintf (warn_str, sizeof (warn_str),                                            "Warning: Support to get " @@ -4761,7 +4764,11 @@ glusterd_get_volume_opts (rpcsvc_request_t *req, dict_t *dict)                                  }                          } -                        if (strcmp (key, "cluster.op-version") == 0) { +                        if (strcmp (key, "cluster.max-op-version") == 0) { +                                ret = glusterd_get_global_max_op_version (req, dict, 1); +                                if (ret) +                                        goto out; +                        } else if (strcmp (key, "cluster.op-version") == 0) {                                  sprintf (dict_key, "key%d", count);                                  ret = dict_set_str(dict, dict_key, key);                                  if (ret) { diff --git a/xlators/mgmt/glusterd/src/glusterd-mgmt.c b/xlators/mgmt/glusterd/src/glusterd-mgmt.c index 85c98481042..b7b1a3fcbfd 100644 --- a/xlators/mgmt/glusterd/src/glusterd-mgmt.c +++ b/xlators/mgmt/glusterd/src/glusterd-mgmt.c @@ -200,6 +200,10 @@ gd_mgmt_v3_pre_validate_fn (glusterd_op_t op, dict_t *dict,                  }                  break; +        case GD_OP_MAX_OPVERSION: +                ret = 0; +                break; +          default:                  break;          } @@ -320,6 +324,18 @@ gd_mgmt_v3_commit_fn (glusterd_op_t op, dict_t *dict,                          }                          break;                  } +                case GD_OP_MAX_OPVERSION: +                { +                        ret = glusterd_op_get_max_opversion (op_errstr, +                                                             rsp_dict); +                        if (ret) { +                                gf_msg (this->name, GF_LOG_ERROR, 0, +                                        GD_MSG_COMMIT_OP_FAIL, +                                        "Commit failed."); +                                goto out; +                        } +                        break; +                }                 default:                         break; @@ -702,6 +718,8 @@ glusterd_pre_validate_aggr_rsp_dict (glusterd_op_t op,                          goto out;                  }                  break; +        case GD_OP_MAX_OPVERSION: +                break;          default:                  ret = -1;                  gf_msg (this->name, GF_LOG_ERROR, EINVAL, @@ -915,18 +933,20 @@ glusterd_mgmt_v3_pre_validate (glusterd_op_t op, dict_t *req_dict,                  goto out;          } -        ret = glusterd_pre_validate_aggr_rsp_dict (op, req_dict, -                                                   rsp_dict); -        if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, 0, -                        GD_MSG_PRE_VALIDATION_FAIL, "%s", -                        "Failed to aggregate response from " -                        " node/brick"); -                goto out; -        } +        if (op != GD_OP_MAX_OPVERSION) { +                ret = glusterd_pre_validate_aggr_rsp_dict (op, req_dict, +                                                           rsp_dict); +                if (ret) { +                        gf_msg (this->name, GF_LOG_ERROR, 0, +                                GD_MSG_PRE_VALIDATION_FAIL, "%s", +                                "Failed to aggregate response from " +                                " node/brick"); +                        goto out; +                } -        dict_unref (rsp_dict); -        rsp_dict = NULL; +                dict_unref (rsp_dict); +                rsp_dict = NULL; +        }          /* Sending Pre Validation req to other nodes in the cluster */          gd_syncargs_init (&args, req_dict); @@ -998,13 +1018,14 @@ glusterd_mgmt_v3_build_payload (dict_t **req, char **op_errstr, dict_t *dict,                  goto out;          switch (op) { -                case GD_OP_SNAP: -                        dict_copy (dict, req_dict); -                        break; -                case GD_OP_START_VOLUME: -                case GD_OP_ADD_BRICK: -                case GD_OP_REPLACE_BRICK: -                case GD_OP_RESET_BRICK: +        case GD_OP_MAX_OPVERSION: +        case GD_OP_SNAP: +                dict_copy (dict, req_dict); +                break; +        case GD_OP_START_VOLUME: +        case GD_OP_ADD_BRICK: +        case GD_OP_REPLACE_BRICK: +        case GD_OP_RESET_BRICK:                  {                          ret = dict_get_str (dict, "volname", &volname);                          if (ret) { @@ -1025,8 +1046,8 @@ glusterd_mgmt_v3_build_payload (dict_t **req, char **op_errstr, dict_t *dict,                          dict_copy (dict, req_dict);                  }                          break; -                default: -                        break; +        default: +                break;          }          *req = req_dict; @@ -2070,9 +2091,11 @@ out:          if (op_ret && (op_errno == 0))                  op_errno = EG_INTRNL; -        /* SEND CLI RESPONSE */ -        glusterd_op_send_cli_response (op, op_ret, op_errno, req, -                                       dict, op_errstr); +        if (op != GD_OP_MAX_OPVERSION) { +                /* SEND CLI RESPONSE */ +                glusterd_op_send_cli_response (op, op_ret, op_errno, req, +                                               dict, op_errstr); +        }          if (req_dict)                  dict_unref (req_dict); diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index c2b0f53dcc4..ffae6296404 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -67,6 +67,7 @@ glusterd_all_vol_opts valid_all_vol_opts[] = {          { GLUSTERD_QUORUM_RATIO_KEY },          { GLUSTERD_SHARED_STORAGE_KEY },          { GLUSTERD_GLOBAL_OP_VERSION_KEY }, +        { GLUSTERD_MAX_OP_VERSION_KEY },          { NULL },  }; @@ -2471,6 +2472,25 @@ out:          return ret;  } +int +glusterd_op_get_max_opversion (char **op_errstr, dict_t *rsp_dict) +{ +        int                     ret             = -1; + +        GF_VALIDATE_OR_GOTO (THIS->name, rsp_dict, out); + +        ret = dict_set_int32 (rsp_dict, "max-opversion", GD_OP_VERSION_MAX); +        if (ret) { +                gf_msg (THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                        "Setting value for max-opversion to dict failed"); +                goto out; +        } + +out: +        gf_msg_debug (THIS->name, 0, "Returning %d", ret); +        return ret; +} +  static int  glusterd_set_shared_storage (dict_t *dict, char *key, char *value,                               char **op_errstr) @@ -7955,6 +7975,7 @@ glusterd_op_free_ctx (glusterd_op_t op, void *ctx)                  case GD_OP_STATEDUMP_VOLUME:                  case GD_OP_CLEARLOCKS_VOLUME:                  case GD_OP_DEFRAG_BRICK_VOLUME: +                case GD_OP_MAX_OPVERSION:                          dict_unref (ctx);                          break;                  default: diff --git a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c index ef5b95273a5..dc955de635a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c @@ -145,6 +145,7 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret,          case GD_OP_SCRUB_STATUS:          case GD_OP_SCRUB_ONDEMAND:          case GD_OP_RESET_BRICK: +        case GD_OP_MAX_OPVERSION:          {                  /*nothing specific to be done*/                  break; diff --git a/xlators/mgmt/glusterd/src/glusterd-syncop.c b/xlators/mgmt/glusterd/src/glusterd-syncop.c index 2b7a4477fca..ffc7216b1da 100644 --- a/xlators/mgmt/glusterd/src/glusterd-syncop.c +++ b/xlators/mgmt/glusterd/src/glusterd-syncop.c @@ -314,6 +314,10 @@ glusterd_syncop_aggr_rsp_dict (glusterd_op_t op, dict_t *aggr, dict_t *rsp)          case GD_OP_SCRUB_ONDEMAND:          break; +        case GD_OP_MAX_OPVERSION: +                ret = glusterd_max_opversion_use_rsp_dict (aggr, rsp); +        break; +          default:          break;          } diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 998c5a0d5da..3227923a99e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -46,6 +46,7 @@  #include "glusterd-pmap.h"  #include "glusterfs-acl.h"  #include "glusterd-syncop.h" +#include "glusterd-mgmt.h"  #include "glusterd-locks.h"  #include "glusterd-messages.h"  #include "glusterd-volgen.h" @@ -8670,6 +8671,43 @@ out:  }  int +glusterd_max_opversion_use_rsp_dict (dict_t *dst, dict_t *src) +{ +        int ret = -1; +        int src_max_opversion = -1; +        int max_opversion = -1; + +        GF_VALIDATE_OR_GOTO (THIS->name, dst, out); +        GF_VALIDATE_OR_GOTO (THIS->name, src, out); + +        ret = dict_get_int32 (dst, "max-opversion", &max_opversion); +        if (ret) +                gf_msg (THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +                                "Maximum supported op-version not set in destination " +                                "dictionary"); + +        ret = dict_get_int32 (src, "max-opversion", &src_max_opversion); +        if (ret) { +                gf_msg (THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_GET_FAILED, +                        "Failed to get maximum supported op-version from source"); +                goto out; +        } + +        if (max_opversion == -1 || src_max_opversion < max_opversion) +                max_opversion = src_max_opversion; + +        ret = dict_set_int32 (dst, "max-opversion", max_opversion); +        if (ret) { +                gf_msg (THIS->name, GF_LOG_ERROR, 0, GD_MSG_DICT_SET_FAILED, +                                "Failed to set max op-version"); +                goto out; +        } +out: +        return ret; +} + + +int  glusterd_volume_bitrot_scrub_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict)  {          int                      ret                = -1; @@ -10913,7 +10951,51 @@ out:  }  int -glusterd_get_global_options_for_all_vols (dict_t *ctx, char **op_errstr) +glusterd_get_global_max_op_version (rpcsvc_request_t *req, dict_t *ctx, +                                    int count) +{ +        int     ret = -1; +        char    *def_val = NULL; +        char    dict_key[50] = {0,}; + +        ret = glusterd_mgmt_v3_initiate_all_phases (req, GD_OP_MAX_OPVERSION, +                                                    ctx); + +        ret = dict_get_str (ctx, "max-opversion", &def_val); +        if (ret) { +                gf_msg (THIS->name, GF_LOG_ERROR, 0, +                        GD_MSG_DICT_GET_FAILED, +                        "Failed to get max-opversion value from" +                        " dictionary"); +                goto out; +        } + +        sprintf (dict_key, "key%d", count); +        ret = dict_set_str (ctx, dict_key, GLUSTERD_MAX_OP_VERSION_KEY); +        if (ret) { +                gf_msg (THIS->name, GF_LOG_ERROR, 0, +                        GD_MSG_DICT_SET_FAILED, "Failed to set %s in " +                        "dictionary", GLUSTERD_MAX_OP_VERSION_KEY); +                goto out; +        } + +        sprintf (dict_key, "value%d", count); +        ret = dict_set_dynstr_with_alloc (ctx, dict_key, def_val); +        if (ret) { +                gf_msg (THIS->name, GF_LOG_ERROR, 0, +                        GD_MSG_DICT_SET_FAILED, +                        "Failed to set %s for key %s in dictionary", +                        def_val, GLUSTERD_MAX_OP_VERSION_KEY); +                goto out; +        } + +out: +        return ret; +} + +int +glusterd_get_global_options_for_all_vols (rpcsvc_request_t *req, dict_t *ctx, +                                          char **op_errstr)  {          int                     ret = -1;          int                     count = 0; @@ -10973,6 +11055,17 @@ glusterd_get_global_options_for_all_vols (dict_t *ctx, char **op_errstr)                  if (!all_opts && strcmp (key, allvolopt) != 0)                          continue; +                /* Found global option */ +                if (strcmp (allvolopt, GLUSTERD_MAX_OP_VERSION_KEY) == 0) { +                        count++; +                        ret = glusterd_get_global_max_op_version (req, ctx, +                                                                  count); +                        if (ret) +                                goto out; +                        else +                                continue; +                } +                  ret = dict_get_str (priv->opts, allvolopt, &def_val);                  /* If global option isn't set explicitly */ diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index 914d7977b51..53f4d971998 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -38,9 +38,11 @@                  gf_boolean_t    _is_valid_opt = _gf_false;                     \                  int32_t         i      = 0;                                    \                                                                                 \ -                if (strcmp (key, "all") == 0 && !get_opt) {                    \ +                if (!get_opt && (!strcmp (key, "all") ||                       \ +                                 !strcmp (key, "cluster.max-op-version"))) {   \                          ret = -1;                                              \                          *op_errstr = gf_strdup ("Not a valid option to set");  \ +                        goto out;                                              \                  }                                                              \                                                                                 \                  for (i = 0; valid_all_vol_opts[i].option; i++) {               \ @@ -482,6 +484,9 @@ glusterd_handle_node_rsp (dict_t *req_ctx, void *pending_entry,                            glusterd_op_t op, dict_t *rsp_dict, dict_t *op_ctx,                            char **op_errstr, gd_node_type type);  int +glusterd_max_opversion_use_rsp_dict (dict_t *dst, dict_t *src); + +int  glusterd_volume_bitrot_scrub_use_rsp_dict (dict_t *aggr, dict_t *rsp_dict);  int @@ -657,7 +662,12 @@ int  glusterd_get_volopt_content (dict_t *dict, gf_boolean_t xml_out);  int -glusterd_get_global_options_for_all_vols (dict_t *dict, char **op_errstr); +glusterd_get_global_max_op_version (rpcsvc_request_t *req, dict_t *ctx, +                                    int count); + +int +glusterd_get_global_options_for_all_vols (rpcsvc_request_t *req, dict_t *dict, +                                          char **op_errstr);  int  glusterd_get_default_val_for_volopt (dict_t *dict, gf_boolean_t all_opts, diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index 5bda3fedd43..b8f92e4fcd5 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -2593,6 +2593,11 @@ struct volopt_map_entry glusterd_volopt_map[] = {            .voltype     = "mgmt/glusterd",            .op_version  = GD_OP_VERSION_3_6_0,          }, +        { +          .key         = "cluster.max-op-version", +          .voltype     = "mgmt/glusterd", +          .op_version  = GD_OP_VERSION_3_10_0, +        },          /*Trash translator options */          { .key         = "features.trash",            .voltype     = "features/trash", diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index 705ce721ea8..ac5570404a8 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -124,6 +124,7 @@ const char *gd_op_list[GD_OP_MAX + 1] = {          [GD_OP_GSYNC_CREATE]            = "Geo-replication Create",          [GD_OP_SNAP]                    = "Snapshot",          [GD_OP_RESET_BRICK]             = "Reset Brick", +        [GD_OP_MAX_OPVERSION]           = "Maximum supported op-version",          [GD_OP_MAX]                     = "Invalid op"  }; diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index d7e5964346e..9d3d867e64c 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -44,6 +44,7 @@  #define GLUSTERD_QUORUM_RATIO_KEY       "cluster.server-quorum-ratio"  #define GLUSTERD_GLOBAL_OPT_VERSION     "global-option-version"  #define GLUSTERD_GLOBAL_OP_VERSION_KEY  "cluster.op-version" +#define GLUSTERD_MAX_OP_VERSION_KEY     "cluster.max-op-version"  #define GLUSTERD_COMMON_PEM_PUB_FILE    "/geo-replication/common_secret.pem.pub"  #define GEO_CONF_MAX_OPT_VALS           6  #define GLUSTERD_CREATE_HOOK_SCRIPT     "/hooks/1/gsync-create/post/" \ @@ -123,6 +124,7 @@ typedef enum glusterd_op_ {          GD_OP_SCRUB_STATUS,          GD_OP_SCRUB_ONDEMAND,          GD_OP_RESET_BRICK, +        GD_OP_MAX_OPVERSION,          GD_OP_MAX,  } glusterd_op_t; @@ -1115,6 +1117,8 @@ int glusterd_op_statedump_volume_args_get (dict_t *dict, char **volname,  int glusterd_op_gsync_args_get (dict_t *dict, char **op_errstr,                                  char **master, char **slave, char **host_uuid); +int glusterd_op_get_max_opversion (char **op_errstr, dict_t *rsp_dict); +  int glusterd_start_volume (glusterd_volinfo_t *volinfo, int flags,                             gf_boolean_t wait);  | 
