summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvmallika <vmallika@redhat.com>2015-04-28 11:53:24 +0530
committerVijay Bellur <vbellur@redhat.com>2015-04-28 10:28:39 -0700
commita7e04388e03f3706c40be9d9444784a1579ed51d (patch)
tree7fd120f8efed48c888fd849c12d1b9c03d513fe4
parentbb86ba720aa9a89b0d2df5f2a6ac65c87edd260b (diff)
quota: display error when inode-quota cmds executed with cluster ver < 3.7
This is a backport of http://review.gluster.org/#/c/10261/ > In a heterogeneous cluster with op_version less than 3.7, inode quotas will > be accounted on those bricks which has glusterfs version 3.7 and this is > not available in older version. > This will have incorrect values displayed when user queries inode count > from CLI. > > This patch will display error when inode-quota commands > are executed with cluster version less than 3.7 > > Change-Id: Ia0e6d5635d1d8e7b2e2cfc3daa7b7f9e314a263a > BUG: 1212253 > Signed-off-by: vmallika <vmallika@redhat.com> > Reviewed-on: http://review.gluster.org/10261 > Tested-by: Gluster Build System <jenkins@build.gluster.com> > Reviewed-by: Atin Mukherjee <amukherj@redhat.com> > Reviewed-by: Vijay Bellur <vbellur@redhat.com> Change-Id: I1ddd605e5b87a248aa85f0eab14c404895751083 BUG: 1215907 Signed-off-by: vmallika <vmallika@redhat.com> Reviewed-on: http://review.gluster.org/10415 Tested-by: NetBSD Build System Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
-rw-r--r--rpc/xdr/src/cli1-xdr.x1
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-quota.c67
2 files changed, 45 insertions, 23 deletions
diff --git a/rpc/xdr/src/cli1-xdr.x b/rpc/xdr/src/cli1-xdr.x
index 922f22613eb..189df0e0ccc 100644
--- a/rpc/xdr/src/cli1-xdr.x
+++ b/rpc/xdr/src/cli1-xdr.x
@@ -73,6 +73,7 @@ enum gf_quota_type {
GF_QUOTA_OPTION_TYPE_SOFT_TIMEOUT,
GF_QUOTA_OPTION_TYPE_HARD_TIMEOUT,
GF_QUOTA_OPTION_TYPE_DEFAULT_SOFT_LIMIT,
+ GF_QUOTA_OPTION_TYPE_VERSION_OBJECTS,
GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS,
GF_QUOTA_OPTION_TYPE_LIST_OBJECTS,
GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS,
diff --git a/xlators/mgmt/glusterd/src/glusterd-quota.c b/xlators/mgmt/glusterd/src/glusterd-quota.c
index a137e82b230..97fa4380656 100644
--- a/xlators/mgmt/glusterd/src/glusterd-quota.c
+++ b/xlators/mgmt/glusterd/src/glusterd-quota.c
@@ -57,13 +57,47 @@ const char *gd_quota_op_list[GF_QUOTA_OPTION_TYPE_MAX + 1] = {
[GF_QUOTA_OPTION_TYPE_DEFAULT_SOFT_LIMIT] = "default-soft-limit",
[GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS] = "limit-objects",
[GF_QUOTA_OPTION_TYPE_LIST_OBJECTS] = "list-objects",
- [GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS] = "remove-objetcs",
+ [GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS] = "remove-objects",
[GF_QUOTA_OPTION_TYPE_MAX] = NULL
};
int
glusterd_store_quota_config (glusterd_volinfo_t *volinfo, char *path,
char *gfid_str, int opcode, char **op_errstr);
+
+gf_boolean_t
+glusterd_is_quota_supported (int32_t type, char **op_errstr)
+{
+ xlator_t *this = NULL;
+ glusterd_conf_t *conf = NULL;
+ gf_boolean_t supported = _gf_false;
+
+ this = THIS;
+ GF_VALIDATE_OR_GOTO ("glusterd", this, out);
+
+ conf = this->private;
+ GF_VALIDATE_OR_GOTO (this->name, conf, out);
+
+ if ((conf->op_version == GD_OP_VERSION_MIN) &&
+ (type > GF_QUOTA_OPTION_TYPE_VERSION))
+ goto out;
+
+ if ((conf->op_version < GD_OP_VERSION_3_7_0) &&
+ (type > GF_QUOTA_OPTION_TYPE_VERSION_OBJECTS))
+ goto out;
+
+ supported = _gf_true;
+
+out:
+ if (!supported && op_errstr != NULL && conf)
+ gf_asprintf (op_errstr, "Volume quota failed. The cluster is "
+ "operating at version %d. Quota command"
+ " %s is unavailable in this version.",
+ conf->op_version, gd_quota_op_list[type]);
+
+ return supported;
+}
+
int
__glusterd_handle_quota (rpcsvc_request_t *req)
{
@@ -121,18 +155,17 @@ __glusterd_handle_quota (rpcsvc_request_t *req)
snprintf (msg, sizeof (msg), "Unable to get type of command");
gf_log (this->name, GF_LOG_ERROR, "Unable to get type of cmd, "
"while handling quota command");
- goto out;
+ goto out;
}
- if ((conf->op_version == GD_OP_VERSION_MIN) &&
- (type > GF_QUOTA_OPTION_TYPE_VERSION)) {
- snprintf (msg, sizeof (msg), "Cannot execute command. The "
- "cluster is operating at version %d. Quota command %s "
- "is unavailable in this version", conf->op_version,
- gd_quota_op_list[type]);
+ if (!glusterd_is_quota_supported (type, NULL)) {
+ snprintf (msg, sizeof (msg), "Volume quota failed. The cluster "
+ "is operating at version %d. Quota command"
+ " %s is unavailable in this version.",
+ conf->op_version, gd_quota_op_list[type]);
ret = -1;
goto out;
- }
+ }
ret = glusterd_op_begin_synctask (req, GD_OP_QUOTA, dict);
@@ -1090,13 +1123,7 @@ glusterd_op_quota (dict_t *dict, char **op_errstr, dict_t *rsp_dict)
ret = dict_get_int32 (dict, "type", &type);
- if ((priv->op_version == GD_OP_VERSION_MIN) &&
- (type > GF_QUOTA_OPTION_TYPE_VERSION)) {
- gf_asprintf (op_errstr, "Volume quota failed. The cluster is "
- "operating at version %d. Quota command"
- " %s is unavailable in this version.",
- priv->op_version,
- gd_quota_op_list[type]);
+ if (!glusterd_is_quota_supported (type, op_errstr)) {
ret = -1;
goto out;
}
@@ -1421,13 +1448,7 @@ glusterd_op_stage_quota (dict_t *dict, char **op_errstr, dict_t *rsp_dict)
goto out;
}
- if ((priv->op_version == GD_OP_VERSION_MIN) &&
- (type > GF_QUOTA_OPTION_TYPE_VERSION)) {
- gf_asprintf (op_errstr, "Volume quota failed. The cluster is "
- "operating at version %d. Quota command"
- " %s is unavailable in this version.",
- priv->op_version,
- gd_quota_op_list[type]);
+ if (!glusterd_is_quota_supported (type, op_errstr)) {
ret = -1;
goto out;
}