diff options
| author | Mohit Agrawal <moagrawal@redhat.com> | 2020-03-04 09:17:26 +0530 | 
|---|---|---|
| committer | Mohit Agrawal <moagrawal@redhat.com> | 2020-03-27 20:49:20 +0530 | 
| commit | e589d8de66d3325da8fbbbe44d1a5bd6335e08ab (patch) | |
| tree | 3d4c2379e9009e86550564419c9491454f993c18 /libglusterfs/src/xlator.c | |
| parent | cc43ac8651de9aa508b01cb259b43c02d89b2afc (diff) | |
core[brick_mux]: brick crashed when creating and deleting volumes over time
Problem: In brick_mux environment, while volumes are created/stopped in a loop
         after running a long time the main brick is crashed.The brick is crashed
         because the main brick process was not cleaned up memory for all objects
         at the time of detaching a volume.
         Below are the objects that are missed at the time of detaching a volume
         1) xlator object for a brick graph
         2) local_pool for posix_lock xlator
         3) rpc object cleanup at quota xlator
         4) inode leak at brick xlator
Solution: To avoid the crash resolve all leak at the time of detaching a brick
Change-Id: Ibb6e46c5fba22b9441a88cbaf6b3278823235913
updates: #977
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
Diffstat (limited to 'libglusterfs/src/xlator.c')
| -rw-r--r-- | libglusterfs/src/xlator.c | 34 | 
1 files changed, 26 insertions, 8 deletions
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index 90a993afdd2..e793e1e3d68 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -937,6 +937,8 @@ xlator_mem_cleanup(xlator_t *this)      xlator_list_t **trav_p = NULL;      xlator_t *top = NULL;      xlator_t *victim = NULL; +    glusterfs_graph_t *graph = NULL; +    gf_boolean_t graph_cleanup = _gf_false;      if (this->call_cleanup || !this->ctx)          return; @@ -944,6 +946,12 @@ xlator_mem_cleanup(xlator_t *this)      this->call_cleanup = 1;      ctx = this->ctx; +    inode_table = this->itable; +    if (inode_table) { +        inode_table_destroy(inode_table); +        this->itable = NULL; +    } +      xlator_call_fini(trav);      while (prev) { @@ -952,12 +960,6 @@ xlator_mem_cleanup(xlator_t *this)          prev = trav;      } -    inode_table = this->itable; -    if (inode_table) { -        inode_table_destroy(inode_table); -        this->itable = NULL; -    } -      if (this->fini) {          this->fini(this);      } @@ -967,17 +969,28 @@ xlator_mem_cleanup(xlator_t *this)      if (ctx->active) {          top = ctx->active->first;          LOCK(&ctx->volfile_lock); -        /* TODO here we have leak for xlator node in a graph */ -        /* Need to move only top xlator from 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)) { +                graph_cleanup = _gf_true;                  (*trav_p) = (*trav_p)->next;                  break;              }          }          UNLOCK(&ctx->volfile_lock);      } + +    if (graph_cleanup) { +        prev = this; +        graph = ctx->active; +        pthread_mutex_lock(&graph->mutex); +        while (prev) { +            trav = prev->next; +            GF_FREE(prev); +            prev = trav; +        } +        pthread_mutex_unlock(&graph->mutex); +    }  }  void @@ -1544,6 +1557,11 @@ graph_total_client_xlator(glusterfs_graph_t *graph)      }      xl = graph->first; +    if (!strcmp(xl->type, "protocol/server")) { +        gf_msg_debug(xl->name, 0, "Return because it is a server graph"); +        return 0; +    } +      while (xl) {          if (strcmp(xl->type, "protocol/client") == 0) {              count++;  | 
