From be003fbb3ac7a1f1021774ecb75a4929f1ba85d4 Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Thu, 15 Dec 2011 16:51:02 +0530 Subject: cluster/afr: Handle fini for afr,pump Change-Id: Idc0a05a8a25f278a7ab05e242263e0a5001bde18 Signed-off-by: Pranith Kumar K BUG: 767862 Reviewed-on: http://review.gluster.com/800 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- xlators/cluster/afr/src/afr-common.c | 41 +++++++++++++++++++--- xlators/cluster/afr/src/afr.c | 38 ++++++++------------- xlators/cluster/afr/src/afr.h | 5 --- xlators/cluster/afr/src/pump.c | 66 ++++++++++++++++++++---------------- xlators/cluster/afr/src/pump.h | 2 +- 5 files changed, 89 insertions(+), 63 deletions(-) diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index c00c80b9f..22b30fdfa 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -3366,11 +3366,6 @@ afr_priv_dump (xlator_t *this) gf_proc_dump_write("entry-change_log", "%d", priv->entry_change_log); gf_proc_dump_write("read_child", "%d", priv->read_child); gf_proc_dump_write("favorite_child", "%d", priv->favorite_child); - gf_proc_dump_write("data_lock_server_count", "%u", priv->data_lock_server_count); - gf_proc_dump_write("metadata_lock_server_count", "%u", - priv->metadata_lock_server_count); - gf_proc_dump_write("entry_lock_server_count", "%u", - priv->entry_lock_server_count); gf_proc_dump_write("wait_count", "%u", priv->wait_count); return 0; @@ -3893,3 +3888,39 @@ afr_have_quorum (char *logname, afr_private_t *priv) out: return _gf_false; } + +void +afr_priv_destroy (afr_private_t *priv) +{ + int i = 0; + + if (!priv) + goto out; + inode_unref (priv->root_inode); + GF_FREE (priv->shd.pos); + GF_FREE (priv->last_event); + if (priv->pending_key) { + for (i = 0; i < priv->child_count; i++) + GF_FREE (priv->pending_key[i]); + } + GF_FREE (priv->pending_key); + GF_FREE (priv->children); + GF_FREE (priv->child_up); + LOCK_DESTROY (&priv->lock); + LOCK_DESTROY (&priv->read_child_lock); + pthread_mutex_destroy (&priv->mutex); + GF_FREE (priv); +out: + return; +} + +int +xlator_subvolume_count (xlator_t *this) +{ + int i = 0; + xlator_list_t *list = NULL; + + for (list = this->children; list; list = list->next) + i++; + return i; +} diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index c66f386f2..f3c3e7e7a 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -85,18 +85,6 @@ xlator_subvolume_index (xlator_t *this, xlator_t *subvol) return index; } - -int -xlator_subvolume_count (xlator_t *this) -{ - int i = 0; - xlator_list_t *list = NULL; - - for (list = this->children; list; list = list->next) - i++; - return i; -} - void fix_quorum_options (xlator_t *this, afr_private_t *priv, char *qtype) { @@ -219,6 +207,16 @@ init (xlator_t *this) ALLOC_OR_GOTO (this->private, afr_private_t, out); priv = this->private; + LOCK_INIT (&priv->lock); + LOCK_INIT (&priv->read_child_lock); + //lock recovery is not done in afr + pthread_mutex_init (&priv->mutex, NULL); + INIT_LIST_HEAD (&priv->saved_fds); + + child_count = xlator_subvolume_count (this); + + priv->child_count = child_count; + priv->read_child = -1; @@ -287,13 +285,6 @@ init (xlator_t *this) priv->wait_count = 1; - child_count = xlator_subvolume_count (this); - - priv->child_count = child_count; - - LOCK_INIT (&priv->lock); - LOCK_INIT (&priv->read_child_lock); - priv->child_up = GF_CALLOC (sizeof (unsigned char), child_count, gf_afr_mt_char); if (!priv->child_up) { @@ -356,13 +347,9 @@ init (xlator_t *this) goto out; } - LOCK_INIT (&priv->root_inode_lk); priv->first_lookup = 1; priv->root_inode = NULL; - pthread_mutex_init (&priv->mutex, NULL); - INIT_LIST_HEAD (&priv->saved_fds); - ret = 0; out: return ret; @@ -372,6 +359,11 @@ out: int fini (xlator_t *this) { + afr_private_t *priv = NULL; + + priv = this->private; + this->private = NULL; + afr_priv_destroy (priv); return 0; } diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 70239d2c6..8568f1fd8 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -104,7 +104,6 @@ typedef struct _afr_private { xlator_t **children; - gf_lock_t root_inode_lk; int first_lookup; inode_t *root_inode; @@ -130,10 +129,6 @@ typedef struct _afr_private { int favorite_child; /* subvolume to be preferred in resolving split-brain cases */ - unsigned int data_lock_server_count; - unsigned int metadata_lock_server_count; - unsigned int entry_lock_server_count; - gf_boolean_t inodelk_trace; gf_boolean_t entrylk_trace; diff --git a/xlators/cluster/afr/src/pump.c b/xlators/cluster/afr/src/pump.c index 5bb602bcd..1814c8b9d 100644 --- a/xlators/cluster/afr/src/pump.c +++ b/xlators/cluster/afr/src/pump.c @@ -140,9 +140,7 @@ pump_set_resume_path (xlator_t *this, const char *path) LOCK (&pump_priv->resume_path_lock); { - pump_priv->resume_path = strdup (path); - if (!pump_priv->resume_path) - ret = -1; + strncpy (pump_priv->resume_path, path, strlen (path) + 1); } UNLOCK (&pump_priv->resume_path_lock); @@ -453,7 +451,6 @@ out: if (free_entries) gf_dirent_free (&entries); return 0; - } static int @@ -2385,6 +2382,20 @@ init (xlator_t *this) ALLOC_OR_GOTO (this->private, afr_private_t, out); priv = this->private; + LOCK_INIT (&priv->lock); + LOCK_INIT (&priv->read_child_lock); + //lock recovery is not done in afr + pthread_mutex_init (&priv->mutex, NULL); + INIT_LIST_HEAD (&priv->saved_fds); + + child_count = xlator_subvolume_count (this); + if (child_count != 2) { + gf_log (this->name, GF_LOG_ERROR, + "There should be exactly 2 children - one source " + "and one sink"); + return -1; + } + priv->child_count = child_count; priv->read_child = source_child; priv->favorite_child = source_child; @@ -2410,31 +2421,9 @@ init (xlator_t *this) and the sink. */ - priv->data_lock_server_count = 2; - priv->metadata_lock_server_count = 2; - priv->entry_lock_server_count = 2; - priv->strict_readdir = _gf_false; - trav = this->children; - while (trav) { - child_count++; - trav = trav->next; - } - priv->wait_count = 1; - - if (child_count != 2) { - gf_log (this->name, GF_LOG_ERROR, - "There should be exactly 2 children - one source " - "and one sink"); - return -1; - } - priv->child_count = child_count; - - LOCK_INIT (&priv->lock); - LOCK_INIT (&priv->read_child_lock); - priv->child_up = GF_CALLOC (sizeof (unsigned char), child_count, gf_afr_mt_char); if (!priv->child_up) { @@ -2522,9 +2511,6 @@ init (xlator_t *this) priv->pump_private = pump_priv; - pthread_mutex_init (&priv->mutex, NULL); - INIT_LIST_HEAD (&priv->saved_fds); - pump_change_state (this, PUMP_STATE_ABORT); ret = 0; @@ -2535,6 +2521,28 @@ out: int fini (xlator_t *this) { + afr_private_t * priv = NULL; + pump_private_t *pump_priv = NULL; + + priv = this->private; + this->private = NULL; + if (!priv) + goto out; + + pump_priv = priv->pump_private; + if (!pump_priv) + goto afr_priv; + + if (pump_priv->env) + syncenv_destroy (pump_priv->env); + + GF_FREE (pump_priv->resume_path); + LOCK_DESTROY (&pump_priv->resume_path_lock); + LOCK_DESTROY (&pump_priv->pump_state_lock); + GF_FREE (pump_priv); +afr_priv: + afr_priv_destroy (priv); +out: return 0; } diff --git a/xlators/cluster/afr/src/pump.h b/xlators/cluster/afr/src/pump.h index 02eede49c..9d60e5bea 100644 --- a/xlators/cluster/afr/src/pump.h +++ b/xlators/cluster/afr/src/pump.h @@ -50,7 +50,7 @@ typedef enum { typedef struct _pump_private { struct syncenv *env; /* The env pointer to the pump synctask */ - const char *resume_path; /* path to resume from the last pause */ + char *resume_path; /* path to resume from the last pause */ gf_lock_t resume_path_lock; /* Synchronize resume_path changes */ gf_lock_t pump_state_lock; /* Synchronize pump_state changes */ pump_state_t pump_state; /* State of pump */ -- cgit