From 7008073e1d00c1af0dc5913cdf5d94372f10088d Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Wed, 29 Nov 2017 17:44:50 +0530 Subject: delete: support [unlink-storage ] option $ gluster-block help gluster-block (0.3) usage: gluster-block [] [--json*] commands: [...] delete [unlink-storage ] [force] delete block device. [...] supported JSON formats: --json|--json-plain|--json-spaced|--json-pretty Change-Id: I64bc99a8519be6f90a7e8bc5558b0d7518661995 Fixes: #19 Signed-off-by: Prasanna Kumar Kalever --- cli/gluster-block.c | 57 +++++++++++++++++++++++++++++++++--------------- rpc/block_svc_routines.c | 12 +++++----- rpc/rpcl/block.x | 1 + 3 files changed, 47 insertions(+), 23 deletions(-) diff --git a/cli/gluster-block.c b/cli/gluster-block.c index dcf22a1..bfdaa18 100644 --- a/cli/gluster-block.c +++ b/cli/gluster-block.c @@ -19,11 +19,11 @@ "[prealloc ] [storage ] " \ " [--json*]" # define GB_DELETE_HELP_STR "gluster-block delete " \ - "[force] [--json*]" + "[unlink-storage ] [force] [--json*]" # define GB_MODIFY_HELP_STR "gluster-block modify " \ - " [--json*]" + " [--json*]" # define GB_REPLACE_HELP_STR "gluster-block replace " \ - " [force] [--json*]" + " [force] [--json*]" # define GB_INFO_HELP_STR "gluster-block info [--json*]" # define GB_LIST_HELP_STR "gluster-block list [--json*]" @@ -212,7 +212,7 @@ glusterBlockHelp(void) " info \n" " details about block device.\n" "\n" - " delete [force]\n" + " delete [unlink-storage ] [force]\n" " delete block device.\n" "\n" " modify \n" @@ -505,36 +505,59 @@ glusterBlockList(int argcount, char **options, int json) static int glusterBlockDelete(int argcount, char **options, int json) { - blockDeleteCli cobj = {0}; + blockDeleteCli dobj = {0}; + size_t optind = 2; int ret = -1; - if (argcount < 3 || argcount > 4) { + if (argcount < 3 || argcount > 6) { MSG("Inadequate arguments for delete:\n%s\n", GB_DELETE_HELP_STR); return -1; } - if (argcount == 4) { - if (strcmp(options[3], "force")) { - MSG("unknown option '%s' for delete:\n%s\n", options[3], GB_DELETE_HELP_STR); - return -1; + dobj.json_resp = json; + + /* default: delete storage */ + dobj.unlink = 1; + + if (glusterBlockParseVolumeBlock (options[optind++], dobj.volume, + dobj.block_name, sizeof(dobj.volume), + sizeof(dobj.block_name), GB_DELETE_HELP_STR, + "delete")) { + goto out; + } + + if ((argcount - optind) && !strcmp(options[optind], "unlink-storage")) { + optind++; + ret = convertStringToTrillianParse(options[optind++]); + if(ret >= 0) { + dobj.unlink = ret; } else { - cobj.force = true; + MSG("%s\n", "'unlink-storage' option is incorrect"); + MSG("%s\n", GB_DELETE_HELP_STR); + LOG("cli", GB_LOG_ERROR, "Delete failed while parsing argument " + "to unlink-storage for <%s/%s>", + dobj.volume, dobj.block_name); + goto out; } } - cobj.json_resp = json; + if ((argcount - optind) && !strcmp(options[optind], "force")) { + optind++; + dobj.force = true; + } - if (glusterBlockParseVolumeBlock (options[2], cobj.volume, cobj.block_name, - sizeof(cobj.volume), sizeof(cobj.block_name), - GB_DELETE_HELP_STR, "delete")) { + if (argcount - optind) { + MSG("Unknown option: '%s'\n%s\n", options[optind], GB_DELETE_HELP_STR); + LOG("cli", GB_LOG_ERROR, "Delete failed parsing argument unknow option '%s'" + " for <%s/%s>", options[optind], dobj.volume, dobj.block_name); goto out; } - ret = glusterBlockCliRPC_1(&cobj, DELETE_CLI); + ret = glusterBlockCliRPC_1(&dobj, DELETE_CLI); if (ret) { LOG("cli", GB_LOG_ERROR, "failed deleting block %s on volume %s", - cobj.block_name, cobj.volume); + dobj.block_name, dobj.volume); } out: diff --git a/rpc/block_svc_routines.c b/rpc/block_svc_routines.c index f6f532b..0d75652 100644 --- a/rpc/block_svc_routines.c +++ b/rpc/block_svc_routines.c @@ -2270,7 +2270,7 @@ optfail: static int glusterBlockCleanUp(struct glfs *glfs, char *blockname, - bool deleteall, bool forcedel, blockRemoteDeleteResp *drobj) + bool deleteall, bool forcedel, bool unlink, blockRemoteDeleteResp *drobj) { int ret = -1; size_t i; @@ -2328,7 +2328,7 @@ glusterBlockCleanUp(struct glfs *glfs, char *blockname, if (forcedel || cleanupsuccess == info->nhosts) { GB_METAUPDATE_OR_GOTO(lock, glfs, blockname, info->volume, ret, errMsg, out, "ENTRYDELETE: INPROGRESS\n"); - if (glusterBlockDeleteEntry(glfs, info->volume, info->gbid)) { + if (unlink && glusterBlockDeleteEntry(glfs, info->volume, info->gbid)) { GB_METAUPDATE_OR_GOTO(lock, glfs, blockname, info->volume, ret, errMsg, out, "ENTRYDELETE: FAIL\n"); LOG("mgmt", GB_LOG_ERROR, "%s %s for block %s", FAILED_DELETING_FILE, @@ -2415,7 +2415,7 @@ glusterBlockAuditRequest(struct glfs *glfs, "No Spare nodes to create (%s): rollingback creation of target" " on volume %s with given hosts %s", blk->block_name, blk->volume, blk->block_hosts); - glusterBlockCleanUp(glfs, blk->block_name, TRUE, FALSE, (*reply)->obj); + glusterBlockCleanUp(glfs, blk->block_name, TRUE, FALSE, TRUE, (*reply)->obj); needcleanup = FALSE; /* already clean attempted */ ret = -1; goto out; @@ -2424,7 +2424,7 @@ glusterBlockAuditRequest(struct glfs *glfs, "Not enough Spare nodes for (%s): rollingback creation of target" " on volume %s with given hosts %s", blk->block_name, blk->volume, blk->block_hosts); - glusterBlockCleanUp(glfs, blk->block_name, TRUE, FALSE, (*reply)->obj); + glusterBlockCleanUp(glfs, blk->block_name, TRUE, FALSE, TRUE, (*reply)->obj); needcleanup = FALSE; /* already clean attempted */ ret = -1; goto out; @@ -2455,7 +2455,7 @@ glusterBlockAuditRequest(struct glfs *glfs, out: if (needcleanup) { - glusterBlockCleanUp(glfs, blk->block_name, FALSE, FALSE, (*reply)->obj); + glusterBlockCleanUp(glfs, blk->block_name, FALSE, FALSE, TRUE, (*reply)->obj); } blockFreeMetaInfo(info); @@ -3616,7 +3616,7 @@ block_delete_cli_1_svc_st(blockDeleteCli *blk, struct svc_req *rqstp) goto out; } - errCode = glusterBlockCleanUp(glfs, blk->block_name, TRUE, TRUE, savereply); + errCode = glusterBlockCleanUp(glfs, blk->block_name, TRUE, TRUE, blk->unlink, savereply); if (errCode) { LOG("mgmt", GB_LOG_WARNING, "glusterBlockCleanUp: return %d " "on block %s for volume %s", errCode, blk->block_name, blk->volume); diff --git a/rpc/rpcl/block.x b/rpc/rpcl/block.x index e3fcbd1..c976b3e 100644 --- a/rpc/rpcl/block.x +++ b/rpc/rpcl/block.x @@ -56,6 +56,7 @@ struct blockCreateCli { struct blockDeleteCli { char block_name[255]; char volume[255]; + bool unlink; bool force; enum JsonResponseFormat json_resp; }; -- cgit