diff options
-rw-r--r-- | libglusterfs/src/logging.h | 5 | ||||
-rw-r--r-- | tests/bugs/quota/bug-1293601.t | 12 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handshake.c | 64 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-quota.c | 200 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 68 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 4 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 69 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.h | 3 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 17 |
9 files changed, 399 insertions, 43 deletions
diff --git a/libglusterfs/src/logging.h b/libglusterfs/src/logging.h index 3c7346f8cc7..f3a694ceefd 100644 --- a/libglusterfs/src/logging.h +++ b/libglusterfs/src/logging.h @@ -89,8 +89,9 @@ typedef enum { /* NOTE: In the future journald, lumberjack, next new thing here */ } gf_log_logger_t; -#define DEFAULT_LOG_FILE_DIRECTORY DATADIR "/log/glusterfs" -#define DEFAULT_LOG_LEVEL GF_LOG_INFO +#define DEFAULT_LOG_FILE_DIRECTORY DATADIR "/log/glusterfs" +#define DEFAULT_QUOTA_CRAWL_LOG_DIRECTORY DATADIR "/log/glusterfs/quota_crawl" +#define DEFAULT_LOG_LEVEL GF_LOG_INFO typedef struct gf_log_handle_ { pthread_mutex_t logfile_mutex; diff --git a/tests/bugs/quota/bug-1293601.t b/tests/bugs/quota/bug-1293601.t index 04c350e688d..52b03bcc059 100644 --- a/tests/bugs/quota/bug-1293601.t +++ b/tests/bugs/quota/bug-1293601.t @@ -4,19 +4,22 @@ . $(dirname $0)/../../volume.rc cleanup; -TESTS_EXPECTED_IN_LOOP=1024 TEST glusterd TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4} TEST $CLI volume start $V0 TEST $CLI volume quota $V0 enable -TEST $CLI volume quota $V0 limit-usage / 2MB TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0; -for i in {1..1024}; do - TEST_IN_LOOP dd if=/dev/zero of=$M0/f$i bs=1k count=1 +for i in {1..512}; do + dd if=/dev/zero of=$M0/f$i bs=1k count=1 +done + +mkdir $M0/dir1 +for i in {513..1024}; do + dd if=/dev/zero of=$M0/dir1/f$i bs=1k count=1 done EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "1.0MB" quotausage "/" @@ -24,7 +27,6 @@ EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "1.0MB" quotausage "/" TEST $CLI volume quota $V0 disable TEST $CLI volume quota $V0 enable -TEST $CLI volume quota $V0 limit-usage / 2MB EXPECT_WITHIN $MARKER_UPDATE_TIMEOUT "1.0MB" quotausage "/" cleanup; diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c index 59e6c19f8df..0ea66a027bf 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handshake.c +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -156,6 +156,27 @@ out: return ret; } +int32_t +glusterd_get_client_per_brick_volfile (glusterd_volinfo_t *volinfo, + char *filename, char *path, int path_len) +{ + char workdir[PATH_MAX] = {0,}; + glusterd_conf_t *priv = NULL; + int32_t ret = -1; + + GF_VALIDATE_OR_GOTO ("glusterd", THIS, out); + priv = THIS->private; + GF_VALIDATE_OR_GOTO (THIS->name, priv, out); + + GLUSTERD_GET_VOLUME_DIR (workdir, volinfo, priv); + + snprintf (path, path_len, "%s/%s", workdir, filename); + + ret = 0; +out: + return ret; +} + static size_t build_volfile_path (char *volume_id, char *path, size_t path_len, char *trusted_str) @@ -264,6 +285,49 @@ build_volfile_path (char *volume_id, char *path, goto out; } + volid_ptr = strstr (volume_id, "client_per_brick/"); + if (volid_ptr) { + volid_ptr = strchr (volid_ptr, '/'); + if (!volid_ptr) { + ret = -1; + goto out; + } + volid_ptr++; + + dup_volname = gf_strdup (volid_ptr); + if (!dup_volname) { + gf_msg (this->name, GF_LOG_ERROR, ENOMEM, + GD_MSG_NO_MEMORY, + "strdup failed"); + ret = -1; + goto out; + } + + /* Split the volume name */ + vol = strtok_r (dup_volname, ".", &save_ptr); + if (!vol) { + ret = -1; + goto out; + } + ret = glusterd_volinfo_find (vol, &volinfo); + if (ret == -1) { + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_VOLINFO_GET_FAIL, + "Couldn't find volinfo"); + goto out; + } + ret = glusterd_get_client_per_brick_volfile (volinfo, volid_ptr, + path, path_len); + if (ret < 0) { + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_NO_MEMORY, "failed to get volinfo path"); + goto out; + } + + ret = sys_access (path, F_OK); + goto out; + } + if (volume_id[0] == '/') { /* Normal behavior */ volid_ptr = volume_id; diff --git a/xlators/mgmt/glusterd/src/glusterd-quota.c b/xlators/mgmt/glusterd/src/glusterd-quota.c index f6277a382d8..4390eaab3e6 100644 --- a/xlators/mgmt/glusterd/src/glusterd-quota.c +++ b/xlators/mgmt/glusterd/src/glusterd-quota.c @@ -94,12 +94,17 @@ glusterd_is_quota_supported (int32_t type, char **op_errstr) /* Quota xattr version implemented in 3.7.6 * quota-version is incremented when quota is enabled - * so don't allow enabling quota in heterogeneous + * Quota enable and disable performance enhancement has been done + * in version 3.7.12. + * so don't allow enabling/disabling quota in heterogeneous * cluster during upgrade */ - if (conf->op_version < GD_OP_VERSION_3_7_6 && - type == GF_QUOTA_OPTION_TYPE_ENABLE) - goto out; + if (type == GF_QUOTA_OPTION_TYPE_ENABLE || + type == GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS || + type == GF_QUOTA_OPTION_TYPE_DISABLE) { + if (conf->op_version < GD_OP_VERSION_3_7_12) + goto out; + } supported = _gf_true; @@ -229,37 +234,73 @@ out: } int32_t -glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, char *volname, - int type) +_glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, + glusterd_volinfo_t *volinfo, + glusterd_brickinfo_t *brick, int type, + char *pid_dir) { pid_t pid; - int32_t ret = 0; - int status = 0; - char mountdir[] = "/tmp/mntXXXXXX"; - char logfile[PATH_MAX] = {0,}; - runner_t runner = {0}; - char *volfileserver = NULL; + int32_t ret = -1; + int status = 0; + char mountdir[PATH_MAX] = {0,}; + char logfile[PATH_MAX] = {0,}; + char brickpath[PATH_MAX] = {0,}; + char vol_id[PATH_MAX] = {0,}; + char pidfile[PATH_MAX] = {0,}; + runner_t runner = {0}; + char *volfileserver = NULL; + FILE *pidfp = NULL; + + GF_VALIDATE_OR_GOTO ("glusterd", THIS, out); + + GLUSTERD_GET_TMP_PATH (mountdir, "/"); + ret = sys_mkdir (mountdir, 0777); + if (ret && errno != EEXIST) { + gf_msg (THIS->name, GF_LOG_WARNING, errno, + GD_MSG_MOUNT_REQ_FAIL, "failed to create temporary " + "directory %s", mountdir); + ret = -1; + goto out; + } + strcat (mountdir, "mntXXXXXX"); if (mkdtemp (mountdir) == NULL) { - gf_msg_debug ("glusterd", 0, - "failed to create a temporary mount directory"); + gf_msg (THIS->name, GF_LOG_WARNING, errno, + GD_MSG_MOUNT_REQ_FAIL, "failed to create a temporary " + "mount directory: %s", mountdir); ret = -1; goto out; } + + GLUSTERD_REMOVE_SLASH_FROM_PATH (brick->path, brickpath); snprintf (logfile, sizeof (logfile), - DEFAULT_LOG_FILE_DIRECTORY"/%s-quota-crawl.log", volname); + DEFAULT_QUOTA_CRAWL_LOG_DIRECTORY"/%s.log", + brickpath); if (dict_get_str (THIS->options, "transport.socket.bind-address", &volfileserver) != 0) volfileserver = "localhost"; + snprintf (vol_id, sizeof (vol_id), "client_per_brick/%s.%s.%s.%s.vol", + volinfo->volname, "client", brick->hostname, brickpath); + runinit (&runner); - runner_add_args (&runner, SBIN_DIR"/glusterfs", - "-s", volfileserver, - "--volfile-id", volname, - "--use-readdirp=no", - "--client-pid", QUOTA_CRAWL_PID, - "-l", logfile, mountdir, NULL); + + if (type == GF_QUOTA_OPTION_TYPE_ENABLE || + type == GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS) + runner_add_args (&runner, SBIN_DIR"/glusterfs", + "-s", volfileserver, + "--volfile-id", vol_id, + "--use-readdirp=yes", + "--client-pid", QUOTA_CRAWL_PID, + "-l", logfile, mountdir, NULL); + else + runner_add_args (&runner, SBIN_DIR"/glusterfs", + "-s", volfileserver, + "--volfile-id", vol_id, + "--use-readdirp=no", + "--client-pid", QUOTA_CRAWL_PID, + "-l", logfile, mountdir, NULL); synclock_unlock (&priv->big_lock); ret = runner_run_reuse (&runner); @@ -272,7 +313,7 @@ glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, char *volname, runner_end (&runner); if ((pid = fork ()) < 0) { - gf_msg ("glusterd", GF_LOG_WARNING, 0, + gf_msg (THIS->name, GF_LOG_WARNING, 0, GD_MSG_FORK_FAIL, "fork from parent failed"); ret = -1; goto out; @@ -286,7 +327,7 @@ glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, char *volname, ret = chdir (mountdir); if (ret == -1) { - gf_msg ("glusterd", GF_LOG_WARNING, errno, + gf_msg (THIS->name, GF_LOG_WARNING, errno, GD_MSG_DIR_OP_FAILED, "chdir %s failed", mountdir); exit (EXIT_FAILURE); @@ -295,9 +336,7 @@ glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, char *volname, if (type == GF_QUOTA_OPTION_TYPE_ENABLE || type == GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS) - runner_add_args (&runner, "/usr/bin/find", ".", - "-exec", "/usr/bin/stat", - "{}", "\\", ";", NULL); + runner_add_args (&runner, "/usr/bin/find", ".", NULL); else if (type == GF_QUOTA_OPTION_TYPE_DISABLE) { @@ -321,8 +360,19 @@ glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, char *volname, } - if (runner_start (&runner) == -1) + if (runner_start (&runner) == -1) { + gf_umount_lazy ("glusterd", mountdir, 1); _exit (EXIT_FAILURE); + } + + snprintf (pidfile, sizeof (pidfile), "%s/%s.pid", pid_dir, + brickpath); + pidfp = fopen (pidfile, "w"); + if (pidfp) { + fprintf (pidfp, "%d\n", runner.chpid); + fflush (pidfp); + fclose (pidfp); + } #ifndef GF_LINUX_HOST_OS runner_end (&runner); /* blocks in waitpid */ @@ -338,6 +388,100 @@ out: return ret; } +void +glusterd_stop_all_quota_crawl_service (glusterd_conf_t *priv, + glusterd_volinfo_t *volinfo, int type) +{ + char pid_dir[PATH_MAX] = {0, }; + char pidfile[PATH_MAX] = {0,}; + struct dirent *entry = NULL; + DIR *dir = NULL; + + GLUSTERD_GET_QUOTA_CRAWL_PIDDIR (pid_dir, volinfo, type); + + dir = sys_opendir (pid_dir); + if (dir == NULL) + return; + + GF_FOR_EACH_ENTRY_IN_DIR (entry, dir); + while (entry) { + snprintf (pidfile, sizeof (pidfile), "%s/%s", + pid_dir, entry->d_name); + + glusterd_service_stop_nolock ("quota_crawl", pidfile, SIGKILL, + _gf_true); + sys_unlink (pidfile); + + GF_FOR_EACH_ENTRY_IN_DIR (entry, dir); + } + sys_closedir (dir); +} + +int32_t +glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv, + glusterd_volinfo_t *volinfo, int type) +{ + int32_t ret = -1; + glusterd_brickinfo_t *brick = NULL; + char pid_dir[PATH_MAX] = {0, }; + + GF_VALIDATE_OR_GOTO ("glusterd", THIS, out); + + ret = glusterd_generate_client_per_brick_volfile (volinfo); + if (ret) { + gf_msg (THIS->name, GF_LOG_ERROR, 0, + GD_MSG_GLUSTERD_OP_FAILED, + "failed to generate client volume file"); + goto out; + } + + ret = mkdir_p (DEFAULT_QUOTA_CRAWL_LOG_DIRECTORY, 0777, _gf_true); + if (ret) { + gf_msg (THIS->name, GF_LOG_ERROR, errno, + GD_MSG_GLUSTERD_OP_FAILED, + "failed to create dir %s: %s", + DEFAULT_QUOTA_CRAWL_LOG_DIRECTORY, strerror (errno)); + goto out; + } + + GLUSTERD_GET_QUOTA_CRAWL_PIDDIR (pid_dir, volinfo, type); + ret = mkdir_p (pid_dir, 0777, _gf_true); + if (ret) { + gf_msg (THIS->name, GF_LOG_ERROR, errno, + GD_MSG_GLUSTERD_OP_FAILED, + "failed to create dir %s: %s", + pid_dir, strerror (errno)); + goto out; + } + + /* When quota enable is performed, stop alreday running enable crawl + * process and start fresh crawl process. let disable process continue + * if running to cleanup the older xattrs + * When quota disable is performed, stop both enable/disable crawl + * process and start fresh crawl process to cleanup the xattrs + */ + glusterd_stop_all_quota_crawl_service (priv, volinfo, + GF_QUOTA_OPTION_TYPE_ENABLE); + if (type == GF_QUOTA_OPTION_TYPE_DISABLE) + glusterd_stop_all_quota_crawl_service (priv, volinfo, + GF_QUOTA_OPTION_TYPE_DISABLE); + + cds_list_for_each_entry (brick, &volinfo->bricks, brick_list) { + if (gf_uuid_compare (brick->uuid, MY_UUID)) + continue; + + ret = _glusterd_quota_initiate_fs_crawl (priv, volinfo, brick, + type, pid_dir); + + if (ret) + goto out; + } + + ret = 0; +out: + return ret; +} + int32_t glusterd_quota_get_default_soft_limit (glusterd_volinfo_t *volinfo, dict_t *rsp_dict) @@ -1539,7 +1683,7 @@ glusterd_op_quota (dict_t *dict, char **op_errstr, dict_t *rsp_dict) } if (rsp_dict && start_crawl == _gf_true) - glusterd_quota_initiate_fs_crawl (priv, volname, type); + glusterd_quota_initiate_fs_crawl (priv, volinfo, type); ret = 0; out: diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 807b4ecf5e6..216089db85a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1574,6 +1574,74 @@ out: return ret; } +int32_t +glusterd_service_stop_nolock (const char *service, char *pidfile, int sig, + gf_boolean_t force_kill) +{ + int32_t ret = -1; + pid_t pid = -1; + xlator_t *this = NULL; + FILE *file = NULL; + + this = THIS; + GF_ASSERT (this); + + file = fopen (pidfile, "r+"); + if (file) { + ret = fscanf (file, "%d", &pid); + if (ret <= 0) { + gf_msg_debug (this->name, 0, + "Unable to read pidfile: %s", pidfile); + goto out; + } + } + + if (kill (pid, 0) < 0) { + ret = 0; + gf_msg_debug (this->name, 0, "%s process not running: (%d) %s", + service, pid, strerror (errno)); + goto out; + } + gf_msg_debug (this->name, 0, "Stopping gluster %s service running with " + "pid: %d", service, pid); + + ret = kill (pid, sig); + if (ret) { + switch (errno) { + case ESRCH: + gf_msg_debug (this->name, 0, "%s is already stopped", + service); + ret = 0; + goto out; + default: + gf_msg (this->name, GF_LOG_ERROR, errno, + GD_MSG_SVC_KILL_FAIL, "Unable to kill %s " + "service, reason:%s", service, + strerror (errno)); + } + } + if (!force_kill) + goto out; + + sleep (1); + if (kill(pid, 0) == 0) { + ret = kill (pid, SIGKILL); + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, errno, + GD_MSG_PID_KILL_FAIL, "Unable to kill pid:%d, " + "reason:%s", pid, strerror(errno)); + goto out; + } + } + + ret = 0; + +out: + if (file) + fclose (file); + + return ret; +} void glusterd_set_socket_filepath (char *sock_filepath, char *sockpath, size_t len) { diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index 730bc657199..9f3c4a7098a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -127,6 +127,10 @@ int32_t glusterd_service_stop(const char *service, char *pidfile, int sig, gf_boolean_t force_kill); +int32_t +glusterd_service_stop_nolock (const char *service, char *pidfile, int sig, + gf_boolean_t force_kill); + int glusterd_get_next_available_brickid (glusterd_volinfo_t *volinfo); diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index 24e99d2be9f..23890238933 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -5081,7 +5081,7 @@ build_nfs_graph (volgen_graph_t *graph, dict_t *mod_dict) static void get_brick_filepath (char *filename, glusterd_volinfo_t *volinfo, - glusterd_brickinfo_t *brickinfo) + glusterd_brickinfo_t *brickinfo, char *prefix) { char path[PATH_MAX] = {0,}; char brick[PATH_MAX] = {0,}; @@ -5092,10 +5092,14 @@ get_brick_filepath (char *filename, glusterd_volinfo_t *volinfo, GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, brick); GLUSTERD_GET_VOLUME_DIR (path, volinfo, priv); - snprintf (filename, PATH_MAX, "%s/%s.%s.%s.vol", - path, volinfo->volname, - brickinfo->hostname, - brick); + if (prefix) + snprintf (filename, PATH_MAX, "%s/%s.%s.%s.%s.vol", + path, volinfo->volname, prefix, + brickinfo->hostname, brick); + else + snprintf (filename, PATH_MAX, "%s/%s.%s.%s.vol", + path, volinfo->volname, + brickinfo->hostname, brick); } gf_boolean_t @@ -5128,7 +5132,7 @@ glusterd_is_valid_volfpath (char *volname, char *brick) goto out; } strncpy (volinfo->volname, volname, sizeof (volinfo->volname)); - get_brick_filepath (volfpath, volinfo, brickinfo); + get_brick_filepath (volfpath, volinfo, brickinfo, NULL); ret = ((strlen(volfpath) < PATH_MAX) && strlen (strrchr(volfpath, '/')) < _POSIX_PATH_MAX); @@ -5153,7 +5157,7 @@ glusterd_generate_brick_volfile (glusterd_volinfo_t *volinfo, GF_ASSERT (volinfo); GF_ASSERT (brickinfo); - get_brick_filepath (filename, volinfo, brickinfo); + get_brick_filepath (filename, volinfo, brickinfo, NULL); ret = build_server_graph (&graph, volinfo, mod_dict, brickinfo); if (!ret) @@ -5417,6 +5421,55 @@ generate_single_transport_client_volfile (glusterd_volinfo_t *volinfo, return ret; } +int +glusterd_generate_client_per_brick_volfile (glusterd_volinfo_t *volinfo) +{ + char filepath[PATH_MAX] = {0, }; + glusterd_brickinfo_t *brick = NULL; + volgen_graph_t graph = {0, }; + dict_t *dict = NULL; + xlator_t *xl = NULL; + int ret = -1; + + dict = dict_new (); + if (!dict) + goto out; + + ret = dict_set_uint32 (dict, "trusted-client", GF_CLIENT_TRUSTED); + if (ret) + goto out; + + cds_list_for_each_entry (brick, &volinfo->bricks, brick_list) { + xl = volgen_graph_build_client (&graph, volinfo, + brick->hostname, brick->path, + brick->brick_id, + "tcp", dict); + if (!xl) { + ret = -1; + goto out; + } + + get_brick_filepath (filepath, volinfo, brick, "client"); + ret = volgen_write_volfile (&graph, filepath); + if (ret < 0) + goto out; + + volgen_graph_free (&graph); + memset (&graph, 0, sizeof (graph)); + } + + + ret = 0; +out: + if (ret) + volgen_graph_free (&graph); + + if (dict) + dict_unref (dict); + + return ret; +} + static void enumerate_transport_reqs (gf_transport_type type, char **types) { @@ -6089,7 +6142,7 @@ glusterd_delete_volfile (glusterd_volinfo_t *volinfo, GF_ASSERT (volinfo); GF_ASSERT (brickinfo); - get_brick_filepath (filename, volinfo, brickinfo); + get_brick_filepath (filename, volinfo, brickinfo, NULL); ret = sys_unlink (filename); if (ret) gf_msg ("glusterd", GF_LOG_ERROR, errno, diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.h b/xlators/mgmt/glusterd/src/glusterd-volgen.h index 9d206f692c1..df6d9e5da7e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.h +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.h @@ -176,6 +176,9 @@ glusterd_create_volfiles (glusterd_volinfo_t *volinfo); int glusterd_create_volfiles_and_notify_services (glusterd_volinfo_t *volinfo); +int +glusterd_generate_client_per_brick_volfile (glusterd_volinfo_t *volinfo); + void glusterd_get_nfs_filepath (char *filename); diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 587c2e82774..65ab156e41b 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -595,6 +595,11 @@ typedef ssize_t (*gd_serialize_t) (struct iovec outmsg, void *args); snprintf (abspath, sizeof (abspath)-1, \ DEFAULT_VAR_RUN_DIRECTORY"/%s%s", volname, path); +#define GLUSTERD_GET_TMP_PATH(abspath, path) do { \ + snprintf (abspath, sizeof (abspath)-1, \ + DEFAULT_VAR_RUN_DIRECTORY"/tmp%s", path); \ + } while (0) + #define GLUSTERD_REMOVE_SLASH_FROM_PATH(path,string) do { \ int i = 0; \ for (i = 1; i < strlen (path); i++) { \ @@ -623,6 +628,18 @@ typedef ssize_t (*gd_serialize_t) (struct iovec outmsg, void *args); quotadpath); \ } +#define GLUSTERD_GET_QUOTA_CRAWL_PIDDIR(piddir, volinfo, type) do { \ + char _volpath[PATH_MAX] = {0,}; \ + GLUSTERD_GET_VOLUME_DIR (_volpath, volinfo, priv); \ + if (type == GF_QUOTA_OPTION_TYPE_ENABLE || \ + type == GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS) \ + snprintf (piddir, PATH_MAX, "%s/run/quota/enable", \ + _volpath); \ + else \ + snprintf (piddir, PATH_MAX, "%s/run/quota/disable", \ + _volpath); \ + } while (0) + #define GLUSTERD_STACK_DESTROY(frame) do {\ frame->local = NULL; \ STACK_DESTROY (frame->root); \ |