diff options
-rw-r--r-- | libglusterfs/src/fd-lk.c | 21 | ||||
-rw-r--r-- | libglusterfs/src/fd-lk.h | 3 | ||||
-rw-r--r-- | libglusterfs/src/statedump.c | 3 | ||||
-rw-r--r-- | xlators/protocol/client/src/client-handshake.c | 20 | ||||
-rw-r--r-- | xlators/protocol/client/src/client-helpers.c | 26 | ||||
-rw-r--r-- | xlators/protocol/client/src/client.c | 62 | ||||
-rw-r--r-- | xlators/protocol/client/src/client.h | 2 |
7 files changed, 109 insertions, 28 deletions
diff --git a/libglusterfs/src/fd-lk.c b/libglusterfs/src/fd-lk.c index 8df43bb602f..4e10d649ee9 100644 --- a/libglusterfs/src/fd-lk.c +++ b/libglusterfs/src/fd-lk.c @@ -129,6 +129,27 @@ fd_lk_ctx_ref (fd_lk_ctx_t *lk_ctx) } fd_lk_ctx_t * +fd_lk_ctx_try_ref (fd_lk_ctx_t *lk_ctx) +{ + int ret = -1; + fd_lk_ctx_t *new_lk_ctx = NULL; + + if (!lk_ctx) { + goto out; + } + + ret = TRY_LOCK (&lk_ctx->lock); + if (ret) + goto out; + + new_lk_ctx = _fd_lk_ctx_ref (lk_ctx); + UNLOCK (&lk_ctx->lock); + +out: + return new_lk_ctx; +} + +fd_lk_ctx_t * fd_lk_ctx_create () { fd_lk_ctx_t *fd_lk_ctx = NULL; diff --git a/libglusterfs/src/fd-lk.h b/libglusterfs/src/fd-lk.h index 3e419e14377..7adbb5131b7 100644 --- a/libglusterfs/src/fd-lk.h +++ b/libglusterfs/src/fd-lk.h @@ -60,6 +60,9 @@ fd_lk_ctx_t * fd_lk_ctx_ref (fd_lk_ctx_t *lk_ctx); fd_lk_ctx_t * +fd_lk_ctx_try_ref (fd_lk_ctx_t *lk_ctx); + +fd_lk_ctx_t * fd_lk_ctx_create (); int diff --git a/libglusterfs/src/statedump.c b/libglusterfs/src/statedump.c index 9b15c5ba50d..f438c5a61ea 100644 --- a/libglusterfs/src/statedump.c +++ b/libglusterfs/src/statedump.c @@ -30,7 +30,8 @@ #endif /* MALLOC_H */ /* We don't want gf_log in this function because it may cause - 'deadlock' with statedump */ + 'deadlock' with statedump. This is because statedump happens + inside a signal handler and cannot afford to block on a lock.*/ #ifdef gf_log # undef gf_log #endif diff --git a/xlators/protocol/client/src/client-handshake.c b/xlators/protocol/client/src/client-handshake.c index 34222f845a1..6d6e8ebc77b 100644 --- a/xlators/protocol/client/src/client-handshake.c +++ b/xlators/protocol/client/src/client-handshake.c @@ -470,22 +470,6 @@ out: } int -client_fd_lk_list_empty (fd_lk_ctx_t *lk_ctx) -{ - int ret = 1; - - GF_VALIDATE_OR_GOTO ("client", lk_ctx, out); - - LOCK (&lk_ctx->lock); - { - ret = list_empty (&lk_ctx->lk_list); - } - UNLOCK (&lk_ctx->lock); -out: - return ret; -} - -int client_fd_lk_count (fd_lk_ctx_t *lk_ctx) { int count = 0; @@ -789,7 +773,7 @@ client_reacquire_lock (xlator_t *this, clnt_fd_ctx_t *fdctx) int32_t ret = -1; fd_lk_ctx_t *lk_ctx = NULL; - if (client_fd_lk_list_empty (fdctx->lk_ctx)) { + if (client_fd_lk_list_empty (fdctx->lk_ctx, _gf_false)) { gf_log (this->name, GF_LOG_WARNING, "fd lock list is empty"); decrement_reopen_fd_count (this, (clnt_conf_t *)this->private); @@ -874,7 +858,7 @@ client3_1_reopen_cbk (struct rpc_req *req, struct iovec *iov, int count, fdctx->remote_fd = rsp.fd; if (!fdctx->released) { list_add_tail (&fdctx->sfd_pos, &conf->saved_fds); - if (!client_fd_lk_list_empty (fdctx->lk_ctx)) + if (!client_fd_lk_list_empty (fdctx->lk_ctx, _gf_false)) attempt_lock_recovery = _gf_true; fdctx = NULL; } diff --git a/xlators/protocol/client/src/client-helpers.c b/xlators/protocol/client/src/client-helpers.c index b9b0a0edf61..8cf83fe3094 100644 --- a/xlators/protocol/client/src/client-helpers.c +++ b/xlators/protocol/client/src/client-helpers.c @@ -26,6 +26,32 @@ #include "fd.h" +int +client_fd_lk_list_empty (fd_lk_ctx_t *lk_ctx, gf_boolean_t try_lock) +{ + int ret = 1; + + if (!lk_ctx) { + ret = -1; + goto out; + } + + if (try_lock) { + ret = TRY_LOCK (&lk_ctx->lock); + if (ret != 0) { + ret = -1; + goto out; + } + } else { + LOCK (&lk_ctx->lock); + } + + ret = list_empty (&lk_ctx->lk_list); + UNLOCK (&lk_ctx->lock); +out: + return ret; +} + clnt_fd_ctx_t * this_fd_del_ctx (fd_t *file, xlator_t *this) { diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index 19c8a62ee86..b954906c1ce 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -2409,6 +2409,54 @@ fini (xlator_t *this) return; } +static void +client_fd_lk_ctx_dump (xlator_t *this, fd_lk_ctx_t *lk_ctx, int nth_fd) +{ + gf_boolean_t use_try_lock = _gf_true; + int ret = -1; + int lock_no = 0; + fd_lk_ctx_t *lk_ctx_ref = NULL; + fd_lk_ctx_node_t *plock = NULL; + char key[GF_DUMP_MAX_BUF_LEN] = {0,}; + + lk_ctx_ref = fd_lk_ctx_try_ref (lk_ctx); + if (!lk_ctx_ref) + return; + + ret = client_fd_lk_list_empty (lk_ctx_ref, (use_try_lock = _gf_true)); + if (ret != 0) + return; + + ret = TRY_LOCK (&lk_ctx_ref->lock); + if (ret) + return; + + gf_proc_dump_write ("------","------"); + + lock_no = 0; + list_for_each_entry (plock, &lk_ctx_ref->lk_list, next) { + snprintf (key, sizeof (key), "granted-posix-lock[%d]", + lock_no++); + gf_proc_dump_write (key, "owner = %s, cmd = %s " + "fl_type = %s, fl_start = %" + PRId64", fl_end = %"PRId64 + ", user_flock: l_type = %s, " + "l_start = %"PRId64", l_len = %"PRId64, + lkowner_utoa (&plock->user_flock.l_owner), + get_lk_cmd (plock->cmd), + get_lk_type (plock->fl_type), + plock->fl_start, plock->fl_end, + get_lk_type (plock->user_flock.l_type), + plock->user_flock.l_start, + plock->user_flock.l_len); + } + gf_proc_dump_write ("------","------"); + + UNLOCK (&lk_ctx_ref->lock); + fd_lk_ctx_unref (lk_ctx_ref); + +} + int client_priv_dump (xlator_t *this) { @@ -2423,18 +2471,12 @@ client_priv_dump (xlator_t *this) return -1; conf = this->private; - if (!conf) { - gf_log (this->name, GF_LOG_WARNING, - "conf null in xlator"); + if (!conf) return -1; - } ret = pthread_mutex_trylock(&conf->lock); - if (ret) { - gf_log(this->name, GF_LOG_WARNING, "Unable to lock client %s" - " errno: %d", this->name, errno); + if (ret) return -1; - } gf_proc_dump_build_key(key_prefix, "xlator.protocol.client", "%s.priv", this->name); @@ -2442,8 +2484,10 @@ client_priv_dump (xlator_t *this) gf_proc_dump_add_section(key_prefix); list_for_each_entry(tmp, &conf->saved_fds, sfd_pos) { - sprintf (key, "fd.%d.remote_fd", ++i); + sprintf (key, "fd.%d.remote_fd", i); gf_proc_dump_write(key, "%d", tmp->remote_fd); + client_fd_lk_ctx_dump (this, tmp->lk_ctx, i); + i++; } gf_proc_dump_write("connecting", "%d", conf->connecting); diff --git a/xlators/protocol/client/src/client.h b/xlators/protocol/client/src/client.h index f5f3aa1fec8..1f8f75cece5 100644 --- a/xlators/protocol/client/src/client.h +++ b/xlators/protocol/client/src/client.h @@ -229,4 +229,6 @@ int32_t client_type_to_gf_type (short l_type); int client_mark_fd_bad (xlator_t *this); int client_set_lk_version (xlator_t *this); + +int client_fd_lk_list_empty (fd_lk_ctx_t *lk_ctx, gf_boolean_t use_try_lock); #endif /* !_CLIENT_H */ |