diff options
author | Poornima G <pgurusid@redhat.com> | 2016-04-04 07:13:09 -0400 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2017-11-20 08:20:35 +0000 |
commit | c810ea1e2ba5c15b11808e2bd378e95c428b7f96 (patch) | |
tree | 1e9cbed99b85c37747e02b6da85fc3493e445cae | |
parent | 1c7041fd6b4be82415866dc19b9b2a5b41bd1396 (diff) |
rpc : Change the way client uuid is built
Problem:
Today the main users of client uuid are protocol layers, locks, leases.
Protocol layers requires each client uuid to be unique, even across
connects and disconnects. Locks and leases on the server side also use
the same client uid which changes across file migrations. Which makes the graph
switch and file migration tedious for locks and leases.
file migration across bricks becomes difficult as client uuid for the same
client, is different on the other brick.
The exact set of issues exists for leases as well.
Solution would be to introduce a constant in the client-uid string which
the locks and leases can use to identify the owner client across bricks.
Client uuid currently:
%s(ctx uuid)-%s(protocol client name)-%d(graph id)%s(setvolume count/reconnect count)
Proposed Client uuid:
"CTX_ID:%s-GRAPH_ID:%d-PID:%d-HOST:%s-PC_NAME:%s-RECON_NO:%s"
- CTX_ID: This is will be constant per client.
- GRAPH_ID, PID, HOST, PC_NAME(protocol client name), RECON_NO(setvolume count)
remains the same.
Change-Id: Ia81d57a9693207cd325d7b26aee4593fcbd6482c
BUG: 1369028
Signed-off-by: Susant Palai <spalai@redhat.com>
-rw-r--r-- | libglusterfs/src/common-utils.c | 29 | ||||
-rw-r--r-- | rpc/rpc-lib/src/protocol-common.h | 1 | ||||
-rw-r--r-- | xlators/protocol/client/src/client-handshake.c | 15 |
3 files changed, 18 insertions, 27 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 3da01a4d117..68d2e243f58 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -3082,32 +3082,13 @@ _gf_timestuff (gf_timefmts *fmt, const char ***fmts, const char ***zeros) char * generate_glusterfs_ctx_id (void) { - char tmp_str[1024] = {0,}; - char hostname[256] = {0,}; - struct timeval tv = {0,}; - char now_str[32]; + uuid_t ctxid; + char *tmp = NULL; - if (gettimeofday (&tv, NULL) == -1) { - gf_msg ("glusterfsd", GF_LOG_ERROR, errno, - LG_MSG_GETTIMEOFDAY_FAILED, "gettimeofday: " - "failed"); - } - - if (gethostname (hostname, 256) == -1) { - gf_msg ("glusterfsd", GF_LOG_ERROR, errno, - LG_MSG_GETHOSTNAME_FAILED, "gethostname: failed"); - } - - gf_time_fmt (now_str, sizeof now_str, tv.tv_sec, gf_timefmt_Ymd_T); - snprintf (tmp_str, sizeof tmp_str, "%s-%d-%s:%" -#ifdef GF_DARWIN_HOST_OS - PRId32, -#else - "ld", -#endif - hostname, getpid(), now_str, tv.tv_usec); + gf_uuid_generate (ctxid); + tmp = uuid_utoa (ctxid); - return gf_strdup (tmp_str); + return gf_strdup (tmp); } char * diff --git a/rpc/rpc-lib/src/protocol-common.h b/rpc/rpc-lib/src/protocol-common.h index d4b64e16796..ccb3c5002b4 100644 --- a/rpc/rpc-lib/src/protocol-common.h +++ b/rpc/rpc-lib/src/protocol-common.h @@ -360,4 +360,5 @@ typedef enum gf_get_snapshot_info_type gf_get_snapshot_info_type; #define GD_VOLUME_NAME_MAX 256 /* Maximum size of volume name */ +#define GLUSTER_PROCESS_UUID_FMT "CTX_ID:%s-GRAPH_ID:%d-PID:%d-HOST:%s-PC_NAME:%s-RECON_NO:%s" #endif /* !_PROTOCOL_COMMON_H */ diff --git a/xlators/protocol/client/src/client-handshake.c b/xlators/protocol/client/src/client-handshake.c index 587e256b51a..ca3d140d08e 100644 --- a/xlators/protocol/client/src/client-handshake.c +++ b/xlators/protocol/client/src/client-handshake.c @@ -1312,6 +1312,7 @@ client_setvolume (xlator_t *this, struct rpc_clnt *rpc) clnt_conf_t *conf = NULL; dict_t *options = NULL; char counter_str[32] = {0}; + char hostname[256] = {0,}; options = this->options; conf = this->private; @@ -1354,9 +1355,17 @@ client_setvolume (xlator_t *this, struct rpc_clnt *rpc) "-%"PRIu64, conf->setvol_count); conf->setvol_count++; } - ret = gf_asprintf (&process_uuid_xl, "%s-%s-%d%s", - this->ctx->process_uuid, this->name, - this->graph->id, counter_str); + + if (gethostname (hostname, 256) == -1) { + gf_msg (this->name, GF_LOG_ERROR, errno, + LG_MSG_GETHOSTNAME_FAILED, "gethostname: failed"); + + goto fail; + } + + ret = gf_asprintf (&process_uuid_xl, GLUSTER_PROCESS_UUID_FMT, + this->ctx->process_uuid, this->graph->id, getpid(), + hostname, this->name, counter_str); if (-1 == ret) { gf_msg (this->name, GF_LOG_ERROR, 0, PC_MSG_PROCESS_UUID_SET_FAIL, "asprintf failed while " |