diff options
| author | Mohit Agrawal <moagrawa@redhat.com> | 2018-02-10 12:25:15 +0530 | 
|---|---|---|
| committer | Jeff Darcy <jeff@pl.atyp.us> | 2018-02-15 17:03:20 +0000 | 
| commit | b313d97faa766443a7f8128b6e19f3d2f1b267dd (patch) | |
| tree | 6af84081aee75fa08c8ceecde4c15a2791863e52 /glusterfsd | |
| parent | 9d0d1fdd091d754149242fd4389b964695aacf13 (diff) | |
glusterfsd: Memleak in glusterfsd process while  brick mux is on
Problem: At the time of stopping the volume while brick multiplex is
         enabled memory is not cleanup from all server side xlators.
Solution: To cleanup memory for all server side xlators call fini
          in glusterfs_handle_terminate after send GF_EVENT_CLEANUP
          notification to top xlator.
BUG: 1544090
Change-Id: Ifa1525e25b697371276158705026b421b4f81140
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
Diffstat (limited to 'glusterfsd')
| -rw-r--r-- | glusterfsd/src/glusterfsd-mgmt.c | 65 | ||||
| -rw-r--r-- | glusterfsd/src/glusterfsd.c | 4 | ||||
| -rw-r--r-- | glusterfsd/src/glusterfsd.h | 3 | 
3 files changed, 70 insertions, 2 deletions
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index ac487b94e5f..4c4d98dad3e 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -193,6 +193,70 @@ glusterfs_autoscale_threads (glusterfs_ctx_t *ctx, int incr)          (void) event_reconfigure_threads (pool, pool->eventthreadcount+incr);  } +static int +xlator_mem_free (xlator_t *xl) +{ +        volume_opt_list_t *vol_opt = NULL; +        volume_opt_list_t *tmp     = NULL; + +        if (!xl) +                return 0; + +        GF_FREE (xl->name); +        GF_FREE (xl->type); +        xl->name = NULL; +        xl->type = NULL; + +        if (xl->options) { +                dict_ref (xl->options); +                dict_unref (xl->options); +                xl->options = NULL; +        } + +        list_for_each_entry_safe (vol_opt, tmp, &xl->volume_options, list) { +                list_del_init (&vol_opt->list); +                GF_FREE (vol_opt); +        } + +        return 0; +} + +void +xlator_call_fini (xlator_t *this) { +        if (!this) +                return; +        xlator_call_fini (this->next); +        this->fini (this); +} + +void +xlator_mem_cleanup (xlator_t *this) { +        xlator_list_t     *list = this->children; +        xlator_t          *trav = list->xlator; +        inode_table_t     *inode_table = NULL; +        xlator_t          *prev = trav; + +        inode_table = this->itable; + +        xlator_call_fini (trav); + +        while (prev) { +                trav = prev->next; +                xlator_mem_free (prev); +                prev = trav; +        } + +        if (inode_table) { +                inode_table_destroy (inode_table); +                this->itable = NULL; +        } +        if (this->fini) { +                this->fini (this); +                xlator_mem_free (this); +        } +} + +  int  glusterfs_handle_terminate (rpcsvc_request_t *req)  { @@ -259,6 +323,7 @@ glusterfs_handle_terminate (rpcsvc_request_t *req)                  gf_log (THIS->name, GF_LOG_INFO, "detaching not-only"                           " child %s", xlator_req.name);                  top->notify (top, GF_EVENT_CLEANUP, victim); +                xlator_mem_cleanup (victim);          }  err:          if (!lockflag) diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index b836bbc21c0..3bfd0f12384 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -1480,13 +1480,13 @@ cleanup_and_exit (int signum)          trav = NULL;          if (ctx->active)                  trav = ctx->active->top; -        while (trav) { +        /*while (trav) {                  if (should_call_fini(ctx,trav)) {                          THIS = trav;                          trav->fini (trav);                  }                  trav = trav->next; -        } +        }*/          /* NOTE: Only the least significant 8 bits i.e (signum & 255)             will be available to parent process on calling exit() */ diff --git a/glusterfsd/src/glusterfsd.h b/glusterfsd/src/glusterfsd.h index 9a0281e78a4..420edfd3df5 100644 --- a/glusterfsd/src/glusterfsd.h +++ b/glusterfsd/src/glusterfsd.h @@ -128,5 +128,8 @@ int glusterfs_volume_top_read_perf (uint32_t blk_size, uint32_t blk_count,  void  glusterfs_autoscale_threads (glusterfs_ctx_t *ctx, int incr); +void +xlator_mem_cleanup (xlator_t *this); +  extern glusterfs_ctx_t *glusterfsd_ctx;  #endif /* __GLUSTERFSD_H__ */  | 
