From 073f871b1714f09382575b4afcd7a8e34c755625 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Sat, 28 Jan 2017 10:24:42 +0530 Subject: gluster-block: do not need --block-host option for list | info |delete From now we read the block-hosts from journal i.e targets meta file. Signed-off-by: Prasanna Kumar Kalever --- gluster-block.c | 35 ++++----------------- gluster-blockd.c | 96 +++++++++++++++++++++++++++++++++++++------------------- rpc/block.h | 3 -- rpc/block.x | 3 -- rpc/block_xdr.c | 6 ---- 5 files changed, 70 insertions(+), 73 deletions(-) diff --git a/gluster-block.c b/gluster-block.c index af131a1..fc749a9 100644 --- a/gluster-block.c +++ b/gluster-block.c @@ -239,21 +239,17 @@ glusterBlockCreate(int count, char **options, char *name) static int -glusterBlockList(char *volume, char *blkServers) +glusterBlockList(char *volume) { static blockListCli cobj; char *out = NULL; int ret = -1; strcpy(cobj.volume, volume); - if (GB_STRDUP(cobj.block_hosts, blkServers) < 0) { - return -1; - } ret = gluster_block_cli_1(&cobj, LIST_CLI, &out); MSG("%s", out); - GB_FREE(cobj.block_hosts); GB_FREE(out); return ret; @@ -261,7 +257,7 @@ glusterBlockList(char *volume, char *blkServers) static int -glusterBlockDelete(char* name, char* volume, char *blkServers) +glusterBlockDelete(char* name, char* volume) { static blockDeleteCli cobj; char *out = NULL; @@ -269,14 +265,10 @@ glusterBlockDelete(char* name, char* volume, char *blkServers) strcpy(cobj.block_name, name); strcpy(cobj.volume, volume); - if (GB_STRDUP(cobj.block_hosts, blkServers) < 0) { - return -1; - } ret = gluster_block_cli_1(&cobj, DELETE_CLI, &out); MSG("%s", out); - GB_FREE(cobj.block_hosts); GB_FREE(out); return ret; @@ -284,7 +276,7 @@ glusterBlockDelete(char* name, char* volume, char *blkServers) static int -glusterBlockInfo(char* name, char* volume, char *blkServers) +glusterBlockInfo(char* name, char* volume) { static blockInfoCli cobj; char *out = NULL; @@ -292,14 +284,10 @@ glusterBlockInfo(char* name, char* volume, char *blkServers) strcpy(cobj.block_name, name); strcpy(cobj.volume, volume); - if (GB_STRDUP(cobj.block_hosts, blkServers) < 0) { - return -1; - } ret = gluster_block_cli_1(&cobj, INFO_CLI, &out); MSG("%s", out); - GB_FREE(cobj.block_hosts); GB_FREE(out); return ret; @@ -313,7 +301,6 @@ glusterBlockParseArgs(int count, char **options) int ret = 0; int optFlag = 0; char *block = NULL; - char *blkServers = NULL; char *volume = NULL; while (1) { @@ -325,7 +312,6 @@ glusterBlockParseArgs(int count, char **options) {INFO, required_argument, 0, 'i'}, {MODIFY, required_argument, 0, 'm'}, {VOLUME, required_argument, 0, 'v'}, - {BLOCKHOST, required_argument, 0, 'b'}, {0, 0, 0, 0} }; @@ -340,12 +326,6 @@ glusterBlockParseArgs(int count, char **options) break; switch (c) { - case 'b': - blkServers = optarg; - if (optFlag) - goto opt; - break; - case 'v': volume = optarg; break; @@ -365,8 +345,6 @@ glusterBlockParseArgs(int count, char **options) goto out; optFlag = c; block = optarg; - if (blkServers) - goto opt; break; case 'm': @@ -383,20 +361,19 @@ glusterBlockParseArgs(int count, char **options) } } - opt: switch (optFlag) { case 'l': - ret = glusterBlockList(volume, blkServers); + ret = glusterBlockList(volume); if (ret) ERROR("%s", FAILED_LIST); break; case 'i': - ret = glusterBlockInfo(block, volume, blkServers); + ret = glusterBlockInfo(block, volume); if (ret) ERROR("%s", FAILED_INFO); break; case 'd': - ret = glusterBlockDelete(block, volume, blkServers); + ret = glusterBlockDelete(block, volume); if (ret) ERROR("%s", FAILED_DELETE); break; diff --git a/gluster-blockd.c b/gluster-blockd.c index 3e0ab91..9bd865c 100644 --- a/gluster-blockd.c +++ b/gluster-blockd.c @@ -303,7 +303,6 @@ block_create_cli_1_svc(blockCreateCli *blk, struct svc_req *rqstp) uuid_generate(uuid); uuid_unparse(uuid, gbid); - if (!glfs_access(glfs, blk->block_name, F_OK)) { GB_STRDUP(reply->out, "BLOCK Already EXIST"); reply->exit = EEXIST; @@ -317,17 +316,18 @@ block_create_cli_1_svc(blockCreateCli *blk, struct svc_req *rqstp) } METAUPDATE(tgfd, write, - "GBID: %s\nSIZE: %zu\nHA: %d\nENTRYCREATE: CONFIGINPROGRESS\n", + "GBID: %s\nSIZE: %zu\nHA: %d\nENTRYCREATE: INPROGRESS\n", gbid, blk->size, blk->mpath); ret = glusterBlockCreateEntry(blk, gbid); if (ret) { + METAUPDATE(tgfd, write, "ENTRYCREATE: FAIL\n"); ERROR("%s volume: %s host: %s", FAILED_CREATING_FILE, blk->volume, blk->volfileserver); goto out; } - METAUPDATE(tgfd, write, "ENTRYCREATE: CONFIGSUCCESS\n"); + METAUPDATE(tgfd, write, "ENTRYCREATE: SUCCESS\n"); if(GB_ALLOC(cobj) < 0) goto out; @@ -430,23 +430,49 @@ block_create_1_svc(blockCreate *blk, struct svc_req *rqstp) } +static int +block_delete_remote(struct glfs_fd *tgfd, blockDelete *cobj, char *addr, char **reply) +{ + char *write = NULL; + char *out = NULL; + char *tmp = NULL; + int ret; + + METAUPDATE(tgfd, write, "%s: CLEANUPINPROGRES\n", addr); + ret = gluster_block_1(addr, cobj, DELETE_SRV, &out); + if (ret) { + METAUPDATE(tgfd, write, "%s: CLEANUPFAIL\n", addr); + ERROR("%s on host: %s", + FAILED_GATHERING_INFO, addr); + goto out; + } + METAUPDATE(tgfd, write, "%s: CLEANUPSUCCESS\n", addr); + + asprintf(reply, "%s%s\n", (tmp==NULL?"":tmp), out); + if (tmp) + GB_FREE(tmp); + tmp = *reply; + GB_FREE(out); + + out: + return ret; +} + + blockResponse * block_delete_cli_1_svc(blockDeleteCli *blk, struct svc_req *rqstp) { size_t i = 0; int ret = -1; - char *out = NULL; char *savereply = NULL; - char *tmp = NULL; - blockServerDefPtr list = NULL; static blockDelete *cobj; static blockResponse *reply = NULL; struct glfs *glfs = NULL; struct glfs_fd *lkfd; struct glfs_fd *tgfd; struct flock lock = {0, }; - char *write; MetaInfo *info = NULL; + size_t cleanup_success = 0; glfs = glusterBlockVolumeInit(blk->volume, "localhost"); if (!glfs) { @@ -489,28 +515,41 @@ block_delete_cli_1_svc(blockDeleteCli *blk, struct svc_req *rqstp) strcpy(cobj->gbid, info->gbid); - list = blockServerParse(blk->block_hosts); - for (i = 0; i < list->nhosts; i++) { - METAUPDATE(tgfd, write, "%s: CLEANUPINPROGRES\n", list->hosts[i]); - ret = gluster_block_1(list->hosts[i], cobj, DELETE_SRV, &out); - if (ret) { - METAUPDATE(tgfd, write, "%s: CLEANUPFAIL\n", list->hosts[i]); - ERROR("%s on host: %s", - FAILED_GATHERING_INFO, list->hosts[i]); - goto out; + for (i = 0; i < info->nhosts; i++) { + switch (blockMetaStatusEnumParse(info->list[i]->status)) { + case CLEANUPINPROGRES: + case CLEANUPFAIL: + case CONFIGSUCCESS: + case CONFIGFAIL: + case CONFIGINPROGRESS: + ret = block_delete_remote(tgfd, cobj, info->list[i]->addr, &savereply); + break; } - METAUPDATE(tgfd, write, "%s: CLEANUPSUCCESS\n", list->hosts[i]); + } + blockFreeMetaInfo(info); - asprintf(&savereply, "%s%s\n", (tmp==NULL?"":tmp), out); - if (tmp) - GB_FREE(tmp); - tmp = savereply; - GB_FREE(out); + if (GB_ALLOC(info) < 0) + goto out; + + ret = blockGetMetaInfo(glfs, blk->block_name, info); + if(ret) + goto out; + + for (i = 0; i < info->nhosts; i++) { + if(blockMetaStatusEnumParse(info->list[i]->status) == CLEANUPSUCCESS) + cleanup_success++; } - if (glusterBlockDeleteEntry(blk->volume, info->gbid)) { - ERROR("%s volume: %s host: %s", - FAILED_DELETING_FILE, blk->volume, "localhost"); + if( cleanup_success == info->nhosts) { + if (glusterBlockDeleteEntry(blk->volume, info->gbid)) { + ERROR("%s volume: %s host: %s", + FAILED_DELETING_FILE, blk->volume, "localhost"); + } + ret = glfs_unlink(glfs, blk->block_name); + if (ret && errno != ENOENT) { + ERROR("%s", "glfs_unlink: failed"); + goto out; + } } out: @@ -523,12 +562,6 @@ block_delete_cli_1_svc(blockDeleteCli *blk, struct svc_req *rqstp) if (glfs_close(tgfd) != 0) ERROR("%s", "glfs_close: failed"); - ret = glfs_unlink(glfs, blk->block_name); - if (ret && errno != ENOENT) { - ERROR("%s", "glfs_unlink: failed"); - goto out; - } - METAUNLOCK(lock, lkfd); if (glfs_close(lkfd) != 0) @@ -536,7 +569,6 @@ block_delete_cli_1_svc(blockDeleteCli *blk, struct svc_req *rqstp) glfs_fini(glfs); - blockServerDefFree(list); GB_FREE(cobj); return reply; diff --git a/rpc/block.h b/rpc/block.h index 9c3ee9e..03d0ec4 100644 --- a/rpc/block.h +++ b/rpc/block.h @@ -37,7 +37,6 @@ typedef struct blockCreateCli blockCreateCli; struct blockDeleteCli { char block_name[255]; char volume[255]; - char *block_hosts; }; typedef struct blockDeleteCli blockDeleteCli; @@ -50,14 +49,12 @@ typedef struct blockDelete blockDelete; struct blockInfoCli { char block_name[255]; char volume[255]; - char *block_hosts; }; typedef struct blockInfoCli blockInfoCli; struct blockListCli { char volume[255]; u_quad_t offset; - char *block_hosts; }; typedef struct blockListCli blockListCli; diff --git a/rpc/block.x b/rpc/block.x index a5dce19..0bc988c 100644 --- a/rpc/block.x +++ b/rpc/block.x @@ -18,7 +18,6 @@ struct blockCreateCli { struct blockDeleteCli { char block_name[255]; char volume[255]; - string block_hosts<>; }; struct blockDelete { @@ -29,13 +28,11 @@ struct blockDelete { struct blockInfoCli { char block_name[255]; char volume[255]; - string block_hosts<>; }; struct blockListCli { char volume[255]; u_quad_t offset; /* dentry d_name offset */ - string block_hosts<>; }; struct blockResponse { diff --git a/rpc/block_xdr.c b/rpc/block_xdr.c index 8d05f3a..eb5d887 100644 --- a/rpc/block_xdr.c +++ b/rpc/block_xdr.c @@ -55,8 +55,6 @@ xdr_blockDeleteCli (XDR *xdrs, blockDeleteCli *objp) if (!xdr_vector (xdrs, (char *)objp->volume, 255, sizeof (char), (xdrproc_t) xdr_char)) return FALSE; - if (!xdr_string (xdrs, &objp->block_hosts, ~0)) - return FALSE; return TRUE; } @@ -81,8 +79,6 @@ xdr_blockInfoCli (XDR *xdrs, blockInfoCli *objp) if (!xdr_vector (xdrs, (char *)objp->volume, 255, sizeof (char), (xdrproc_t) xdr_char)) return FALSE; - if (!xdr_string (xdrs, &objp->block_hosts, ~0)) - return FALSE; return TRUE; } @@ -94,8 +90,6 @@ xdr_blockListCli (XDR *xdrs, blockListCli *objp) return FALSE; if (!xdr_u_quad_t (xdrs, &objp->offset)) return FALSE; - if (!xdr_string (xdrs, &objp->block_hosts, ~0)) - return FALSE; return TRUE; } -- cgit