diff options
author | vmallika <vmallika@redhat.com> | 2016-01-18 23:31:59 +0530 |
---|---|---|
committer | Atin Mukherjee <amukherj@redhat.com> | 2016-01-22 03:25:48 -0800 |
commit | a593921aa0eada17637667938f432875b410139d (patch) | |
tree | 1f327be07a4d5025e8eebaa6b844f8caaafe7dac /xlators/mgmt | |
parent | 16f6579cb3e1214b1386fb530b8e16c8cbfdef33 (diff) |
quota: start aux mount from glusterd with inet address
With below patches, quota aux mount now
uses unix domain socket to connect to
glusterd
http://review.gluster.org/#/c/12645/
http://review.gluster.org/#/c/12819/
When USS is enabled, snapd protocol client tries to
connect to glusterd with inet and fails,
because remote-host option by client process
is set to UDS file
This patch starts the aux client process from glusterd
with inet address
Change-Id: I6967043bfd8824658ea39bfd2842591fcc3280fd
BUG: 1299497
Signed-off-by: vmallika <vmallika@redhat.com>
Reviewed-on: http://review.gluster.org/13255
Smoke: Gluster Build System <jenkins@build.gluster.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators/mgmt')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-quota.c | 114 |
1 files changed, 106 insertions, 8 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-quota.c b/xlators/mgmt/glusterd/src/glusterd-quota.c index 73018ad44dc..f6277a382d8 100644 --- a/xlators/mgmt/glusterd/src/glusterd-quota.c +++ b/xlators/mgmt/glusterd/src/glusterd-quota.c @@ -1700,6 +1700,94 @@ out: return ret; } +static int +glusterd_create_quota_auxiliary_mount (xlator_t *this, char *volname) +{ + int ret = -1; + int retry = 0; + char mountdir[PATH_MAX] = {0,}; + char pidfile_path[PATH_MAX] = {0,}; + char logfile[PATH_MAX] = {0,}; + char qpid[16] = {0,}; + char *volfileserver = NULL; + glusterd_conf_t *priv = NULL; + struct stat buf = {0,}; + + GF_VALIDATE_OR_GOTO ("glusterd", this, out); + priv = this->private; + GF_VALIDATE_OR_GOTO (this->name, priv, out); + + GLUSTERFS_GET_AUX_MOUNT_PIDFILE (pidfile_path, volname); + + if (gf_is_service_running (pidfile_path, NULL)) { + gf_msg_debug (this->name, 0, "Aux mount of volume %s is running" + " already", volname); + ret = 0; + goto out; + } + + if (glusterd_is_fuse_available () == _gf_false) { + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_MOUNT_REQ_FAIL, "Fuse unavailable"); + ret = -1; + goto out; + } + + GLUSTERD_GET_QUOTA_AUX_MOUNT_PATH (mountdir, volname, "/"); + ret = sys_mkdir (mountdir, 0777); + if (ret && errno != EEXIST) { + gf_msg (this->name, GF_LOG_ERROR, errno, + GD_MSG_MOUNT_REQ_FAIL, "Failed to create auxiliary " + "mount directory %s", mountdir); + goto out; + } + snprintf (logfile, PATH_MAX-1, "%s/quota-mount-%s.log", + DEFAULT_LOG_FILE_DIRECTORY, volname); + snprintf(qpid, 15, "%d", GF_CLIENT_PID_QUOTA_MOUNT); + + if (dict_get_str (this->options, "transport.socket.bind-address", + &volfileserver) != 0) + volfileserver = "localhost"; + + synclock_unlock (&priv->big_lock); + ret = runcmd (SBIN_DIR"/glusterfs", + "--volfile-server", volfileserver, + "--volfile-id", volname, + "-l", logfile, + "-p", pidfile_path, + "--client-pid", qpid, + mountdir, + NULL); + if (ret == 0) { + /* Block here till mount process is ready to accept FOPs. + * Else, if glusterd acquires biglock below before + * mount process is ready, then glusterd and mount process + * can get into a deadlock situation. + */ + ret = sys_stat (mountdir, &buf); + if (ret < 0) + ret = -errno; + } else { + ret = -errno; + } + + synclock_lock (&priv->big_lock); + + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, -ret, + GD_MSG_MOUNT_REQ_FAIL, "Failed to mount glusterfs " + "client. Please check the log file %s for more details", + logfile); + ret = -1; + goto out; + } + + ret = 0; + +out: + return ret; +} + int glusterd_op_stage_quota (dict_t *dict, char **op_errstr, dict_t *rsp_dict) { @@ -1787,19 +1875,29 @@ glusterd_op_stage_quota (dict_t *dict, char **op_errstr, dict_t *rsp_dict) } switch (type) { - case GF_QUOTA_OPTION_TYPE_ENABLE: - case GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS: case GF_QUOTA_OPTION_TYPE_LIST: case GF_QUOTA_OPTION_TYPE_LIST_OBJECTS: - /* Fuse mount req. only for enable & list-usage options*/ - if (is_origin_glusterd (dict) && - !glusterd_is_fuse_available ()) { - *op_errstr = gf_strdup ("Fuse unavailable"); - ret = -1; - goto out; + case GF_QUOTA_OPTION_TYPE_LIMIT_USAGE: + case GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS: + case GF_QUOTA_OPTION_TYPE_REMOVE: + case GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS: + /* Quota auxiliary mount is needed by CLI + * for list command and need by glusterd for + * setting/removing limit + */ + if (is_origin_glusterd (dict)) { + ret = glusterd_create_quota_auxiliary_mount (this, + volname); + if (ret) { + *op_errstr = gf_strdup ("Failed to start aux " + "mount"); + goto out; + } } break; + } + switch (type) { case GF_QUOTA_OPTION_TYPE_LIMIT_USAGE: ret = dict_get_str (dict, "hard-limit", &hard_limit_str); if (ret) { |