summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPrasanna Kumar Kalever <prasanna.kalever@redhat.com>2017-01-28 10:24:42 +0530
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>2017-01-30 19:31:50 +0530
commit073f871b1714f09382575b4afcd7a8e34c755625 (patch)
treedfe5b6253a0c75c4edf01644bce27f86122d496e
parentf25b4e7326838c73d0a7a71bd64c8658e44f4219 (diff)
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 <prasanna.kalever@redhat.com>
-rw-r--r--gluster-block.c35
-rw-r--r--gluster-blockd.c96
-rw-r--r--rpc/block.h3
-rw-r--r--rpc/block.x3
-rw-r--r--rpc/block_xdr.c6
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;
}