diff options
| author | Mohit Agrawal <moagrawa@redhat.com> | 2018-02-10 12:25:15 +0530 | 
|---|---|---|
| committer | jiffin tony Thottan <jthottan@redhat.com> | 2018-04-06 12:47:34 +0000 | 
| commit | 479bea17e75d8e75a8901d01b3fd3627bfd8991c (patch) | |
| tree | 650a420f504ef22ea2f13fbfba63f73ca860c663 | |
| parent | 0e3206c6a8ef36737e5b303580b87a87f6dc1c8e (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
> Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
> (cherry picked from commit 7c3cc485054e4ede1efb358552135b432fb7047a)
>Note: Run all test-cases in separate build (https://review.gluster.org/19574)
>      with same patch after enable brick mux forcefully, all test cases are
>      passed.
BUG: 1549473
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
Change-Id: Ia10dc7f2605aa50f2b90b3fe4eb380ba9299e2fc
24 files changed, 274 insertions, 133 deletions
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index ca706d1020d..5b93d83c572 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -193,6 +193,72 @@ 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 +325,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 eeffdc5c34e..47a8fa6227e 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -1424,20 +1424,7 @@ cleanup_and_exit (int signum)          }  #endif -        /* call fini() of each xlator */ - -        /*call fini for glusterd xlator */ -        /* TODO : Invoke fini for rest of the xlators */          trav = NULL; -        if (ctx->active) -                trav = ctx->active->top; -        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 6d1e16594b1..f66947b7c13 100644 --- a/glusterfsd/src/glusterfsd.h +++ b/glusterfsd/src/glusterfsd.h @@ -126,5 +126,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__ */ diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c index a46d1160038..f46474b5a48 100644 --- a/xlators/debug/io-stats/src/io-stats.c +++ b/xlators/debug/io-stats/src/io-stats.c @@ -300,7 +300,6 @@ is_fop_latency_started (call_frame_t *frame)                                                 throughput, iosstat);           \          } while (0) -  static int  ios_fd_ctx_get (fd_t *fd, xlator_t *this, struct ios_fd **iosfd)  { diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub.c b/xlators/features/bit-rot/src/stub/bit-rot-stub.c index 4be7caabc45..05cac63ae8f 100644 --- a/xlators/features/bit-rot/src/stub/bit-rot-stub.c +++ b/xlators/features/bit-rot/src/stub/bit-rot-stub.c @@ -228,18 +228,6 @@ notify (xlator_t *this, int event, void *data, ...)          if (!priv)                  return 0; -        switch (event) { -        case GF_EVENT_CLEANUP: -                if (priv->signth) { -                        (void) gf_thread_cleanup_xint (priv->signth); -                        priv->signth = 0; -                } -                if (priv->container.thread) { -                        (void) gf_thread_cleanup_xint (priv->container.thread); -                        priv->container.thread = 0; -                } -                break; -        }          default_notify (this, event, data);          return 0;  } @@ -262,6 +250,7 @@ fini (xlator_t *this)                          "Could not cancel sign serializer thread");                  goto out;          } +        priv->signth = 0;          while (!list_empty (&priv->squeue)) {                  sigstub = list_first_entry (&priv->squeue, @@ -283,12 +272,19 @@ fini (xlator_t *this)                  goto out;          } +        priv->container.thread = 0; +          while (!list_empty (&priv->container.bad_queue)) {                  stub = list_first_entry (&priv->container.bad_queue, call_stub_t,                                           list);                  list_del_init (&stub->list);                  call_stub_destroy (stub); -        }; +        } + +        if (priv->local_pool) { +                mem_pool_destroy (priv->local_pool); +                priv->local_pool = NULL; +        }          pthread_mutex_destroy (&priv->container.bad_lock);          pthread_cond_destroy (&priv->container.bad_cond); diff --git a/xlators/features/changelog/src/changelog-ev-handle.c b/xlators/features/changelog/src/changelog-ev-handle.c index 38e127b7eb5..3e8dc9acd04 100644 --- a/xlators/features/changelog/src/changelog-ev-handle.c +++ b/xlators/features/changelog/src/changelog-ev-handle.c @@ -163,12 +163,14 @@ changelog_rpc_notify (struct rpc_clnt *rpc,                   */                  rpc_clnt_unref (crpc->rpc); -                selection = &priv->ev_selection; +                if (priv) +                        selection = &priv->ev_selection;                  LOCK (&crpc->lock);                  { -                        changelog_deselect_event (this, selection, -                                                  crpc->filter); +                        if (selection) +                                changelog_deselect_event (this, selection, +                                                          crpc->filter);                          changelog_set_disconnect_flag (crpc, _gf_true);                  }                  UNLOCK (&crpc->lock); diff --git a/xlators/features/changelog/src/changelog-rpc-common.c b/xlators/features/changelog/src/changelog-rpc-common.c index 08cd41e4f17..21bef76ef35 100644 --- a/xlators/features/changelog/src/changelog-rpc-common.c +++ b/xlators/features/changelog/src/changelog-rpc-common.c @@ -275,6 +275,10 @@ changelog_rpc_server_destroy (xlator_t *this, rpcsvc_t *rpc, char *sockfile,          (void) rpcsvc_unregister_notify (rpc, fn, this);          sys_unlink (sockfile); +        if (rpc->rxpool) { +                mem_pool_destroy (rpc->rxpool); +                rpc->rxpool = NULL; +        }          GF_FREE (rpc);  } diff --git a/xlators/features/changelog/src/changelog.c b/xlators/features/changelog/src/changelog.c index 8b22a049dc9..31894c1cc28 100644 --- a/xlators/features/changelog/src/changelog.c +++ b/xlators/features/changelog/src/changelog.c @@ -2102,7 +2102,6 @@ notify (xlator_t *this, int event, void *data, ...)          int                     ret             = 0;          int                     ret1            = 0;          struct list_head        queue           = {0, }; -        int                     i               = 0;          INIT_LIST_HEAD (&queue); @@ -2110,20 +2109,6 @@ notify (xlator_t *this, int event, void *data, ...)          if (!priv)                  goto out; -        if (event == GF_EVENT_CLEANUP) { -                if (priv->connector) { -                        (void) gf_thread_cleanup_xint (priv->connector); -                        priv->connector = 0; -                } - -                for (; i < NR_DISPATCHERS; i++) { -                        if (priv->ev_dispatcher[i]) { -                                (void) gf_thread_cleanup_xint (priv->ev_dispatcher[i]); -                                priv->ev_dispatcher[i] = 0; -                        } -               } -        } -          if (event == GF_EVENT_TRANSLATOR_OP) {                  dict = data; @@ -2901,6 +2886,9 @@ fini (xlator_t *this)                  /* cleanup barrier related objects */                  changelog_barrier_pthread_destroy (priv); +                /* cleanup helper threads */ +                changelog_cleanup_helper_threads (this, priv); +                  /* cleanup allocated options */                  changelog_freeup_options (this, priv); @@ -2911,6 +2899,7 @@ fini (xlator_t *this)          }          this->private = NULL; +        this->local_pool = NULL;          return;  } diff --git a/xlators/features/changetimerecorder/src/changetimerecorder.c b/xlators/features/changetimerecorder/src/changetimerecorder.c index 99519d10a0d..5f82d335f30 100644 --- a/xlators/features/changetimerecorder/src/changetimerecorder.c +++ b/xlators/features/changetimerecorder/src/changetimerecorder.c @@ -19,7 +19,6 @@  #include "tier-ctr-interface.h"  /*******************************inode forget***********************************/ -  int  ctr_forget (xlator_t *this, inode_t *inode)  { @@ -2310,15 +2309,6 @@ notify (xlator_t *this, int event, void *data, ...)         if (!priv)                 goto out; -       if (event == GF_EVENT_CLEANUP) { -               if (fini_db (priv->_db_conn)) { -                       gf_msg (this->name, GF_LOG_WARNING, 0, -                                CTR_MSG_CLOSE_DB_CONN_FAILED, "Failed closing " -                                "db connection"); -               } -               if (priv->_db_conn) -                        priv->_db_conn = NULL; -       }         ret = default_notify (this, event, data);  out: @@ -2359,6 +2349,10 @@ fini (xlator_t *this)                                  CTR_MSG_CLOSE_DB_CONN_FAILED, "Failed closing "                                  "db connection");                  } + +                if (priv->_db_conn) +                        priv->_db_conn = NULL; +                  GF_FREE (priv->ctr_db_path);                  if (pthread_mutex_destroy (&priv->compact_lock)) {                          gf_msg (this->name, GF_LOG_WARNING, 0, @@ -2368,6 +2362,7 @@ fini (xlator_t *this)          }          GF_FREE (priv);          mem_pool_destroy (this->local_pool); +        this->local_pool = NULL;          return;  } diff --git a/xlators/features/index/src/index.c b/xlators/features/index/src/index.c index 8590482a5b3..f3b02706cdd 100644 --- a/xlators/features/index/src/index.c +++ b/xlators/features/index/src/index.c @@ -2444,6 +2444,13 @@ fini (xlator_t *this)          priv = this->private;          if (!priv)                  goto out; + +        priv->down = _gf_true; +        pthread_cond_broadcast (&priv->cond); +        if (priv->thread) { +                gf_thread_cleanup_xint (priv->thread); +                priv->thread = 0; +        }          this->private = NULL;          LOCK_DESTROY (&priv->lock);          pthread_cond_destroy (&priv->cond); @@ -2455,8 +2462,11 @@ fini (xlator_t *this)          if (priv->complete_watchlist)                  dict_unref (priv->complete_watchlist);          GF_FREE (priv); -        mem_pool_destroy (this->local_pool); -        this->local_pool = NULL; + +        if (this->local_pool) { +                mem_pool_destroy (this->local_pool); +                this->local_pool = NULL; +        }  out:          return;  } @@ -2526,13 +2536,6 @@ notify (xlator_t *this, int event, void *data, ...)          if (!priv)                  return 0; -        switch (event) { -        case GF_EVENT_CLEANUP: -                priv->down = _gf_true; -                pthread_cond_broadcast (&priv->cond); -                break; -        } -          ret = default_notify (this, event, data);          return ret;  } diff --git a/xlators/features/leases/src/leases.c b/xlators/features/leases/src/leases.c index 551dd9b53db..a8ffb3547c4 100644 --- a/xlators/features/leases/src/leases.c +++ b/xlators/features/leases/src/leases.c @@ -1062,14 +1062,17 @@ fini (xlator_t *this)          priv->fini = _gf_true;          pthread_cond_broadcast (&priv->cond); -        pthread_join (priv->recall_thr, NULL); - -        priv->inited_recall_thr = _gf_false; +        if (priv->recall_thr) { +                gf_thread_cleanup_xint (priv->recall_thr); +                priv->recall_thr = 0; +                priv->inited_recall_thr = _gf_false; +        }          GF_FREE (priv); - -        glusterfs_ctx_tw_put (this->ctx); - +        if (this->ctx->tw) { +                glusterfs_ctx_tw_put (this->ctx); +                this->ctx->tw = NULL; +        }          return 0;  } diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index b51b9ccc9f5..3094c68791b 100644 --- a/xlators/features/marker/src/marker.c +++ b/xlators/features/marker/src/marker.c @@ -3193,9 +3193,9 @@ mem_acct_init (xlator_t *this)  int32_t  init_xtime_priv (xlator_t *this, dict_t *options)  { -        data_t          *data    = NULL;          int32_t          ret     = -1;          marker_conf_t   *priv    = NULL; +        char            *tmp_opt = NULL;          GF_VALIDATE_OR_GOTO ("marker", this, out);          GF_VALIDATE_OR_GOTO (this->name, options, out); @@ -3203,29 +3203,11 @@ init_xtime_priv (xlator_t *this, dict_t *options)          priv = this->private; -        if((data = dict_get (options, VOLUME_UUID)) != NULL) { -                priv->volume_uuid = data->data; +        ret = dict_get_str (options, "volume-uuid", &tmp_opt); -                ret = gf_uuid_parse (priv->volume_uuid, priv->volume_uuid_bin); -                if (ret == -1) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "invalid volume uuid %s", priv->volume_uuid); -                        goto out; -                } - -                ret = gf_asprintf (& (priv->marker_xattr), "%s.%s.%s", -                                   MARKER_XATTR_PREFIX, priv->volume_uuid, -                                   XTIME); - -                if (ret == -1){ -                        priv->marker_xattr = NULL; -                        goto out; -                } - -                gf_log (this->name, GF_LOG_DEBUG, -                        "volume-uuid = %s", priv->volume_uuid); -        } else { +        if (ret) {                  priv->volume_uuid = NULL; +                tmp_opt = "";                  gf_log (this->name, GF_LOG_ERROR,                          "please specify the volume-uuid" @@ -3233,16 +3215,32 @@ init_xtime_priv (xlator_t *this, dict_t *options)                  return -1;          } +        gf_asprintf (&priv->volume_uuid, "%s", tmp_opt); -        if ((data = dict_get (options, TIMESTAMP_FILE)) != NULL) { -                priv->timestamp_file = data->data; +        ret = gf_uuid_parse (priv->volume_uuid, priv->volume_uuid_bin); -                gf_log (this->name, GF_LOG_DEBUG, -                        "the timestamp-file is = %s", -                        priv->timestamp_file); +        if (ret == -1) { +                gf_log (this->name, GF_LOG_ERROR, +                        "invalid volume uuid %s", priv->volume_uuid); +                goto out; +        } -        } else { +        ret = gf_asprintf (&(priv->marker_xattr), "%s.%s.%s", +                           MARKER_XATTR_PREFIX, priv->volume_uuid, +                           XTIME); + +        if (ret == -1) { +                priv->marker_xattr = NULL; +                goto out; +        } + +        gf_log (this->name, GF_LOG_DEBUG, +                "volume-uuid = %s", priv->volume_uuid); + +        ret = dict_get_str (options, "timestamp-file", &tmp_opt); +        if (ret) {                  priv->timestamp_file = NULL; +                tmp_opt = "";                  gf_log (this->name, GF_LOG_ERROR,                          "please specify the timestamp-file" @@ -3251,6 +3249,15 @@ init_xtime_priv (xlator_t *this, dict_t *options)                  goto out;          } +        ret = gf_asprintf (&priv->timestamp_file, "%s", tmp_opt); +        if (ret == -1) { +                priv->timestamp_file = NULL; +                goto out; +        } + +        gf_log (this->name, GF_LOG_DEBUG, +                "the timestamp-file is = %s", priv->timestamp_file); +          ret = 0;  out:          return ret; @@ -3292,6 +3299,12 @@ marker_priv_cleanup (xlator_t *this)          LOCK_DESTROY (&priv->lock);          GF_FREE (priv); + +        if (this->local_pool) { +                mem_pool_destroy (this->local_pool); +                this->local_pool = NULL; +        } +  out:          return;  } diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c index a3078453f78..8a173ba9074 100644 --- a/xlators/features/quota/src/quota.c +++ b/xlators/features/quota/src/quota.c @@ -5194,12 +5194,14 @@ quota_priv_dump (xlator_t *this)          GF_ASSERT (this);          priv = this->private; +        if (!priv) +                goto out;          gf_proc_dump_add_section ("xlators.features.quota.priv", this->name);          ret = TRY_LOCK (&priv->lock);          if (ret) -             goto out; +                goto out;          else {                  gf_proc_dump_write("soft-timeout", "%d", priv->soft_timeout);                  gf_proc_dump_write("hard-timeout", "%d", priv->hard_timeout); @@ -5219,6 +5221,27 @@ out:  void  fini (xlator_t *this)  { +        quota_priv_t *priv = NULL; +        rpc_clnt_t   *rpc  = NULL; +        int           i = 0, cnt = 0; + +        priv = this->private; +        if (!priv) +                return; +        rpc = priv->rpc_clnt; +        priv->rpc_clnt = NULL; +        this->private = NULL; +        if (rpc) { +                cnt = rpc->refcount; +                for (i = 0; i < cnt; i++) +                        rpc_clnt_unref (rpc); +        } +        LOCK_DESTROY (&priv->lock); +        GF_FREE (priv); +        if (this->local_pool) { +                mem_pool_destroy (this->local_pool); +                this->local_pool = NULL; +        }          return;  } diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c index 3b6b41b4ab6..57da54c84f2 100644 --- a/xlators/features/shard/src/shard.c +++ b/xlators/features/shard/src/shard.c @@ -5062,6 +5062,9 @@ shard_forget (xlator_t *this, inode_t *inode)          shard_priv_t       *priv     = NULL;          priv = this->private; +        if (!priv) +                return 0; +          inode_ctx_del (inode, this, &ctx_uint);          if (!ctx_uint)                  return 0; diff --git a/xlators/features/trash/src/trash.c b/xlators/features/trash/src/trash.c index 4a41a14f427..d11485840df 100644 --- a/xlators/features/trash/src/trash.c +++ b/xlators/features/trash/src/trash.c @@ -33,7 +33,6 @@ trash_unlink_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                           struct iatt *preoldparent, struct iatt *postoldparent,                           struct iatt *prenewparent, struct iatt *postnewparent,                           dict_t *xdata); -  /* Common routines used in this translator */  /** @@ -2406,6 +2405,7 @@ notify (xlator_t *this, int event, void *data, ...)                          ret = create_internalop_directory (this);          } +  out:          ret = default_notify (this, event, data);          if (ret) @@ -2587,10 +2587,11 @@ void  fini (xlator_t *this)  {          trash_private_t *priv = NULL; +        inode_table_t     *inode_table = NULL;          GF_VALIDATE_OR_GOTO ("trash", this, out);          priv = this->private; - +        inode_table = priv->trash_itable;          if (priv) {                  if (priv->newtrash_dir)                          GF_FREE (priv->newtrash_dir); @@ -2600,9 +2601,17 @@ fini (xlator_t *this)                          GF_FREE (priv->brick_path);                  if (priv->eliminate)                          wipe_eliminate_path (&priv->eliminate); +                if (inode_table) { +                        inode_table_destroy (inode_table); +                        priv->trash_itable = NULL; +                }                  GF_FREE (priv);          } -        mem_pool_destroy (this->local_pool); + +        if (this->local_pool) { +                mem_pool_destroy (this->local_pool); +                this->local_pool = NULL; +        }          this->private = NULL;  out:          return; diff --git a/xlators/features/upcall/src/upcall.c b/xlators/features/upcall/src/upcall.c index 3e1d307260a..66d22f62549 100644 --- a/xlators/features/upcall/src/upcall.c +++ b/xlators/features/upcall/src/upcall.c @@ -2447,8 +2447,11 @@ fini (xlator_t *this)          priv->fini = 1; -        if (priv->reaper_init_done) -                pthread_join (priv->reaper_thr, NULL); +        if (priv->reaper_thr) { +                gf_thread_cleanup_xint (priv->reaper_thr); +                priv->reaper_thr = 0; +                priv->reaper_init_done = _gf_false; +        }          dict_unref (priv->xattrs);          LOCK_DESTROY (&priv->inode_ctx_lk); @@ -2458,13 +2461,24 @@ fini (xlator_t *this)           * before calling xlator_fini */          GF_FREE (priv); +        if (this->local_pool) { +                mem_pool_destroy (this->local_pool); +                this->local_pool = NULL; +        } +          return 0;  }  int  upcall_forget (xlator_t *this, inode_t *inode)  { +        upcall_private_t *priv          = this->private; + +        if (!priv) +                goto out; +          upcall_cleanup_inode_ctx (this, inode); +out:          return 0;  } diff --git a/xlators/performance/decompounder/src/decompounder.c b/xlators/performance/decompounder/src/decompounder.c index d3d9b9f7830..095a300e9f4 100644 --- a/xlators/performance/decompounder/src/decompounder.c +++ b/xlators/performance/decompounder/src/decompounder.c @@ -946,5 +946,12 @@ out:  int32_t  fini (xlator_t *this)  { +        if (!this) +                return 0; + +        if (this->local_pool) { +                mem_pool_destroy (this->local_pool); +                this->local_pool = NULL; +        }          return 0;  } diff --git a/xlators/performance/io-threads/src/io-threads.c b/xlators/performance/io-threads/src/io-threads.c index 7c020e2efc1..1e1816a00b0 100644 --- a/xlators/performance/io-threads/src/io-threads.c +++ b/xlators/performance/io-threads/src/io-threads.c @@ -356,7 +356,8 @@ iot_schedule (call_frame_t *frame, xlator_t *this, call_stub_t *stub)  out:          gf_msg_debug (this->name, 0, "%s scheduled as %s fop",                        gf_fop_list[stub->fop], iot_get_pri_meaning (pri)); -        ret = do_iot_schedule (this->private, stub, pri); +        if (this->private) +                ret = do_iot_schedule (this->private, stub, pri);          return ret;  } @@ -1073,8 +1074,7 @@ notify (xlator_t *this, int32_t event, void *data, ...)  {          iot_conf_t *conf = this->private; -        if ((GF_EVENT_PARENT_DOWN == event) || -            (GF_EVENT_CLEANUP == event)) +        if (GF_EVENT_PARENT_DOWN == event)                  iot_exit_threads (conf);          default_notify (this, event, data); diff --git a/xlators/protocol/server/src/server-rpc-fops.c b/xlators/protocol/server/src/server-rpc-fops.c index 21f78a38af4..91d5c030341 100644 --- a/xlators/protocol/server/src/server-rpc-fops.c +++ b/xlators/protocol/server/src/server-rpc-fops.c @@ -3487,6 +3487,13 @@ rpc_receive_common (rpcsvc_request_t *req, call_frame_t **fr,                  SERVER_REQ_SET_ERROR (req, ret);                  goto out;          } + +        if (!(*fr)->root->client->bound_xl->itable) { +                /* inode_table is not allocated successful in server_setvolume */ +                SERVER_REQ_SET_ERROR (req, ret); +                goto out; +        } +          ret = 0;  out: diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c index 6dc9d0fffb0..6fcbbd6060d 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -1569,9 +1569,8 @@ notify (xlator_t *this, int32_t event, void *data, ...)                                  (*trav_p) = (*trav_p)->next;                          glusterfs_mgmt_pmap_signout (ctx,                                                       victim->name); +                        /* we need the protocol/server xlator here as 'this' */                          glusterfs_autoscale_threads (THIS->ctx, -1); -                        default_notify (victim, GF_EVENT_CLEANUP, data); -                  }                  break; diff --git a/xlators/storage/posix/src/posix-handle.h b/xlators/storage/posix/src/posix-handle.h index 9af6a7a5442..21525c69762 100644 --- a/xlators/storage/posix/src/posix-handle.h +++ b/xlators/storage/posix/src/posix-handle.h @@ -180,6 +180,12 @@  #define MAKE_INODE_HANDLE(rpath, this, loc, iatt_p) do {                \ +        if (!this->private) {                                           \ +                gf_msg ("make_inode_handle", GF_LOG_ERROR, 0,           \ +                         P_MSG_INODE_HANDLE_CREATE,                     \ +                         "private is NULL, fini is already called");    \ +                break;                                                  \ +        }                                                               \          if (gf_uuid_is_null (loc->gfid)) {                              \                  gf_msg (this->name, GF_LOG_ERROR, 0,                    \                          P_MSG_INODE_HANDLE_CREATE,                      \ diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 9012e518afe..ef1acad19fc 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -1963,6 +1963,7 @@ abort:                          gf_log (THIS->name, GF_LOG_INFO, "detaching not-only "                                  " child %s", priv->base_path);                          top->notify (top, GF_EVENT_CLEANUP, victim); +                        xlator_mem_cleanup (victim);                  }          } diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index e0e40b12da1..f4b760a53cb 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -172,6 +172,8 @@ posix_forget (xlator_t *this, inode_t *inode)          struct posix_private   *priv_posix  = NULL;          priv_posix = (struct posix_private *) this->private; +        if (!priv_posix) +                return 0;          ret = inode_ctx_del (inode, this, &ctx_uint);          if (!ctx_uint) @@ -226,6 +228,7 @@ posix_lookup (call_frame_t *frame, xlator_t *this,          VALIDATE_OR_GOTO (frame, out);          VALIDATE_OR_GOTO (this, out);          VALIDATE_OR_GOTO (loc, out); +        VALIDATE_OR_GOTO (this->private, out);          priv = this->private; @@ -1279,6 +1282,8 @@ posix_releasedir (xlator_t *this,          }          priv = this->private; +        if (!priv) +                goto out;          pthread_mutex_lock (&priv->janitor_lock);          { @@ -2076,6 +2081,7 @@ posix_unlink (call_frame_t *frame, xlator_t *this,          VALIDATE_OR_GOTO (frame, out);          VALIDATE_OR_GOTO (this, out); +        VALIDATE_OR_GOTO (this->private, out);          VALIDATE_OR_GOTO (loc, out);          SET_FS_ID (frame->root->uid, frame->root->gid); @@ -3819,6 +3825,8 @@ posix_release (xlator_t *this, fd_t *fd)                          "pfd->dir is %p (not NULL) for file fd=%p",                          pfd->dir, fd);          } +        if (!priv) +                goto out;          pthread_mutex_lock (&priv->janitor_lock);          { @@ -4004,6 +4012,7 @@ posix_setxattr (call_frame_t *frame, xlator_t *this,          VALIDATE_OR_GOTO (frame, out);          VALIDATE_OR_GOTO (this, out); +        VALIDATE_OR_GOTO (this->private, out);          VALIDATE_OR_GOTO (loc, out);          VALIDATE_OR_GOTO (dict, out); @@ -4584,6 +4593,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,          VALIDATE_OR_GOTO (frame, out);          VALIDATE_OR_GOTO (this, out);          VALIDATE_OR_GOTO (loc, out); +        VALIDATE_OR_GOTO (this->private, out);          SET_FS_ID (frame->root->uid, frame->root->gid);          MAKE_INODE_HANDLE (real_path, this, loc, NULL); @@ -4691,6 +4701,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,                  goto done;          }          if (loc->inode && name && (XATTR_IS_PATHINFO (name))) { +                VALIDATE_OR_GOTO (this->private, out);                  if (LOC_HAS_ABSPATH (loc))                          MAKE_REAL_PATH (rpath, this, loc->path);                  else @@ -6943,9 +6954,6 @@ notify (xlator_t *this,          void *data,          ...)  { -        struct posix_private *priv = NULL; - -        priv = this->private;          switch (event)          {          case GF_EVENT_PARENT_UP: @@ -6954,26 +6962,6 @@ notify (xlator_t *this,                  default_notify (this, GF_EVENT_CHILD_UP, data);          }          break; -        case GF_EVENT_CLEANUP: -                if (priv->health_check) { -                        priv->health_check_active = _gf_false; -                        pthread_cancel (priv->health_check); -                        priv->health_check = 0; -                } -                if (priv->janitor) { -                        (void) gf_thread_cleanup_xint (priv->janitor); -                        priv->janitor = 0; -                } -                if (priv->fsyncer) { -                        (void) gf_thread_cleanup_xint (priv->fsyncer); -                        priv->fsyncer = 0; -                } -                if (priv->mount_lock) { -                        (void) sys_closedir (priv->mount_lock); -                        priv->mount_lock = NULL; -                } - -        break;          default:                  /* */                  break; @@ -7825,10 +7813,31 @@ fini (xlator_t *this)          if (!priv)                  return;          this->private = NULL; +        if (priv->health_check) { +                priv->health_check_active = _gf_false; +                pthread_cancel (priv->health_check); +                priv->health_check = 0; +        } +        if (priv->janitor) { +                (void) gf_thread_cleanup_xint (priv->janitor); +                priv->janitor = 0; +        } +        if (priv->fsyncer) { +                (void) gf_thread_cleanup_xint (priv->fsyncer); +                priv->fsyncer = 0; +        }          /*unlock brick dir*/          if (priv->mount_lock)                  (void) sys_closedir (priv->mount_lock); + +        GF_FREE (priv->base_path); +        LOCK_DESTROY (&priv->lock); +        pthread_mutex_destroy (&priv->janitor_lock); +        pthread_mutex_destroy (&priv->fsync_mutex); +        GF_FREE (priv->hostname); +        GF_FREE (priv->trash_path);          GF_FREE (priv); +          return;  }  struct xlator_dumpops dumpops = { diff --git a/xlators/system/posix-acl/src/posix-acl.c b/xlators/system/posix-acl/src/posix-acl.c index 5dac688e02d..aadd6fc9bb1 100644 --- a/xlators/system/posix-acl/src/posix-acl.c +++ b/xlators/system/posix-acl/src/posix-acl.c @@ -582,13 +582,15 @@ posix_acl_unref (xlator_t *this, struct posix_acl *acl)          int                     refcnt = 0;          conf = this->private; +        if (!conf) +                goto out;          LOCK(&conf->acl_lock);          {                  refcnt = --acl->refcnt;          }          UNLOCK(&conf->acl_lock); - +out:          if (!refcnt)                  posix_acl_destroy (this, acl);  }  | 
