summaryrefslogtreecommitdiffstats
path: root/cli/src
diff options
context:
space:
mode:
Diffstat (limited to 'cli/src')
-rw-r--r--cli/src/cli-cmd-parser.c41
-rw-r--r--cli/src/cli-cmd-volume.c28
-rw-r--r--cli/src/cli-rpc-ops.c8
-rw-r--r--cli/src/cli.c2
4 files changed, 65 insertions, 14 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c
index 692bd26e969..8a446595e79 100644
--- a/cli/src/cli-cmd-parser.c
+++ b/cli/src/cli-cmd-parser.c
@@ -13,6 +13,7 @@
#include <stdint.h>
#include <pthread.h>
#include <fnmatch.h>
+#include <time.h>
#include "cli.h"
#include "cli-cmd.h"
@@ -2366,6 +2367,9 @@ config_parse (const char **words, int wordcount, dict_t *dict,
char *append_str = NULL;
size_t append_len = 0;
char *subop = NULL;
+ char *ret_chkpt = NULL;
+ struct tm checkpoint_time;
+ char chkpt_buf[20] = "";
switch ((wordcount - 1) - cmdi) {
case 0:
@@ -2427,6 +2431,27 @@ config_parse (const char **words, int wordcount, dict_t *dict,
}
snprintf (append_str, 300, "%" GF_PRI_SECOND,
tv.tv_sec);
+ } else if ((strcmp (words[cmdi + 1], "checkpoint") == 0) &&
+ (strcmp (append_str, "now") != 0)) {
+ memset(&checkpoint_time, 0, sizeof(struct tm));
+ ret_chkpt = strptime(append_str, "%Y-%m-%d %H:%M:%S",
+ &checkpoint_time);
+
+ if (ret_chkpt == NULL) {
+ ret = -1;
+ cli_err ("Invalid Checkpoint label. Use format "
+ "\"Y-m-d H:M:S\", Example: 2016-10-25 15:30:45");
+ goto out;
+ }
+ GF_FREE (append_str);
+ append_str = GF_CALLOC (1, 300, cli_mt_append_str);
+ if (!append_str) {
+ ret = -1;
+ goto out;
+ }
+ strftime (chkpt_buf, sizeof(chkpt_buf), "%s",
+ &checkpoint_time);
+ snprintf (append_str, 300, "%s", chkpt_buf);
}
ret = dict_set_dynstr (dict, "op_value", append_str);
@@ -3586,7 +3611,8 @@ cli_cmd_volume_heal_options_parse (const char **words, int wordcount,
if (wordcount == 5) {
if (strcmp (words[3], "info") &&
- strcmp (words[3], "statistics")) {
+ strcmp (words[3], "statistics") &&
+ strcmp (words[3], "granular-entry-heal")) {
ret = -1;
goto out;
}
@@ -3616,6 +3642,19 @@ cli_cmd_volume_heal_options_parse (const char **words, int wordcount,
goto done;
}
}
+
+ if (!strcmp (words[3], "granular-entry-heal")) {
+ if (!strcmp (words[4], "enable")) {
+ ret = dict_set_int32 (dict, "heal-op",
+ GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE);
+ goto done;
+ } else if (!strcmp (words[4], "disable")) {
+ ret = dict_set_int32 (dict, "heal-op",
+ GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE);
+ goto done;
+ }
+ }
+
ret = -1;
goto out;
}
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c
index c721171f517..0d25279f381 100644
--- a/cli/src/cli-cmd-volume.c
+++ b/cli/src/cli-cmd-volume.c
@@ -2151,7 +2151,8 @@ cli_print_brick_status (cli_volume_status_t *status)
(op == GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME) ||\
(op == GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK) || \
(op == GF_SHD_OP_INDEX_SUMMARY) || \
- (op == GF_SHD_OP_SPLIT_BRAIN_FILES))
+ (op == GF_SHD_OP_SPLIT_BRAIN_FILES) || \
+ (op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE))
int
cli_launch_glfs_heal (int heal_op, dict_t *options)
@@ -2200,6 +2201,10 @@ cli_launch_glfs_heal (int heal_op, dict_t *options)
runner_add_args (&runner, "xml", NULL);
}
break;
+ case GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE:
+ case GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE:
+ runner_add_args (&runner, "granular-entry-heal-op", NULL);
+ break;
default:
ret = -1;
}
@@ -2211,11 +2216,11 @@ cli_launch_glfs_heal (int heal_op, dict_t *options)
printf ("%s", out);
}
ret = runner_end (&runner);
- ret = WEXITSTATUS (ret);
out:
return ret;
}
+
int
cli_cmd_volume_heal_cbk (struct cli_state *state, struct cli_cmd_word *word,
const char **words, int wordcount)
@@ -2252,19 +2257,19 @@ cli_cmd_volume_heal_cbk (struct cli_state *state, struct cli_cmd_word *word,
goto out;
if (NEEDS_GLFS_HEAL (heal_op)) {
ret = cli_launch_glfs_heal (heal_op, options);
- if (ret == -1)
+ if (ret < 0)
+ goto out;
+ if (heal_op != GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE)
goto out;
}
- else {
- proc = &cli_rpc_prog->proctable[GLUSTER_CLI_HEAL_VOLUME];
- CLI_LOCAL_INIT (local, words, frame, options);
+ proc = &cli_rpc_prog->proctable[GLUSTER_CLI_HEAL_VOLUME];
- if (proc->fn) {
- ret = proc->fn (frame, THIS, options);
- }
- }
+ CLI_LOCAL_INIT (local, words, frame, options);
+ if (proc->fn) {
+ ret = proc->fn (frame, THIS, options);
+ }
out:
if (ret) {
cli_cmd_sent_status_get (&sent);
@@ -2673,7 +2678,8 @@ struct cli_cmd volume_cmds[] = {
"statistics [heal-count [replica <HOSTNAME:BRICKNAME>]] |"
"info [healed | heal-failed | split-brain] |"
"split-brain {bigger-file <FILE> | latest-mtime <FILE> |"
- "source-brick <HOSTNAME:BRICKNAME> [<FILE>]}]",
+ "source-brick <HOSTNAME:BRICKNAME> [<FILE>]} |"
+ "granular-entry-heal {enable | disable}]",
cli_cmd_volume_heal_cbk,
"self-heal commands on volume specified by <VOLNAME>"},
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c
index d88ddd7f136..602d3ff1611 100644
--- a/cli/src/cli-rpc-ops.c
+++ b/cli/src/cli-rpc-ops.c
@@ -8670,6 +8670,14 @@ gf_cli_heal_volume_cbk (struct rpc_req *req, struct iovec *iov,
operation = "";
heal_op_str = "Disable heal";
break;
+ case GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE:
+ operation = "";
+ heal_op_str = "Enable granular entry heal";
+ break;
+ case GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE:
+ operation = "";
+ heal_op_str = "Disable granular entry heal";
+ break;
}
if (rsp.op_ret) {
diff --git a/cli/src/cli.c b/cli/src/cli.c
index 77d2a410fb4..fa507309e80 100644
--- a/cli/src/cli.c
+++ b/cli/src/cli.c
@@ -154,8 +154,6 @@ glusterfs_ctx_defaults_init (glusterfs_ctx_t *ctx)
LOCK_INIT (&pool->lock);
ctx->pool = pool;
- LOCK_INIT (&ctx->lock);
-
cmd_args = &ctx->cmd_args;
INIT_LIST_HEAD (&cmd_args->xlator_options);