diff options
Diffstat (limited to 'rpc/rpc-lib/src/rpc-drc.c')
| -rw-r--r-- | rpc/rpc-lib/src/rpc-drc.c | 63 | 
1 files changed, 62 insertions, 1 deletions
diff --git a/rpc/rpc-lib/src/rpc-drc.c b/rpc/rpc-lib/src/rpc-drc.c index 66d07cfe6bd..8181e6aeed8 100644 --- a/rpc/rpc-lib/src/rpc-drc.c +++ b/rpc/rpc-lib/src/rpc-drc.c @@ -708,10 +708,15 @@ rpcsvc_drc_init (rpcsvc_t *svc, dict_t *options)          uint32_t                    drc_size       = 0;          uint32_t                    drc_factor     = 0;          rpcsvc_drc_globals_t       *drc            = NULL; +        static gf_boolean_t         drc_inited     = _gf_false;          GF_ASSERT (svc);          GF_ASSERT (options); +        /* Already inited */ +        if (drc_inited) +                return 0; +          if (!svc->drc) {                  drc = GF_CALLOC (1, sizeof (rpcsvc_drc_globals_t),                                   gf_common_mt_drc_globals_t); @@ -732,11 +737,12 @@ rpcsvc_drc_init (rpcsvc_t *svc, dict_t *options)          /* Toggle DRC on/off, when more drc types(persistent/cluster)             are added, we shouldn't treat this as boolean */ -        ret = dict_get_str_boolean (options, "nfs.drc", _gf_false); +        ret = dict_get_str_boolean (options, "nfs.drc", _gf_true);          if (ret == -1) {                  gf_log (GF_RPCSVC, GF_LOG_INFO, "drc user options need second look");                  ret = _gf_true;          } +        drc->enable_drc = ret;          if (ret == _gf_false) {                  /* drc off */ @@ -796,6 +802,7 @@ rpcsvc_drc_init (rpcsvc_t *svc, dict_t *options)          gf_log (GF_RPCSVC, GF_LOG_DEBUG, "drc init successful");          drc->status = DRC_INITIATED; +        drc_inited = _gf_true;   out:          UNLOCK (&drc->lock); @@ -809,3 +816,57 @@ rpcsvc_drc_init (rpcsvc_t *svc, dict_t *options)          }          return ret;  } + +int +rpcsvc_drc_reconfigure (rpcsvc_t *svc, dict_t *options) +{ +        int                     ret        = -1; +        gf_boolean_t            enable_drc = _gf_false; +        rpcsvc_drc_globals_t    *drc       = NULL; +        uint32_t                drc_size   = 0; + +        if ((!svc) || (!options)) +                return (-1); + +        drc = svc->drc; +        /* reconfig for drc-size */ +        if (dict_get_uint32 (options, "nfs.drc-size", &drc_size)) +                drc_size = DRC_DEFAULT_CACHE_SIZE; + +        if (drc->global_cache_size != drc_size) { +                gf_log (GF_RPCSVC, GF_LOG_DEBUG, "nfs.drc-size size can not " +                        "be reconfigured without NFS server restart."); +                return (-1); +        } + +        /* reconfig for nfs.drc */ +        ret = dict_get_str_boolean (options, "nfs.drc", _gf_true); +        if (ret < 0) { +                ret = _gf_true; +        } +        enable_drc = ret; + +        if (drc->enable_drc == enable_drc) +                return 0; + +        drc->enable_drc = enable_drc; +        if (enable_drc) { +                if (drc == NULL) +                        return rpcsvc_drc_init(svc, options); +        } else { +                if (drc == NULL) +                        return (0); + +                LOCK (&drc->lock); +                (void) rpcsvc_unregister_notify (svc, rpcsvc_drc_notify, THIS); +                if (drc->mempool) { +                        mem_pool_destroy (drc->mempool); +                        drc->mempool = NULL; +                } +                UNLOCK (&drc->lock); +                GF_FREE (drc); +                svc->drc = NULL; +        } + +        return (0); +}  | 
