From 7e29a1a2496a922457bdeb02332e9b78c97b4d81 Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Wed, 22 Mar 2017 12:43:20 +0530 Subject: gluster-block: support json response This is how cli response looks like, on supplying '--json*' flag to cmd-args: $ gluster-block create block-test/sample-block1 ha 1 localhost.localdomain 1GiB --json (or) $ gluster-block create block-test/sample-block2 ha 1 localhost.localdomain 1GiB --json-spaced { "IQN": "iqn.2016-12.org.gluster-block:681af106-85f1-4a02-a122-57c80903458c", \ "PORTAL(S)": [ "localhost.localdomain:3260" ], "RESULT": "SUCCESS" } $ gluster-block create block-test/sample-block3 ha 1 localhost.localdomain 1GiB --json-plain {"IQN":"iqn.2016-12.org.gluster-block:0fdf6647-57f2-477f-8dd4-54a3de06e410",\ "PORTAL(S)":["localhost.localdomain:3260"],"RESULT":"SUCCESS"} $ gluster-block create block-test/sample-block4 ha 1 localhost.localdomain 1GiB --json-pretty { "IQN":"iqn.2016-12.org.gluster-block:e92ca4a0-5325-4c4b-a407-9e75790e4c7f", "PORTAL(S)":[ "localhost.localdomain:3260" ], "RESULT":"SUCCESS" } Change-Id: Ie51039e3dee0b3357d2347b4087e0fbe299aa29e Fixes: #3 Signed-off-by: Prasanna Kumar Kalever --- rpc/glfs-operations.c | 76 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 26 deletions(-) (limited to 'rpc/glfs-operations.c') diff --git a/rpc/glfs-operations.c b/rpc/glfs-operations.c index e61f2b5..007d519 100644 --- a/rpc/glfs-operations.c +++ b/rpc/glfs-operations.c @@ -15,7 +15,7 @@ struct glfs * -glusterBlockVolumeInit(char *volume) +glusterBlockVolumeInit(char *volume, int *errCode, char **errMsg) { struct glfs *glfs; int ret; @@ -23,29 +23,36 @@ glusterBlockVolumeInit(char *volume) glfs = glfs_new(volume); if (!glfs) { + *errCode = errno; + GB_ASPRINTF (errMsg, "Not able to Initialize volume %s [%s]", volume, + strerror(*errCode)); LOG("gfapi", GB_LOG_ERROR, "glfs_new(%s) from %s failed[%s]", volume, - "localhost", strerror(errno)); + "localhost", strerror(*errCode)); return NULL; } ret = glfs_set_volfile_server(glfs, "tcp", "localhost", 24007); if (ret) { + *errCode = errno; + GB_ASPRINTF (errMsg, "Not able to add Volfile server for volume %s[%s]", + volume, strerror(*errCode)); LOG("gfapi", GB_LOG_ERROR, "glfs_set_volfile_server(%s) of %s " - "failed[%s]", "localhost", volume, strerror(errno)); + "failed[%s]", "localhost", volume, strerror(*errCode)); goto out; } ret = glfs_set_logging(glfs, GFAPI_LOG_FILE, GFAPI_LOG_LEVEL); if (ret) { + *errCode = errno; + GB_ASPRINTF (errMsg, "Not able to add logging for volume %s[%s]", volume, + strerror(*errCode)); LOG("gfapi", GB_LOG_ERROR, "glfs_set_logging(%s, %d) on %s failed[%s]", - GFAPI_LOG_FILE, GFAPI_LOG_LEVEL, volume, strerror(errno)); + GFAPI_LOG_FILE, GFAPI_LOG_LEVEL, volume, strerror(*errCode)); goto out; } ret = glfs_init(glfs); if (ret) { - LOG("gfapi", GB_LOG_ERROR, "glfs_init() on %s failed[%s]", volume, - strerror(errno) ); goto out; } @@ -59,16 +66,15 @@ glusterBlockVolumeInit(char *volume) int -glusterBlockCreateEntry(struct glfs *glfs, - blockCreateCli *blk, - char *gbid) +glusterBlockCreateEntry(struct glfs *glfs, blockCreateCli *blk, char *gbid, + int *errCode, char **errMsg) { struct glfs_fd *tgfd; int ret; - ret = glfs_mkdir (glfs, GB_STOREDIR, 0); if (ret && errno != EEXIST) { + *errCode = errno; LOG("gfapi", GB_LOG_ERROR, "glfs_mkdir(%s) on volume %s for block %s failed[%s]", GB_STOREDIR, blk->volume, blk->block_name, strerror(errno)); @@ -77,6 +83,7 @@ glusterBlockCreateEntry(struct glfs *glfs, ret = glfs_chdir (glfs, GB_STOREDIR); if (ret) { + *errCode = errno; LOG("gfapi", GB_LOG_ERROR, "glfs_chdir(%s) on volume %s for block %s failed[%s]", GB_STOREDIR, blk->volume, blk->block_name, strerror(errno)); @@ -87,6 +94,7 @@ glusterBlockCreateEntry(struct glfs *glfs, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); if (!tgfd) { + *errCode = errno; LOG("gfapi", GB_LOG_ERROR, "glfs_creat(%s) on volume %s for block %s failed[%s]", gbid, blk->volume, blk->block_name, strerror(errno)); @@ -95,6 +103,7 @@ glusterBlockCreateEntry(struct glfs *glfs, } else { ret = glfs_ftruncate(tgfd, blk->size); if (ret) { + *errCode = errno; LOG("gfapi", GB_LOG_ERROR, "glfs_ftruncate(%s): on volume %s for block %s" "of size %zu failed[%s]", gbid, blk->volume, blk->block_name, @@ -118,6 +127,7 @@ glusterBlockCreateEntry(struct glfs *glfs, } if (tgfd && glfs_close(tgfd) != 0) { + *errCode = errno; LOG("gfapi", GB_LOG_ERROR, "glfs_close(%s): on volume %s for block %s failed[%s]", gbid, blk->volume, blk->block_name, strerror(errno)); @@ -127,6 +137,10 @@ glusterBlockCreateEntry(struct glfs *glfs, } out: + if (ret) { + GB_ASPRINTF (errMsg, "Not able to create metadata for %s/%s[%s]", blk->volume, + blk->block_name, strerror(*errCode)); + } return ret; } @@ -156,7 +170,8 @@ glusterBlockDeleteEntry(struct glfs *glfs, char *volume, char *gbid) struct glfs_fd * -glusterBlockCreateMetaLockFile(struct glfs *glfs, char *volume) +glusterBlockCreateMetaLockFile(struct glfs *glfs, char *volume, int *errCode, + char **errMsg) { struct glfs_fd *lkfd; int ret; @@ -164,28 +179,33 @@ glusterBlockCreateMetaLockFile(struct glfs *glfs, char *volume) ret = glfs_mkdir (glfs, GB_METADIR, 0); if (ret && errno != EEXIST) { + *errCode = errno; LOG("gfapi", GB_LOG_ERROR, "glfs_mkdir(%s) on volume %s failed[%s]", - GB_METADIR, volume, strerror(errno)); + GB_METADIR, volume, strerror(*errCode)); goto out; } ret = glfs_chdir (glfs, GB_METADIR); if (ret) { + *errCode = errno; LOG("gfapi", GB_LOG_ERROR, "glfs_chdir(%s) on volume %s failed[%s]", - GB_METADIR, volume, strerror(errno)); + GB_METADIR, volume, strerror(*errCode)); goto out; } lkfd = glfs_creat(glfs, GB_TXLOCKFILE, O_RDWR, S_IRUSR | S_IWUSR); if (!lkfd) { + *errCode = errno; LOG("gfapi", GB_LOG_ERROR, "glfs_creat(%s) on volume %s failed[%s]", - GB_TXLOCKFILE, volume, strerror(errno)); + GB_TXLOCKFILE, volume, strerror(*errCode)); goto out; } return lkfd; out: + GB_ASPRINTF (errMsg, "Not able to create Metadata on volume %s[%s]", volume, + strerror (*errCode)); return NULL; } @@ -301,36 +321,36 @@ blockStuffMetaInfo(MetaInfo *info, char *line) int -blockGetMetaInfo(struct glfs* glfs, char* metafile, MetaInfo *info) +blockGetMetaInfo(struct glfs* glfs, char* metafile, MetaInfo *info, + int *errCode) { size_t count = 0; struct glfs_fd *tgmfd = NULL; char line[1024]; + char fpath[PATH_MAX] = {0}; char *tmp; int ret; - - ret = glfs_chdir (glfs, GB_METADIR); - if (ret) { - LOG("gfapi", GB_LOG_ERROR, - "glfs_chdir(%s) on volume %s for block %s failed[%s]", - GB_METADIR, info->volume, metafile, strerror(errno)); - goto out; - } - - tgmfd = glfs_open(glfs, metafile, O_RDONLY); + snprintf(fpath, sizeof fpath, "%s/%s", GB_METADIR, metafile); + tgmfd = glfs_open(glfs, fpath, O_RDONLY); if (!tgmfd) { + if (errCode) { + *errCode = errno; + } LOG("gfapi", GB_LOG_ERROR, "glfs_open(%s) on volume %s failed[%s]", metafile, info->volume, strerror(errno)); ret = -1; goto out; } - while (glfs_read (tgmfd, line, sizeof(line), 0) > 0) { + while ((ret = glfs_read (tgmfd, line, sizeof(line), 0)) > 0) { tmp = strtok(line,"\n"); count += strlen(tmp) + 1; ret = blockStuffMetaInfo(info, tmp); if (ret) { + if (errCode) { + *errCode = errno; + } LOG("gfapi", GB_LOG_ERROR, "blockStuffMetaInfo: on volume %s for block %s failed[%s]", info->volume, metafile, strerror(errno)); @@ -338,6 +358,10 @@ blockGetMetaInfo(struct glfs* glfs, char* metafile, MetaInfo *info) } glfs_lseek(tgmfd, count, SEEK_SET); } + if (ret < 0 && errCode) {/*Failure from glfs_read*/ + *errCode = errno; + goto out; + } out: if (tgmfd && glfs_close(tgmfd) != 0) { -- cgit