diff options
| -rw-r--r-- | glusterfsd/src/glusterfsd-mgmt.c | 103 | ||||
| -rw-r--r-- | libglusterfs/src/libglusterfs.sym | 1 | ||||
| -rw-r--r-- | libglusterfs/src/xlator.c | 101 | ||||
| -rw-r--r-- | libglusterfs/src/xlator.h | 3 | ||||
| -rw-r--r-- | xlators/protocol/server/src/server.c | 2 | 
5 files changed, 106 insertions, 104 deletions
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index e6c8a27e9e8..0051393b4ca 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -185,109 +185,6 @@ glusterfs_terminate_response_send (rpcsvc_request_t *req, int op_ret)          return ret;  } -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; - -        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); -        } - -        xlator_memrec_free (xl); - -        return 0; -} - -void -xlator_call_fini (xlator_t *this) { -        if (!this || this->cleanup_starting) -                return; -        this->cleanup_starting = 1; -        this->call_cleanup = 1; -        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; -        glusterfs_ctx_t   *ctx          = NULL; -        xlator_list_t    **trav_p       = NULL; -        xlator_t          *top          = NULL; -        xlator_t          *victim       = NULL; - - -        if (this->call_cleanup) -                return; - -        this->call_cleanup = 1; -        ctx = glusterfsd_ctx; - -        xlator_call_fini (trav); - -        while (prev) { -                trav = prev->next; -                xlator_mem_free (prev); -                prev = trav; -        } - -        inode_table = this->itable; -        if (inode_table) { -                inode_table_destroy (inode_table); -                this->itable = NULL; -        } - -        if (this->fini) { -                this->fini (this); -        } - -        xlator_mem_free (this); - -        if (glusterfsd_ctx->active) { -                top = glusterfsd_ctx->active->first; -                LOCK (&ctx->volfile_lock); -                /* TODO here we have leak for xlator node in a graph */ -                for (trav_p = &top->children; *trav_p; trav_p = &(*trav_p)->next) { -                        victim = (*trav_p)->xlator; -                        if (victim->call_cleanup && !strcmp (victim->name, this->name)) { -                                        (*trav_p) = (*trav_p)->next; -                                        break; -                        } -                } -                /* TODO Sometime brick xlator is not moved from graph so followed below -                   approach to move brick xlator from a graph, will move specific brick -                   xlator from graph only while inode table and mem_acct are cleaned up -                */ -                trav_p = &top->children; -                while (*trav_p) { -                        victim = (*trav_p)->xlator; -                        if (victim->call_cleanup && !victim->itable && !victim->mem_acct) { -                                (*trav_p) = (*trav_p)->next; -                        } else { -                                trav_p = &(*trav_p)->next; -                        } -                } -                UNLOCK (&ctx->volfile_lock); -        } - -} - -  int  glusterfs_handle_terminate (rpcsvc_request_t *req)  { diff --git a/libglusterfs/src/libglusterfs.sym b/libglusterfs/src/libglusterfs.sym index 4b7dcb6f3e6..d2d25838647 100644 --- a/libglusterfs/src/libglusterfs.sym +++ b/libglusterfs/src/libglusterfs.sym @@ -1101,6 +1101,7 @@ xlator_volopt_dynload  xlator_volume_option_get  xlator_volume_option_get_list  xlator_memrec_free +xlator_mem_cleanup  default_fops  gf_fop_list  gf_upcall_list diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index ced89c71672..f1ed9236f09 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -980,6 +980,107 @@ xlator_tree_free_memacct (xlator_t *tree)          return 0;  } +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; + +        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); +        } + +        xlator_memrec_free (xl); + +        return 0; +} + +static void +xlator_call_fini (xlator_t *this) { +        if (!this || this->cleanup_starting) +                return; +        this->cleanup_starting = 1; +        this->call_cleanup = 1; +        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; +        glusterfs_ctx_t   *ctx          = NULL; +        xlator_list_t    **trav_p       = NULL; +        xlator_t          *top          = NULL; +        xlator_t          *victim       = NULL; + + +        if (this->call_cleanup || !this->ctx) +                return; + +        this->call_cleanup = 1; +        ctx = this->ctx; + +        xlator_call_fini (trav); + +        while (prev) { +                trav = prev->next; +                xlator_mem_free (prev); +                prev = trav; +        } + +        inode_table = this->itable; +        if (inode_table) { +                inode_table_destroy (inode_table); +                this->itable = NULL; +        } + +        if (this->fini) { +                this->fini (this); +        } + +        xlator_mem_free (this); + +        if (ctx->active) { +                top = ctx->active->first; +                LOCK (&ctx->volfile_lock); +                /* TODO here we have leak for xlator node in a graph */ +                for (trav_p = &top->children; *trav_p; trav_p = &(*trav_p)->next) { +                        victim = (*trav_p)->xlator; +                        if (victim->call_cleanup && !strcmp (victim->name, this->name)) { +                                        (*trav_p) = (*trav_p)->next; +                                        break; +                        } +                } +                /* TODO Sometime brick xlator is not moved from graph so followed below +                   approach to move brick xlator from a graph, will move specific brick +                   xlator from graph only while inode table and mem_acct are cleaned up +                */ +                trav_p = &top->children; +                while (*trav_p) { +                        victim = (*trav_p)->xlator; +                        if (victim->call_cleanup && !victim->itable && !victim->mem_acct) { +                                (*trav_p) = (*trav_p)->next; +                        } else { +                                trav_p = &(*trav_p)->next; +                        } +                } +                UNLOCK (&ctx->volfile_lock); +        } +} +  void  loc_wipe (loc_t *loc)  { diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h index 3c16758e1a9..4f18d1cd2a9 100644 --- a/libglusterfs/src/xlator.h +++ b/libglusterfs/src/xlator.h @@ -1246,4 +1246,7 @@ glusterfs_delete_volfile_checksum (glusterfs_ctx_t *ctx,                                     const char *volfile_id);  int  xlator_memrec_free (xlator_t *xl); + +void +xlator_mem_cleanup (xlator_t *this);  #endif /* _XLATOR_H */ diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c index 03138689b14..87a03d23c3f 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -444,7 +444,7 @@ server_rpc_notify (rpcsvc_t *rpc, void *xl, rpcsvc_event_t event,          this = xl;          trans = data;          conf = this->private; -        ctx = glusterfsd_ctx; +        ctx = this->ctx;          switch (event) {          case RPCSVC_EVENT_ACCEPT:  | 
