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 | |
| 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>
| -rw-r--r-- | cli/src/cli-cmd-volume.c | 139 | ||||
| -rw-r--r-- | cli/src/cli-cmd.h | 3 | ||||
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 6 | ||||
| -rw-r--r-- | cli/src/cli.h | 5 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-quota.c | 114 | 
5 files changed, 106 insertions, 161 deletions
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index 19ae35a90b3..71221055d58 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -1104,98 +1104,6 @@ out:          return ret;  } -static int -gf_cli_create_auxiliary_mount (char *volname) -{ -        int      ret                     = -1; -        char     mountdir[PATH_MAX]      = {0,}; -        char     pidfile_path[PATH_MAX]  = {0,}; -        char     logfile[PATH_MAX]       = {0,}; -        char     qpid [16]               = {0,}; -        char     *sockpath               = NULL; - -        GLUSTERFS_GET_AUX_MOUNT_PIDFILE (pidfile_path, volname); - -        if (gf_is_service_running (pidfile_path, NULL)) { -                gf_log ("cli", GF_LOG_DEBUG, "Aux mount of volume %s is running" -                        " already", volname); -                ret = 0; -                goto out; -        } - -        GLUSTERD_GET_QUOTA_AUX_MOUNT_PATH (mountdir, volname, "/"); -        ret = sys_mkdir (mountdir, 0777); -        if (ret && errno != EEXIST) { -                gf_log ("cli", GF_LOG_ERROR, "Failed to create auxiliary mount " -                        "directory %s. Reason : %s", mountdir, -                        strerror (errno)); -                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 (global_state->glusterd_sock) { -                sockpath = global_state->glusterd_sock; -        } else { -                sockpath = DEFAULT_GLUSTERD_SOCKFILE; -        } - -        ret = runcmd (SBIN_DIR"/glusterfs", -                      "--volfile-server", sockpath, -                      "--volfile-server-transport", "unix", -                      "--volfile-id", volname, -                      "-l", logfile, -                      "-p", pidfile_path, -                      "--client-pid", qpid, -                      mountdir, -                      NULL); - -        if (ret) { -                gf_log ("cli", GF_LOG_WARNING, "failed to mount glusterfs " -                        "client. Please check the log file %s for more details", -                        logfile); -                ret = -1; -                goto out; -        } - -        ret = 0; - -out: -        return ret; -} - -static int -cli_stage_quota_op (char *volname, int op_code) -{ -        int ret = -1; - -        switch (op_code) { -        case GF_QUOTA_OPTION_TYPE_ENABLE: -        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: -        case GF_QUOTA_OPTION_TYPE_LIST: -                ret = gf_cli_create_auxiliary_mount (volname); -                if (ret) { -                        cli_err ("quota: Could not start quota " -                                 "auxiliary mount"); -                        goto out; -                } -                ret = 0; -                break; - -        default: -                ret = 0; -                break; -        } - -out: -        return ret; -} -  int  cli_get_soft_limit (dict_t *options, const char **words, dict_t *xdata)  { @@ -1297,42 +1205,6 @@ out:          return limits_set;  } -/* Checks if the mount is connected to the bricks - * - * Returns true if connected and false if not - */ -gf_boolean_t -_quota_aux_mount_online (char *volname) -{ -        int         ret = 0; -        char        mount_path[PATH_MAX + 1] = {0,}; -        struct stat buf = {0,}; - -        GF_ASSERT (volname); - -        /* Try to create the aux mount before checking if bricks are online */ -        ret = gf_cli_create_auxiliary_mount (volname); -        if (ret) { -                cli_err ("quota: Could not start quota auxiliary mount"); -                return _gf_false; -        } - -        GLUSTERD_GET_QUOTA_AUX_MOUNT_PATH (mount_path, volname, "/"); - -        ret = sys_stat (mount_path, &buf); -        if (ret) { -                if (ENOTCONN == errno) { -                        cli_err ("quota: Cannot connect to bricks. Check if " -                                 "bricks are online."); -                } else { -                        cli_err ("quota: Error on quota auxiliary mount (%s).", -                                 strerror (errno)); -                } -                return _gf_false; -        } -        return _gf_true; -} -  int  cli_cmd_quota_handle_list_all (const char **words, dict_t *options)  { @@ -1403,12 +1275,6 @@ cli_cmd_quota_handle_list_all (const char **words, dict_t *options)                  goto out;          } -        /* Check if the mount is online before doing any listing */ -        if (!_quota_aux_mount_online (volname)) { -                ret = -1; -                goto out; -        } -          frame = create_frame (THIS, THIS->ctx->pool);          if (!frame) {                  ret = -1; @@ -1642,11 +1508,6 @@ cli_cmd_quota_cbk (struct cli_state *state, struct cli_cmd_word *word,                  goto out;          } -        //create auxiliary mount need for quota commands that operate on path -        ret = cli_stage_quota_op (volname, type); -        if (ret) -                goto out; -          frame = create_frame (THIS, THIS->ctx->pool);          if (!frame) {                  ret = -1; diff --git a/cli/src/cli-cmd.h b/cli/src/cli-cmd.h index 2f96bdda2ff..54e3686c9e1 100644 --- a/cli/src/cli-cmd.h +++ b/cli/src/cli-cmd.h @@ -116,7 +116,4 @@ int cli_cmd_sent_status_get (int *status);  gf_boolean_t  _limits_set_on_volume (char *volname, int type); -gf_boolean_t -_quota_aux_mount_online (char *volname); -  #endif /* __CLI_CMD_H__ */ diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 62a113a4dd8..4684679e557 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -3290,12 +3290,6 @@ gf_cli_print_limit_list_from_dict (cli_local_t *local, char *volname,                  goto out;          } -        /* Check if the mount is online before doing any listing */ -        if (!_quota_aux_mount_online (volname)) { -                ret = -1; -                goto out; -        } -          if (global_state->mode & GLUSTER_MODE_XML) {                  ret = cli_xml_output_vol_quota_limit_list_begin                                  (local, op_ret, op_errno, op_errstr); diff --git a/cli/src/cli.h b/cli/src/cli.h index 95593e6313f..999772d4bc4 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -66,11 +66,6 @@ typedef enum {          snprintf (abspath, sizeof (abspath)-1,                          \                    DEFAULT_VAR_RUN_DIRECTORY"/%s%s", volname, path); -#define GLUSTERFS_GET_AUX_MOUNT_PIDFILE(pidfile,volname) {               \ -                snprintf (pidfile, PATH_MAX-1,                             \ -                          DEFAULT_VAR_RUN_DIRECTORY"/%s.pid", volname);  \ -        } -  struct cli_state;  struct cli_cmd_word;  struct cli_cmd_tree; 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) {  | 
