diff options
-rw-r--r-- | xlators/protocol/server/src/server-helpers.c | 164 | ||||
-rw-r--r-- | xlators/protocol/server/src/server-helpers.h | 6 | ||||
-rw-r--r-- | xlators/protocol/server/src/server.h | 5 | ||||
-rw-r--r-- | xlators/protocol/server/src/server3_1-fops.c | 16 |
4 files changed, 141 insertions, 50 deletions
diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c index 69fb5f6a..1ef58fc1 100644 --- a/xlators/protocol/server/src/server-helpers.c +++ b/xlators/protocol/server/src/server-helpers.c @@ -149,11 +149,11 @@ free_state (server_state_t *state) int gf_add_locker (struct _lock_table *table, const char *volume, - loc_t *loc, fd_t *fd, pid_t pid, uint64_t owner) + loc_t *loc, fd_t *fd, pid_t pid, uint64_t owner, + glusterfs_fop_t type) { int32_t ret = -1; struct _locker *new = NULL; - uint8_t dir = 0; new = GF_CALLOC (1, sizeof (struct _locker), gf_server_mt_locker_t); if (new == NULL) { @@ -167,10 +167,8 @@ gf_add_locker (struct _lock_table *table, const char *volume, if (fd == NULL) { loc_copy (&new->loc, loc); - dir = IA_ISDIR (new->loc.inode->ia_type); } else { new->fd = fd_ref (fd); - dir = IA_ISDIR (fd->inode->ia_type); } new->pid = pid; @@ -178,10 +176,10 @@ gf_add_locker (struct _lock_table *table, const char *volume, LOCK (&table->lock); { - if (dir) - list_add_tail (&new->lockers, &table->dir_lockers); + if (type == GF_FOP_ENTRYLK) + list_add_tail (&new->lockers, &table->entrylk_lockers); else - list_add_tail (&new->lockers, &table->file_lockers); + list_add_tail (&new->lockers, &table->inodelk_lockers); } UNLOCK (&table->lock); out: @@ -191,29 +189,22 @@ out: int gf_del_locker (struct _lock_table *table, const char *volume, - loc_t *loc, fd_t *fd, uint64_t owner) + loc_t *loc, fd_t *fd, uint64_t owner, glusterfs_fop_t type) { struct _locker *locker = NULL; struct _locker *tmp = NULL; int32_t ret = 0; - uint8_t dir = 0; struct list_head *head = NULL; struct list_head del; INIT_LIST_HEAD (&del); - if (fd) { - dir = IA_ISDIR (fd->inode->ia_type); - } else { - dir = IA_ISDIR (loc->inode->ia_type); - } - LOCK (&table->lock); { - if (dir) { - head = &table->dir_lockers; + if (type == GF_FOP_ENTRYLK) { + head = &table->entrylk_lockers; } else { - head = &table->file_lockers; + head = &table->inodelk_lockers; } list_for_each_entry_safe (locker, tmp, head, lockers) { @@ -260,8 +251,8 @@ gf_lock_table_new (void) "failed to allocate memory for new lock table"); goto out; } - INIT_LIST_HEAD (&new->dir_lockers); - INIT_LIST_HEAD (&new->file_lockers); + INIT_LIST_HEAD (&new->entrylk_lockers); + INIT_LIST_HEAD (&new->inodelk_lockers); LOCK_INIT (&new->lock); out: return new; @@ -285,23 +276,25 @@ int do_lock_table_cleanup (xlator_t *this, server_connection_t *conn, call_frame_t *frame, struct _lock_table *ltable) { - struct list_head file_lockers, dir_lockers; + struct list_head inodelk_lockers, entrylk_lockers; call_frame_t *tmp_frame = NULL; struct gf_flock flock = {0, }; xlator_t *bound_xl = NULL; struct _locker *locker = NULL, *tmp = NULL; int ret = -1; + char *path = NULL; + char gfid [40] = {0, }; bound_xl = conn->bound_xl; - INIT_LIST_HEAD (&file_lockers); - INIT_LIST_HEAD (&dir_lockers); + INIT_LIST_HEAD (&inodelk_lockers); + INIT_LIST_HEAD (&entrylk_lockers); LOCK (<able->lock); { - list_splice_init (<able->file_lockers, - &file_lockers); + list_splice_init (<able->inodelk_lockers, + &inodelk_lockers); - list_splice_init (<able->dir_lockers, &dir_lockers); + list_splice_init (<able->entrylk_lockers, &entrylk_lockers); } UNLOCK (<able->lock); @@ -311,7 +304,7 @@ do_lock_table_cleanup (xlator_t *this, server_connection_t *conn, flock.l_start = 0; flock.l_len = 0; list_for_each_entry_safe (locker, - tmp, &file_lockers, lockers) { + tmp, &inodelk_lockers, lockers) { tmp_frame = copy_frame (frame); if (tmp_frame == NULL) { gf_log (this->name, GF_LOG_ERROR, @@ -327,12 +320,31 @@ do_lock_table_cleanup (xlator_t *this, server_connection_t *conn, tmp_frame->root->trans = conn; if (locker->fd) { + GF_ASSERT (locker->fd->inode); + + ret = inode_path (locker->fd->inode, NULL, &path); + + if (ret > 0) { + gf_log (this->name, GF_LOG_INFO, "finodelk " + "released on %s", path); + GF_FREE (path); + } else { + uuid_unparse (locker->fd->inode->gfid, gfid); + + gf_log (this->name, GF_LOG_INFO, "finodelk " + "released on ino %"PRId64" with gfid %s", + locker->fd->inode->ino, gfid); + } + STACK_WIND (tmp_frame, server_nop_cbk, bound_xl, bound_xl->fops->finodelk, locker->volume, locker->fd, F_SETLK, &flock); fd_unref (locker->fd); } else { + gf_log (this->name, GF_LOG_INFO, "inodelk released " + "on %s", locker->loc.path); + STACK_WIND (tmp_frame, server_nop_cbk, bound_xl, bound_xl->fops->inodelk, locker->volume, @@ -348,7 +360,7 @@ do_lock_table_cleanup (xlator_t *this, server_connection_t *conn, tmp = NULL; locker = NULL; - list_for_each_entry_safe (locker, tmp, &dir_lockers, lockers) { + list_for_each_entry_safe (locker, tmp, &entrylk_lockers, lockers) { tmp_frame = copy_frame (frame); tmp_frame->root->lk_owner = 0; @@ -356,6 +368,21 @@ do_lock_table_cleanup (xlator_t *this, server_connection_t *conn, tmp_frame->root->trans = conn; if (locker->fd) { + GF_ASSERT (locker->fd->inode); + + ret = inode_path (locker->fd->inode, NULL, &path); + + if (ret > 0) { + gf_log (this->name, GF_LOG_INFO, "fentrylk " + "released on %s", path); + GF_FREE (path); + } else { + uuid_unparse (locker->fd->inode->gfid, gfid); + + gf_log (this->name, GF_LOG_INFO, "fentrylk " + "released on ino %lu", locker->fd->inode->ino); + } + STACK_WIND (tmp_frame, server_nop_cbk, bound_xl, bound_xl->fops->fentrylk, locker->volume, @@ -363,6 +390,9 @@ do_lock_table_cleanup (xlator_t *this, server_connection_t *conn, ENTRYLK_UNLOCK, ENTRYLK_WRLCK); fd_unref (locker->fd); } else { + gf_log (this->name, GF_LOG_INFO, "entrylk released " + "on %s", locker->loc.path); + STACK_WIND (tmp_frame, server_nop_cbk, bound_xl, bound_xl->fops->entrylk, locker->volume, @@ -408,6 +438,8 @@ do_fd_cleanup (xlator_t *this, server_connection_t *conn, call_frame_t *frame, int i = 0, ret = -1; call_frame_t *tmp_frame = NULL; xlator_t *bound_xl = NULL; + char *path = NULL; + char gfid [40] = {0, }; bound_xl = conn->bound_xl; for (i = 0;i < fd_count; i++) { @@ -420,6 +452,23 @@ do_fd_cleanup (xlator_t *this, server_connection_t *conn, call_frame_t *frame, "out of memory"); goto out; } + + GF_ASSERT (fd->inode); + + ret = inode_path (fd->inode, NULL, &path); + + if (ret > 0) { + gf_log (this->name, GF_LOG_INFO, "fd cleanup on " + "%s", path); + GF_FREE (path); + } else { + uuid_unparse (fd->inode->gfid, gfid); + + gf_log (this->name, GF_LOG_INFO, "fd cleanup on " + "ino %"PRId64" with gfid %s", + fd->inode->ino, gfid); + } + tmp_frame->local = fd; tmp_frame->root->pid = 0; @@ -520,8 +569,8 @@ server_connection_destroy (xlator_t *this, server_connection_t *conn) xlator_t *bound_xl = NULL; int32_t ret = -1; server_state_t *state = NULL; - struct list_head file_lockers; - struct list_head dir_lockers; + struct list_head inodelk_lockers; + struct list_head entrylk_lockers; struct _lock_table *ltable = NULL; struct _locker *locker = NULL, *tmp = NULL; struct gf_flock flock = {0,}; @@ -529,6 +578,8 @@ server_connection_destroy (xlator_t *this, server_connection_t *conn) int32_t i = 0; fdentry_t *fdentries = NULL; uint32_t fd_count = 0; + char *path = NULL; + char gfid [40] = {0, }; if (conn == NULL) { ret = 0; @@ -552,16 +603,16 @@ server_connection_destroy (xlator_t *this, server_connection_t *conn) } pthread_mutex_unlock (&conn->lock); - INIT_LIST_HEAD (&file_lockers); - INIT_LIST_HEAD (&dir_lockers); + INIT_LIST_HEAD (&inodelk_lockers); + INIT_LIST_HEAD (&entrylk_lockers); if (ltable) { LOCK (<able->lock); { - list_splice_init (<able->file_lockers, - &file_lockers); + list_splice_init (<able->inodelk_lockers, + &inodelk_lockers); - list_splice_init (<able->dir_lockers, &dir_lockers); + list_splice_init (<able->entrylk_lockers, &entrylk_lockers); } UNLOCK (<able->lock); GF_FREE (ltable); @@ -571,7 +622,7 @@ server_connection_destroy (xlator_t *this, server_connection_t *conn) flock.l_start = 0; flock.l_len = 0; list_for_each_entry_safe (locker, - tmp, &file_lockers, lockers) { + tmp, &inodelk_lockers, lockers) { tmp_frame = copy_frame (frame); /* lock_owner = 0 is a special case that tells posix-locks @@ -581,12 +632,31 @@ server_connection_destroy (xlator_t *this, server_connection_t *conn) tmp_frame->root->trans = conn; if (locker->fd) { + GF_ASSERT (locker->fd->inode); + + ret = inode_path (locker->fd->inode, NULL, &path); + + if (ret > 0) { + gf_log (this->name, GF_LOG_INFO, "finodelk " + "released on %s", path); + GF_FREE (path); + } else { + uuid_unparse (locker->fd->inode->gfid, gfid); + + gf_log (this->name, GF_LOG_INFO, "finodelk " + "released on ino %"PRId64 "with gfid %s", + locker->fd->inode->ino, gfid); + } + STACK_WIND (tmp_frame, server_nop_cbk, bound_xl, bound_xl->fops->finodelk, locker->volume, locker->fd, F_SETLK, &flock); fd_unref (locker->fd); } else { + gf_log (this->name, GF_LOG_INFO, "inodelk " + "released on %s", locker->loc.path); + STACK_WIND (tmp_frame, server_nop_cbk, bound_xl, bound_xl->fops->inodelk, locker->volume, @@ -602,13 +672,30 @@ server_connection_destroy (xlator_t *this, server_connection_t *conn) tmp = NULL; locker = NULL; - list_for_each_entry_safe (locker, tmp, &dir_lockers, lockers) { + list_for_each_entry_safe (locker, tmp, &entrylk_lockers, lockers) { tmp_frame = copy_frame (frame); tmp_frame->root->lk_owner = 0; tmp_frame->root->trans = conn; if (locker->fd) { + GF_ASSERT (locker->fd->inode); + + ret = inode_path (locker->fd->inode, NULL, &path); + + if (ret > 0) { + gf_log (this->name, GF_LOG_INFO, "fentrylk " + "released on %s", path); + + GF_FREE (path); + } else { + uuid_unparse (locker->fd->inode->gfid, gfid); + + gf_log (this->name, GF_LOG_INFO, "fentrylk " + "released on ino %"PRId64" and gfid= %s", + locker->fd->inode->ino, gfid); + } + STACK_WIND (tmp_frame, server_nop_cbk, bound_xl, bound_xl->fops->fentrylk, locker->volume, @@ -616,6 +703,9 @@ server_connection_destroy (xlator_t *this, server_connection_t *conn) ENTRYLK_UNLOCK, ENTRYLK_WRLCK); fd_unref (locker->fd); } else { + gf_log (this->name, GF_LOG_INFO, "entrylk " + "released on %s", locker->loc.path); + STACK_WIND (tmp_frame, server_nop_cbk, bound_xl, bound_xl->fops->entrylk, locker->volume, diff --git a/xlators/protocol/server/src/server-helpers.h b/xlators/protocol/server/src/server-helpers.h index 2da95fe2..4fe03db2 100644 --- a/xlators/protocol/server/src/server-helpers.h +++ b/xlators/protocol/server/src/server-helpers.h @@ -52,13 +52,15 @@ gf_add_locker (struct _lock_table *table, const char *volume, loc_t *loc, fd_t *fd, pid_t pid, - uint64_t owner); + uint64_t owner, + glusterfs_fop_t type); int32_t gf_del_locker (struct _lock_table *table, const char *volume, loc_t *loc, fd_t *fd, - uint64_t owner); + uint64_t owner, + glusterfs_fop_t type); void server_print_request (call_frame_t *frame); diff --git a/xlators/protocol/server/src/server.h b/xlators/protocol/server/src/server.h index 562ac5b8..c9e14d00 100644 --- a/xlators/protocol/server/src/server.h +++ b/xlators/protocol/server/src/server.h @@ -44,13 +44,12 @@ struct _locker { }; struct _lock_table { - struct list_head file_lockers; - struct list_head dir_lockers; + struct list_head inodelk_lockers; + struct list_head entrylk_lockers; gf_lock_t lock; size_t count; }; - /* private structure per connection (transport object) * used as transport_t->xl_private */ diff --git a/xlators/protocol/server/src/server3_1-fops.c b/xlators/protocol/server/src/server3_1-fops.c index fb3010e2..d18133b2 100644 --- a/xlators/protocol/server/src/server3_1-fops.c +++ b/xlators/protocol/server/src/server3_1-fops.c @@ -239,11 +239,11 @@ server_inodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (op_ret >= 0) { if (state->flock.l_type == F_UNLCK) gf_del_locker (conn->ltable, state->volume, - &state->loc, NULL, frame->root->lk_owner); + &state->loc, NULL, frame->root->lk_owner, GF_FOP_INODELK); else gf_add_locker (conn->ltable, state->volume, &state->loc, NULL, frame->root->pid, - frame->root->lk_owner); + frame->root->lk_owner, GF_FOP_INODELK); } else if (op_errno != ENOSYS) { gf_log (this->name, GF_LOG_TRACE, "%"PRId64": INODELK %s (%"PRId64") ==> %"PRId32" (%s)", @@ -280,12 +280,12 @@ server_finodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (state->flock.l_type == F_UNLCK) gf_del_locker (conn->ltable, state->volume, NULL, state->fd, - frame->root->lk_owner); + frame->root->lk_owner, GF_FOP_INODELK); else gf_add_locker (conn->ltable, state->volume, NULL, state->fd, frame->root->pid, - frame->root->lk_owner); + frame->root->lk_owner, GF_FOP_INODELK); } else if (op_errno != ENOSYS) { gf_log (this->name, GF_LOG_TRACE, "%"PRId64": FINODELK %"PRId64" (%"PRId64") ==> %"PRId32" (%s)", @@ -320,11 +320,11 @@ server_entrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (op_ret >= 0) { if (state->cmd == ENTRYLK_UNLOCK) gf_del_locker (conn->ltable, state->volume, - &state->loc, NULL, frame->root->lk_owner); + &state->loc, NULL, frame->root->lk_owner, GF_FOP_ENTRYLK); else gf_add_locker (conn->ltable, state->volume, &state->loc, NULL, frame->root->pid, - frame->root->lk_owner); + frame->root->lk_owner, GF_FOP_ENTRYLK); } else if (op_errno != ENOSYS) { gf_log (this->name, GF_LOG_TRACE, "%"PRId64": INODELK %s (%"PRId64") ==> %"PRId32" (%s)", @@ -358,11 +358,11 @@ server_fentrylk_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (op_ret >= 0) { if (state->cmd == ENTRYLK_UNLOCK) gf_del_locker (conn->ltable, state->volume, - NULL, state->fd, frame->root->lk_owner); + NULL, state->fd, frame->root->lk_owner, GF_FOP_ENTRYLK); else gf_add_locker (conn->ltable, state->volume, NULL, state->fd, frame->root->pid, - frame->root->lk_owner); + frame->root->lk_owner, GF_FOP_ENTRYLK); } else if (op_errno != ENOSYS) { gf_log (this->name, GF_LOG_TRACE, "%"PRId64": FENTRYLK %"PRId64" (%"PRId64") " |