diff options
| -rw-r--r-- | xlators/features/leases/src/leases.c | 72 | ||||
| -rw-r--r-- | xlators/features/leases/src/leases.h | 1 | 
2 files changed, 60 insertions, 13 deletions
diff --git a/xlators/features/leases/src/leases.c b/xlators/features/leases/src/leases.c index 2c1db34bd9c..4e5ceab3ffa 100644 --- a/xlators/features/leases/src/leases.c +++ b/xlators/features/leases/src/leases.c @@ -947,6 +947,41 @@ mem_acct_init (xlator_t *this)          return ret;  } +static int +leases_init_priv (xlator_t *this) +{ +        int               ret  = 0; +        leases_private_t *priv = NULL; + +        priv = this->private; +        GF_ASSERT (priv); + +        if (!priv->timer_wheel) { +                if (!glusterfs_global_timer_wheel (this)) { +                        gf_msg_debug (this->name, 0, "Initing the global " +                                      "timer wheel"); +                        ret = glusterfs_global_timer_wheel_init (this->ctx); +                        if (ret) { +                                gf_msg (this->name, GF_LOG_ERROR, 0, +                                        LEASE_MSG_NO_TIMER_WHEEL, +                                        "Initing the global timer " +                                        "wheel failed"); +                                goto out; +                        } +                } +                priv->timer_wheel = glusterfs_global_timer_wheel (this); +        } + +        if (!priv->inited_recall_thr) { +                pthread_create (&priv->recall_thr, NULL, +                                expired_recall_cleanup, this); +                priv->inited_recall_thr = _gf_true; +        } + +out: +        return ret; +} +  int  reconfigure (xlator_t *this, dict_t *options)  { @@ -956,8 +991,22 @@ reconfigure (xlator_t *this, dict_t *options)          priv = this->private;          GF_ASSERT (priv); +        /* TODO: In case of reconfigure, if its enabling the leases +         * its not an issue, but if its disabling the leases, there +         * is more to it, like recall all the existing leases, wait +         * for unlock of all the leases etc., hence not supporting the +         * reconfigure for now. +          GF_OPTION_RECONF ("leases", priv->leases_enabled,                            options, bool, out); + +        if (priv->leases_enabled) { +                ret = leases_init_priv (this); +                if (ret) +                        goto out; +        } +        */ +          GF_OPTION_RECONF ("lease-lock-recall-timeout",                            priv->recall_lease_timeout,                            options, int32, out); @@ -989,26 +1038,20 @@ init (xlator_t *this)          INIT_LIST_HEAD (&priv->client_list);          INIT_LIST_HEAD (&priv->recall_list); -        priv->timer_wheel = glusterfs_global_timer_wheel (this); -        if (!priv->timer_wheel) { -                gf_msg_debug (this->name, 0, "Initing the global timer wheel"); -                ret = glusterfs_global_timer_wheel_init (this->ctx); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                LEASE_MSG_NO_TIMER_WHEEL, -                                "Initing the global timer wheel failed"); +        this->private = priv; + +        if (priv->leases_enabled) { +                ret = leases_init_priv (this); +                if (ret)                          goto out; -                }          } -        pthread_create (&priv->recall_thr, NULL, expired_recall_cleanup, this); - -        this->private = priv;          ret = 0;  out:          if (ret) {                  GF_FREE (priv); +                this->private = NULL;          }          return ret; @@ -1025,9 +1068,12 @@ fini (xlator_t *this)          }          this->private = NULL; -        priv->fini = _gf_false; +        priv->fini = _gf_true; +        pthread_cond_broadcast (&priv->cond);          pthread_join (priv->recall_thr, NULL); +        priv->inited_recall_thr = _gf_false; +          GF_FREE (priv);          return 0; diff --git a/xlators/features/leases/src/leases.h b/xlators/features/leases/src/leases.h index c779f1a67e7..77818b2053f 100644 --- a/xlators/features/leases/src/leases.h +++ b/xlators/features/leases/src/leases.h @@ -151,6 +151,7 @@ struct _leases_private {                                               is qued and waits for unlock/expiry */          gf_boolean_t      fini;          pthread_t         recall_thr; +        gf_boolean_t      inited_recall_thr;          pthread_mutex_t   mutex;          pthread_cond_t    cond;  };  | 
