diff options
author | Prasanna Kumar Kalever <prasanna.kalever@redhat.com> | 2017-01-20 12:13:37 +0530 |
---|---|---|
committer | Prasanna Kumar Kalever <prasanna.kalever@redhat.com> | 2017-01-30 19:31:50 +0530 |
commit | 683b6ba3f17a9bbf876c66f5d4b7a9d573d8853f (patch) | |
tree | a2bf7cbcda416818d663613284b29e16b2b533c3 /gluster-blockd.c | |
parent | 4ef14866295c1328a11f9a06cfc3bc1db9b1e7b6 (diff) |
gluster-block: listen on unix and inet
from now We basically have 2 RPC connections,
1. Between gluster block CLI and local gluster-blockd
This connection is basically UNIX/local netid ,listening on
/var/run/gluster-blockd.socket file.
The CLI always Send/Receive the commands to/from the local
gluster-blockd via local rpc.
2. Between gluster-blockd's, i.e local (to cli) gluster-blockd and the
gluster-blockd's running on remote(blockhost)
This is the tcp connection. The rpc requests are listening on 24006
Also from now gluster-blockd is multi threaded (As of now 2 threads)
Lets consider the Create Request to understand what each thread solves
Thread1 (THE CLI THREAD)
* Listening on local RPC
* Generate the GBID (UUID) and create the entry with name GBID in the
given volume with a requested size.
* And Send the Configuration requests to remote hosts,
waits for the replies
(HINt: after this point Read Thread2 and come back)
* Return to CLI.
Thread 2 (THE SERVER THREAD)
* Listens on 24006
* On Receiving an event, read the structure.
* Executes the required "targetcli bla bla bla" command locally
* Fills the command exitcode and the output in the RPC reply structure
and send reply
Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
Diffstat (limited to 'gluster-blockd.c')
-rw-r--r-- | gluster-blockd.c | 133 |
1 files changed, 127 insertions, 6 deletions
diff --git a/gluster-blockd.c b/gluster-blockd.c index 18506ac..6b73c8b 100644 --- a/gluster-blockd.c +++ b/gluster-blockd.c @@ -1,15 +1,135 @@ #define _GNU_SOURCE /* See feature_test_macros(7) */ -#include <stdio.h> +#include <stdio.h> +#include <netdb.h> +#include <sys/socket.h> +# include <uuid/uuid.h> #include "rpc/block.h" #include "utils.h" +#include "glfs-operations.h" +# define UUID_BUF_SIZE 256 +# define CFG_STRING_SIZE 256 -blockTrans * -block_exec_1_svc(char **cmd, struct svc_req *rqstp) +# define LIST "list" +# define CREATE "create" +# define DELETE "delete" +# define INFO "info" +# define MODIFY "modify" +# define BLOCKHOST "block-host" +# define HELP "help" + +# define GLFS_PATH "/backstores/user:glfs" +# define TARGETCLI_GLFS "targetcli "GLFS_PATH +# define TARGETCLI_ISCSI "targetcli /iscsi" +# define TARGETCLI_SAVE "targetcli / saveconfig" +# define ATTRIBUTES "generate_node_acls=1 demo_mode_write_protect=0" +# define BACKEND_CFGSTR "ls | grep ' %s ' | cut -d'[' -f2 | cut -d']' -f1" +# define LUNS_LIST "ls | grep -v user:glfs | cut -d'-' -f2 | cut -d' ' -f2" + +# define IQN_PREFIX "iqn.2016-12.org.gluster-block:" + +# define MSERVER_DELIMITER "," + +blockResponse * +block_create_cli_1_svc(blockCreateCli *blk, struct svc_req *rqstp) +{ + //FILE *fp; + CLIENT *clnt; + int sockfd; + struct hostent *server; + struct sockaddr_in sain; + int ret; + uuid_t out; + static blockCreate *cobj; + static blockResponse *reply; + char *gbid = CALLOC(UUID_BUF_SIZE); + + uuid_generate(out); + uuid_unparse(out,gbid); + + ret = glusterBlockCreateEntry(blk, gbid); + if (ret) { + ERROR("%s volume: %s host: %s", + FAILED_CREATING_FILE, blk->volume, blk->volfileserver); + goto out; + } + + if(GB_ALLOC(cobj) < 0) + goto out; + + strcpy(cobj->volume, blk->volume); + strcpy(cobj->volfileserver, blk->volfileserver); + strcpy(cobj->block_name, blk->block_name); + cobj->size = blk->size; + strcpy(cobj->gbid, gbid); + + //for + + if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { + perror("gluster-blockd: socket"); + exit(1); + } + server = gethostbyname(blk->block_hosts); + if (server == NULL) { + fprintf(stderr,"ERROR, no such host\n"); + exit(0); + } + + bzero((char *) &sain, sizeof(sain)); + sain.sin_family = AF_INET; + bcopy((char *)server->h_addr, (char *)&sain.sin_addr.s_addr, server->h_length); + sain.sin_port = htons(24006); + + if (connect(sockfd, (struct sockaddr *) &sain, sizeof(sain)) < 0) { + perror("gluster-blockd: connect"); + exit(1); + } + + clnt = clnttcp_create ((struct sockaddr_in *) &sain, GLUSTER_BLOCK, GLUSTER_BLOCK_VERS, &sockfd, 0, 0); + if (clnt == NULL) { + clnt_pcreateerror ("localhost"); + exit (1); + } + + reply = block_create_1(cobj, clnt); + if (reply == NULL) { + clnt_perror (clnt, "call failed gluster-blockd"); + } + + clnt_destroy (clnt); + +out: + return reply; +} + + +blockResponse * +block_create_1_svc(blockCreate *blk, struct svc_req *rqstp) { FILE *fp; - static blockTrans *obj; + char *backstore = NULL; + char *iqn = NULL; + char *lun = NULL; + char *attr = NULL; + char *exec = NULL; + blockResponse *obj = NULL; + + asprintf(&backstore, "%s %s %s %zu %s@%s/%s %s", TARGETCLI_GLFS, + CREATE, blk->block_name, blk->size, blk->volume, blk->volfileserver, + blk->gbid, blk->gbid); + + asprintf(&iqn, "%s %s %s%s", TARGETCLI_ISCSI, CREATE, IQN_PREFIX, blk->gbid); + + + asprintf(&lun, "%s/%s%s/tpg1/luns %s %s/%s", + TARGETCLI_ISCSI, IQN_PREFIX, blk->gbid, CREATE, GLFS_PATH, blk->block_name); + + asprintf(&attr, "%s/%s%s/tpg1 set attribute %s", + TARGETCLI_ISCSI, IQN_PREFIX, blk->gbid, ATTRIBUTES); + + + asprintf(&exec, "%s && %s && %s && %s && %s", backstore, iqn, lun, attr, TARGETCLI_SAVE); if(GB_ALLOC(obj) < 0) return NULL; @@ -19,9 +139,9 @@ block_exec_1_svc(char **cmd, struct svc_req *rqstp) return NULL; } - fp = popen(*cmd, "r"); + fp = popen(exec, "r"); if (fp != NULL) { - size_t newLen = fread(obj->out, sizeof(char), 4996, fp); + size_t newLen = fread(obj->out, sizeof(char), 4096, fp); if (ferror( fp ) != 0) { ERROR("%s", "Error reading command output\n"); } else { @@ -32,3 +152,4 @@ block_exec_1_svc(char **cmd, struct svc_req *rqstp) return obj; } + |