diff options
| author | Pranith Kumar K <pranithk@gluster.com> | 2011-12-15 16:51:02 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2011-12-28 22:47:36 -0800 | 
| commit | be003fbb3ac7a1f1021774ecb75a4929f1ba85d4 (patch) | |
| tree | 099f4354f4d4fa140f607c374e295b6166db23ad | |
| parent | c8c0942d1c890fd9b74c8e2fb3897bc96f9b9b82 (diff) | |
cluster/afr: Handle fini for afr,pumpv3.3.0qa19
Change-Id: Idc0a05a8a25f278a7ab05e242263e0a5001bde18
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
BUG: 767862
Reviewed-on: http://review.gluster.com/800
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
| -rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 41 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.c | 38 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.h | 5 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/pump.c | 66 | ||||
| -rw-r--r-- | 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 c00c80b9f68..22b30fdfa2e 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 c66f386f2fe..f3c3e7e7a82 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 70239d2c69b..8568f1fd8d6 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 5bb602bcdcf..1814c8b9ddc 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 02eede49cf5..9d60e5bea54 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 */  | 
