|
|
d1681e |
From 40d6af4d4c42b1880abcf576a9a9b6e734298ff0 Mon Sep 17 00:00:00 2001
|
|
|
d1681e |
From: Mohit Agrawal <moagrawa@redhat.com>
|
|
|
d1681e |
Date: Sat, 10 Feb 2018 12:25:15 +0530
|
|
|
d1681e |
Subject: [PATCH 225/236] glusterfsd: Memleak in glusterfsd process while
|
|
|
d1681e |
brick mux is on
|
|
|
d1681e |
|
|
|
d1681e |
Problem: At the time of stopping the volume while brick multiplex is
|
|
|
d1681e |
enabled memory is not cleanup from all server side xlators.
|
|
|
d1681e |
|
|
|
d1681e |
Solution: To cleanup memory for all server side xlators call fini
|
|
|
d1681e |
in glusterfs_handle_terminate after send GF_EVENT_CLEANUP
|
|
|
d1681e |
notification to top xlator.
|
|
|
d1681e |
|
|
|
d1681e |
> BUG: 1544090
|
|
|
d1681e |
> (cherry picked from commit 7c3cc485054e4ede1efb358552135b432fb7047a)
|
|
|
d1681e |
> (upstream patch review link https://review.gluster.org/#/c/19616/)
|
|
|
d1681e |
|
|
|
d1681e |
BUG: 1535281
|
|
|
d1681e |
Change-Id: Ia10dc7f2605aa50f2b90b3fe4eb380ba9299e2fc
|
|
|
d1681e |
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
|
|
|
d1681e |
Reviewed-on: https://code.engineering.redhat.com/gerrit/136216
|
|
|
d1681e |
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
|
|
d1681e |
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
|
|
d1681e |
---
|
|
|
d1681e |
glusterfsd/src/glusterfsd-mgmt.c | 67 ++++++++++++++++++++
|
|
|
d1681e |
glusterfsd/src/glusterfsd.c | 13 ----
|
|
|
d1681e |
glusterfsd/src/glusterfsd.h | 3 +
|
|
|
d1681e |
xlators/debug/io-stats/src/io-stats.c | 1 -
|
|
|
d1681e |
xlators/features/bit-rot/src/stub/bit-rot-stub.c | 22 +++----
|
|
|
d1681e |
.../features/changelog/src/changelog-ev-handle.c | 8 ++-
|
|
|
d1681e |
.../features/changelog/src/changelog-rpc-common.c | 4 ++
|
|
|
d1681e |
xlators/features/changelog/src/changelog.c | 18 ++----
|
|
|
d1681e |
.../changetimerecorder/src/changetimerecorder.c | 15 ++---
|
|
|
d1681e |
xlators/features/index/src/index.c | 21 ++++---
|
|
|
d1681e |
xlators/features/leases/src/leases.c | 15 +++--
|
|
|
d1681e |
xlators/features/marker/src/marker.c | 69 ++++++++++++---------
|
|
|
d1681e |
xlators/features/quota/src/quota.c | 25 +++++++-
|
|
|
d1681e |
xlators/features/shard/src/shard.c | 3 +
|
|
|
d1681e |
xlators/features/trash/src/trash.c | 15 ++++-
|
|
|
d1681e |
xlators/features/upcall/src/upcall.c | 18 +++++-
|
|
|
d1681e |
.../performance/decompounder/src/decompounder.c | 7 +++
|
|
|
d1681e |
xlators/performance/io-threads/src/io-threads.c | 6 +-
|
|
|
d1681e |
xlators/protocol/server/src/server-rpc-fops.c | 7 +++
|
|
|
d1681e |
xlators/protocol/server/src/server.c | 1 -
|
|
|
d1681e |
xlators/storage/posix/src/posix-handle.h | 6 ++
|
|
|
d1681e |
xlators/storage/posix/src/posix-helpers.c | 1 +
|
|
|
d1681e |
xlators/storage/posix/src/posix.c | 71 ++++++++++++----------
|
|
|
d1681e |
xlators/system/posix-acl/src/posix-acl.c | 4 +-
|
|
|
d1681e |
24 files changed, 281 insertions(+), 139 deletions(-)
|
|
|
d1681e |
|
|
|
d1681e |
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c
|
|
|
d1681e |
index ef53d09..8f4450b 100644
|
|
|
d1681e |
--- a/glusterfsd/src/glusterfsd-mgmt.c
|
|
|
d1681e |
+++ b/glusterfsd/src/glusterfsd-mgmt.c
|
|
|
d1681e |
@@ -197,6 +197,72 @@ glusterfs_autoscale_threads (glusterfs_ctx_t *ctx, int incr, xlator_t *this)
|
|
|
d1681e |
rpcsvc_ownthread_reconf (conf->rpc, pool->eventthreadcount);
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
+static int
|
|
|
d1681e |
+xlator_mem_free (xlator_t *xl)
|
|
|
d1681e |
+{
|
|
|
d1681e |
+ volume_opt_list_t *vol_opt = NULL;
|
|
|
d1681e |
+ volume_opt_list_t *tmp = NULL;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (!xl)
|
|
|
d1681e |
+ return 0;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ GF_FREE (xl->name);
|
|
|
d1681e |
+ GF_FREE (xl->type);
|
|
|
d1681e |
+ xl->name = NULL;
|
|
|
d1681e |
+ xl->type = NULL;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (xl->options) {
|
|
|
d1681e |
+ dict_ref (xl->options);
|
|
|
d1681e |
+ dict_unref (xl->options);
|
|
|
d1681e |
+ xl->options = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ list_for_each_entry_safe (vol_opt, tmp, &xl->volume_options, list) {
|
|
|
d1681e |
+ list_del_init (&vol_opt->list);
|
|
|
d1681e |
+ GF_FREE (vol_opt);
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ return 0;
|
|
|
d1681e |
+}
|
|
|
d1681e |
+
|
|
|
d1681e |
+void
|
|
|
d1681e |
+xlator_call_fini (xlator_t *this) {
|
|
|
d1681e |
+ if (!this)
|
|
|
d1681e |
+ return;
|
|
|
d1681e |
+ xlator_call_fini (this->next);
|
|
|
d1681e |
+ this->fini (this);
|
|
|
d1681e |
+}
|
|
|
d1681e |
+
|
|
|
d1681e |
+void
|
|
|
d1681e |
+xlator_mem_cleanup (xlator_t *this) {
|
|
|
d1681e |
+ xlator_list_t *list = this->children;
|
|
|
d1681e |
+ xlator_t *trav = list->xlator;
|
|
|
d1681e |
+ inode_table_t *inode_table = NULL;
|
|
|
d1681e |
+ xlator_t *prev = trav;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ inode_table = this->itable;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ xlator_call_fini (trav);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ while (prev) {
|
|
|
d1681e |
+ trav = prev->next;
|
|
|
d1681e |
+ xlator_mem_free (prev);
|
|
|
d1681e |
+ prev = trav;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (inode_table) {
|
|
|
d1681e |
+ inode_table_destroy (inode_table);
|
|
|
d1681e |
+ this->itable = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (this->fini) {
|
|
|
d1681e |
+ this->fini (this);
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ xlator_mem_free (this);
|
|
|
d1681e |
+}
|
|
|
d1681e |
+
|
|
|
d1681e |
+
|
|
|
d1681e |
int
|
|
|
d1681e |
glusterfs_handle_terminate (rpcsvc_request_t *req)
|
|
|
d1681e |
{
|
|
|
d1681e |
@@ -263,6 +329,7 @@ glusterfs_handle_terminate (rpcsvc_request_t *req)
|
|
|
d1681e |
gf_log (THIS->name, GF_LOG_INFO, "detaching not-only"
|
|
|
d1681e |
" child %s", xlator_req.name);
|
|
|
d1681e |
top->notify (top, GF_EVENT_CLEANUP, victim);
|
|
|
d1681e |
+ xlator_mem_cleanup (victim);
|
|
|
d1681e |
}
|
|
|
d1681e |
err:
|
|
|
d1681e |
if (!lockflag)
|
|
|
d1681e |
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c
|
|
|
d1681e |
index 3ae89a6..6b7adc4 100644
|
|
|
d1681e |
--- a/glusterfsd/src/glusterfsd.c
|
|
|
d1681e |
+++ b/glusterfsd/src/glusterfsd.c
|
|
|
d1681e |
@@ -1416,20 +1416,7 @@ cleanup_and_exit (int signum)
|
|
|
d1681e |
}
|
|
|
d1681e |
#endif
|
|
|
d1681e |
|
|
|
d1681e |
- /* call fini() of each xlator */
|
|
|
d1681e |
-
|
|
|
d1681e |
- /*call fini for glusterd xlator */
|
|
|
d1681e |
- /* TODO : Invoke fini for rest of the xlators */
|
|
|
d1681e |
trav = NULL;
|
|
|
d1681e |
- if (ctx->active)
|
|
|
d1681e |
- trav = ctx->active->top;
|
|
|
d1681e |
- while (trav) {
|
|
|
d1681e |
- if (should_call_fini(ctx,trav)) {
|
|
|
d1681e |
- THIS = trav;
|
|
|
d1681e |
- trav->fini (trav);
|
|
|
d1681e |
- }
|
|
|
d1681e |
- trav = trav->next;
|
|
|
d1681e |
- }
|
|
|
d1681e |
|
|
|
d1681e |
/* NOTE: Only the least significant 8 bits i.e (signum & 255)
|
|
|
d1681e |
will be available to parent process on calling exit() */
|
|
|
d1681e |
diff --git a/glusterfsd/src/glusterfsd.h b/glusterfsd/src/glusterfsd.h
|
|
|
d1681e |
index 43cef52..a72acc8 100644
|
|
|
d1681e |
--- a/glusterfsd/src/glusterfsd.h
|
|
|
d1681e |
+++ b/glusterfsd/src/glusterfsd.h
|
|
|
d1681e |
@@ -126,5 +126,8 @@ int glusterfs_volume_top_read_perf (uint32_t blk_size, uint32_t blk_count,
|
|
|
d1681e |
void
|
|
|
d1681e |
glusterfs_autoscale_threads (glusterfs_ctx_t *ctx, int incr, xlator_t *this);
|
|
|
d1681e |
|
|
|
d1681e |
+void
|
|
|
d1681e |
+xlator_mem_cleanup (xlator_t *this);
|
|
|
d1681e |
+
|
|
|
d1681e |
extern glusterfs_ctx_t *glusterfsd_ctx;
|
|
|
d1681e |
#endif /* __GLUSTERFSD_H__ */
|
|
|
d1681e |
diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c
|
|
|
d1681e |
index a46d116..f46474b 100644
|
|
|
d1681e |
--- a/xlators/debug/io-stats/src/io-stats.c
|
|
|
d1681e |
+++ b/xlators/debug/io-stats/src/io-stats.c
|
|
|
d1681e |
@@ -300,7 +300,6 @@ is_fop_latency_started (call_frame_t *frame)
|
|
|
d1681e |
throughput, iosstat); \
|
|
|
d1681e |
} while (0)
|
|
|
d1681e |
|
|
|
d1681e |
-
|
|
|
d1681e |
static int
|
|
|
d1681e |
ios_fd_ctx_get (fd_t *fd, xlator_t *this, struct ios_fd **iosfd)
|
|
|
d1681e |
{
|
|
|
d1681e |
diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub.c b/xlators/features/bit-rot/src/stub/bit-rot-stub.c
|
|
|
d1681e |
index 4be7caa..05cac63 100644
|
|
|
d1681e |
--- a/xlators/features/bit-rot/src/stub/bit-rot-stub.c
|
|
|
d1681e |
+++ b/xlators/features/bit-rot/src/stub/bit-rot-stub.c
|
|
|
d1681e |
@@ -228,18 +228,6 @@ notify (xlator_t *this, int event, void *data, ...)
|
|
|
d1681e |
if (!priv)
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
|
|
|
d1681e |
- switch (event) {
|
|
|
d1681e |
- case GF_EVENT_CLEANUP:
|
|
|
d1681e |
- if (priv->signth) {
|
|
|
d1681e |
- (void) gf_thread_cleanup_xint (priv->signth);
|
|
|
d1681e |
- priv->signth = 0;
|
|
|
d1681e |
- }
|
|
|
d1681e |
- if (priv->container.thread) {
|
|
|
d1681e |
- (void) gf_thread_cleanup_xint (priv->container.thread);
|
|
|
d1681e |
- priv->container.thread = 0;
|
|
|
d1681e |
- }
|
|
|
d1681e |
- break;
|
|
|
d1681e |
- }
|
|
|
d1681e |
default_notify (this, event, data);
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
@@ -262,6 +250,7 @@ fini (xlator_t *this)
|
|
|
d1681e |
"Could not cancel sign serializer thread");
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
}
|
|
|
d1681e |
+ priv->signth = 0;
|
|
|
d1681e |
|
|
|
d1681e |
while (!list_empty (&priv->squeue)) {
|
|
|
d1681e |
sigstub = list_first_entry (&priv->squeue,
|
|
|
d1681e |
@@ -283,12 +272,19 @@ fini (xlator_t *this)
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
+ priv->container.thread = 0;
|
|
|
d1681e |
+
|
|
|
d1681e |
while (!list_empty (&priv->container.bad_queue)) {
|
|
|
d1681e |
stub = list_first_entry (&priv->container.bad_queue, call_stub_t,
|
|
|
d1681e |
list);
|
|
|
d1681e |
list_del_init (&stub->list);
|
|
|
d1681e |
call_stub_destroy (stub);
|
|
|
d1681e |
- };
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (priv->local_pool) {
|
|
|
d1681e |
+ mem_pool_destroy (priv->local_pool);
|
|
|
d1681e |
+ priv->local_pool = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
|
|
|
d1681e |
pthread_mutex_destroy (&priv->container.bad_lock);
|
|
|
d1681e |
pthread_cond_destroy (&priv->container.bad_cond);
|
|
|
d1681e |
diff --git a/xlators/features/changelog/src/changelog-ev-handle.c b/xlators/features/changelog/src/changelog-ev-handle.c
|
|
|
d1681e |
index 38e127b..3e8dc9a 100644
|
|
|
d1681e |
--- a/xlators/features/changelog/src/changelog-ev-handle.c
|
|
|
d1681e |
+++ b/xlators/features/changelog/src/changelog-ev-handle.c
|
|
|
d1681e |
@@ -163,12 +163,14 @@ changelog_rpc_notify (struct rpc_clnt *rpc,
|
|
|
d1681e |
*/
|
|
|
d1681e |
rpc_clnt_unref (crpc->rpc);
|
|
|
d1681e |
|
|
|
d1681e |
- selection = &priv->ev_selection;
|
|
|
d1681e |
+ if (priv)
|
|
|
d1681e |
+ selection = &priv->ev_selection;
|
|
|
d1681e |
|
|
|
d1681e |
LOCK (&crpc->lock);
|
|
|
d1681e |
{
|
|
|
d1681e |
- changelog_deselect_event (this, selection,
|
|
|
d1681e |
- crpc->filter);
|
|
|
d1681e |
+ if (selection)
|
|
|
d1681e |
+ changelog_deselect_event (this, selection,
|
|
|
d1681e |
+ crpc->filter);
|
|
|
d1681e |
changelog_set_disconnect_flag (crpc, _gf_true);
|
|
|
d1681e |
}
|
|
|
d1681e |
UNLOCK (&crpc->lock);
|
|
|
d1681e |
diff --git a/xlators/features/changelog/src/changelog-rpc-common.c b/xlators/features/changelog/src/changelog-rpc-common.c
|
|
|
d1681e |
index 08cd41e..21bef76 100644
|
|
|
d1681e |
--- a/xlators/features/changelog/src/changelog-rpc-common.c
|
|
|
d1681e |
+++ b/xlators/features/changelog/src/changelog-rpc-common.c
|
|
|
d1681e |
@@ -275,6 +275,10 @@ changelog_rpc_server_destroy (xlator_t *this, rpcsvc_t *rpc, char *sockfile,
|
|
|
d1681e |
|
|
|
d1681e |
(void) rpcsvc_unregister_notify (rpc, fn, this);
|
|
|
d1681e |
sys_unlink (sockfile);
|
|
|
d1681e |
+ if (rpc->rxpool) {
|
|
|
d1681e |
+ mem_pool_destroy (rpc->rxpool);
|
|
|
d1681e |
+ rpc->rxpool = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
|
|
|
d1681e |
GF_FREE (rpc);
|
|
|
d1681e |
}
|
|
|
d1681e |
diff --git a/xlators/features/changelog/src/changelog.c b/xlators/features/changelog/src/changelog.c
|
|
|
d1681e |
index 8b22a04..a472208 100644
|
|
|
d1681e |
--- a/xlators/features/changelog/src/changelog.c
|
|
|
d1681e |
+++ b/xlators/features/changelog/src/changelog.c
|
|
|
d1681e |
@@ -2110,20 +2110,6 @@ notify (xlator_t *this, int event, void *data, ...)
|
|
|
d1681e |
if (!priv)
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
|
|
|
d1681e |
- if (event == GF_EVENT_CLEANUP) {
|
|
|
d1681e |
- if (priv->connector) {
|
|
|
d1681e |
- (void) gf_thread_cleanup_xint (priv->connector);
|
|
|
d1681e |
- priv->connector = 0;
|
|
|
d1681e |
- }
|
|
|
d1681e |
-
|
|
|
d1681e |
- for (; i < NR_DISPATCHERS; i++) {
|
|
|
d1681e |
- if (priv->ev_dispatcher[i]) {
|
|
|
d1681e |
- (void) gf_thread_cleanup_xint (priv->ev_dispatcher[i]);
|
|
|
d1681e |
- priv->ev_dispatcher[i] = 0;
|
|
|
d1681e |
- }
|
|
|
d1681e |
- }
|
|
|
d1681e |
- }
|
|
|
d1681e |
-
|
|
|
d1681e |
if (event == GF_EVENT_TRANSLATOR_OP) {
|
|
|
d1681e |
|
|
|
d1681e |
dict = data;
|
|
|
d1681e |
@@ -2901,6 +2887,9 @@ fini (xlator_t *this)
|
|
|
d1681e |
/* cleanup barrier related objects */
|
|
|
d1681e |
changelog_barrier_pthread_destroy (priv);
|
|
|
d1681e |
|
|
|
d1681e |
+ /* cleanup helper threads */
|
|
|
d1681e |
+ changelog_cleanup_helper_threads (this, priv);
|
|
|
d1681e |
+
|
|
|
d1681e |
/* cleanup allocated options */
|
|
|
d1681e |
changelog_freeup_options (this, priv);
|
|
|
d1681e |
|
|
|
d1681e |
@@ -2911,6 +2900,7 @@ fini (xlator_t *this)
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
this->private = NULL;
|
|
|
d1681e |
+ this->local_pool = NULL;
|
|
|
d1681e |
|
|
|
d1681e |
return;
|
|
|
d1681e |
}
|
|
|
d1681e |
diff --git a/xlators/features/changetimerecorder/src/changetimerecorder.c b/xlators/features/changetimerecorder/src/changetimerecorder.c
|
|
|
d1681e |
index 99519d1..5f82d33 100644
|
|
|
d1681e |
--- a/xlators/features/changetimerecorder/src/changetimerecorder.c
|
|
|
d1681e |
+++ b/xlators/features/changetimerecorder/src/changetimerecorder.c
|
|
|
d1681e |
@@ -19,7 +19,6 @@
|
|
|
d1681e |
#include "tier-ctr-interface.h"
|
|
|
d1681e |
|
|
|
d1681e |
/*******************************inode forget***********************************/
|
|
|
d1681e |
-
|
|
|
d1681e |
int
|
|
|
d1681e |
ctr_forget (xlator_t *this, inode_t *inode)
|
|
|
d1681e |
{
|
|
|
d1681e |
@@ -2310,15 +2309,6 @@ notify (xlator_t *this, int event, void *data, ...)
|
|
|
d1681e |
if (!priv)
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
|
|
|
d1681e |
- if (event == GF_EVENT_CLEANUP) {
|
|
|
d1681e |
- if (fini_db (priv->_db_conn)) {
|
|
|
d1681e |
- gf_msg (this->name, GF_LOG_WARNING, 0,
|
|
|
d1681e |
- CTR_MSG_CLOSE_DB_CONN_FAILED, "Failed closing "
|
|
|
d1681e |
- "db connection");
|
|
|
d1681e |
- }
|
|
|
d1681e |
- if (priv->_db_conn)
|
|
|
d1681e |
- priv->_db_conn = NULL;
|
|
|
d1681e |
- }
|
|
|
d1681e |
ret = default_notify (this, event, data);
|
|
|
d1681e |
|
|
|
d1681e |
out:
|
|
|
d1681e |
@@ -2359,6 +2349,10 @@ fini (xlator_t *this)
|
|
|
d1681e |
CTR_MSG_CLOSE_DB_CONN_FAILED, "Failed closing "
|
|
|
d1681e |
"db connection");
|
|
|
d1681e |
}
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (priv->_db_conn)
|
|
|
d1681e |
+ priv->_db_conn = NULL;
|
|
|
d1681e |
+
|
|
|
d1681e |
GF_FREE (priv->ctr_db_path);
|
|
|
d1681e |
if (pthread_mutex_destroy (&priv->compact_lock)) {
|
|
|
d1681e |
gf_msg (this->name, GF_LOG_WARNING, 0,
|
|
|
d1681e |
@@ -2368,6 +2362,7 @@ fini (xlator_t *this)
|
|
|
d1681e |
}
|
|
|
d1681e |
GF_FREE (priv);
|
|
|
d1681e |
mem_pool_destroy (this->local_pool);
|
|
|
d1681e |
+ this->local_pool = NULL;
|
|
|
d1681e |
|
|
|
d1681e |
return;
|
|
|
d1681e |
}
|
|
|
d1681e |
diff --git a/xlators/features/index/src/index.c b/xlators/features/index/src/index.c
|
|
|
d1681e |
index 8590482..f3b0270 100644
|
|
|
d1681e |
--- a/xlators/features/index/src/index.c
|
|
|
d1681e |
+++ b/xlators/features/index/src/index.c
|
|
|
d1681e |
@@ -2444,6 +2444,13 @@ fini (xlator_t *this)
|
|
|
d1681e |
priv = this->private;
|
|
|
d1681e |
if (!priv)
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ priv->down = _gf_true;
|
|
|
d1681e |
+ pthread_cond_broadcast (&priv->cond);
|
|
|
d1681e |
+ if (priv->thread) {
|
|
|
d1681e |
+ gf_thread_cleanup_xint (priv->thread);
|
|
|
d1681e |
+ priv->thread = 0;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
this->private = NULL;
|
|
|
d1681e |
LOCK_DESTROY (&priv->lock);
|
|
|
d1681e |
pthread_cond_destroy (&priv->cond);
|
|
|
d1681e |
@@ -2455,8 +2462,11 @@ fini (xlator_t *this)
|
|
|
d1681e |
if (priv->complete_watchlist)
|
|
|
d1681e |
dict_unref (priv->complete_watchlist);
|
|
|
d1681e |
GF_FREE (priv);
|
|
|
d1681e |
- mem_pool_destroy (this->local_pool);
|
|
|
d1681e |
- this->local_pool = NULL;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (this->local_pool) {
|
|
|
d1681e |
+ mem_pool_destroy (this->local_pool);
|
|
|
d1681e |
+ this->local_pool = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
out:
|
|
|
d1681e |
return;
|
|
|
d1681e |
}
|
|
|
d1681e |
@@ -2526,13 +2536,6 @@ notify (xlator_t *this, int event, void *data, ...)
|
|
|
d1681e |
if (!priv)
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
|
|
|
d1681e |
- switch (event) {
|
|
|
d1681e |
- case GF_EVENT_CLEANUP:
|
|
|
d1681e |
- priv->down = _gf_true;
|
|
|
d1681e |
- pthread_cond_broadcast (&priv->cond);
|
|
|
d1681e |
- break;
|
|
|
d1681e |
- }
|
|
|
d1681e |
-
|
|
|
d1681e |
ret = default_notify (this, event, data);
|
|
|
d1681e |
return ret;
|
|
|
d1681e |
}
|
|
|
d1681e |
diff --git a/xlators/features/leases/src/leases.c b/xlators/features/leases/src/leases.c
|
|
|
d1681e |
index 551dd9b..a8ffb35 100644
|
|
|
d1681e |
--- a/xlators/features/leases/src/leases.c
|
|
|
d1681e |
+++ b/xlators/features/leases/src/leases.c
|
|
|
d1681e |
@@ -1062,14 +1062,17 @@ fini (xlator_t *this)
|
|
|
d1681e |
|
|
|
d1681e |
priv->fini = _gf_true;
|
|
|
d1681e |
pthread_cond_broadcast (&priv->cond);
|
|
|
d1681e |
- pthread_join (priv->recall_thr, NULL);
|
|
|
d1681e |
-
|
|
|
d1681e |
- priv->inited_recall_thr = _gf_false;
|
|
|
d1681e |
+ if (priv->recall_thr) {
|
|
|
d1681e |
+ gf_thread_cleanup_xint (priv->recall_thr);
|
|
|
d1681e |
+ priv->recall_thr = 0;
|
|
|
d1681e |
+ priv->inited_recall_thr = _gf_false;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
|
|
|
d1681e |
GF_FREE (priv);
|
|
|
d1681e |
-
|
|
|
d1681e |
- glusterfs_ctx_tw_put (this->ctx);
|
|
|
d1681e |
-
|
|
|
d1681e |
+ if (this->ctx->tw) {
|
|
|
d1681e |
+ glusterfs_ctx_tw_put (this->ctx);
|
|
|
d1681e |
+ this->ctx->tw = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c
|
|
|
d1681e |
index b51b9cc..3094c68 100644
|
|
|
d1681e |
--- a/xlators/features/marker/src/marker.c
|
|
|
d1681e |
+++ b/xlators/features/marker/src/marker.c
|
|
|
d1681e |
@@ -3193,9 +3193,9 @@ mem_acct_init (xlator_t *this)
|
|
|
d1681e |
int32_t
|
|
|
d1681e |
init_xtime_priv (xlator_t *this, dict_t *options)
|
|
|
d1681e |
{
|
|
|
d1681e |
- data_t *data = NULL;
|
|
|
d1681e |
int32_t ret = -1;
|
|
|
d1681e |
marker_conf_t *priv = NULL;
|
|
|
d1681e |
+ char *tmp_opt = NULL;
|
|
|
d1681e |
|
|
|
d1681e |
GF_VALIDATE_OR_GOTO ("marker", this, out);
|
|
|
d1681e |
GF_VALIDATE_OR_GOTO (this->name, options, out);
|
|
|
d1681e |
@@ -3203,29 +3203,11 @@ init_xtime_priv (xlator_t *this, dict_t *options)
|
|
|
d1681e |
|
|
|
d1681e |
priv = this->private;
|
|
|
d1681e |
|
|
|
d1681e |
- if((data = dict_get (options, VOLUME_UUID)) != NULL) {
|
|
|
d1681e |
- priv->volume_uuid = data->data;
|
|
|
d1681e |
+ ret = dict_get_str (options, "volume-uuid", &tmp_opt);
|
|
|
d1681e |
|
|
|
d1681e |
- ret = gf_uuid_parse (priv->volume_uuid, priv->volume_uuid_bin);
|
|
|
d1681e |
- if (ret == -1) {
|
|
|
d1681e |
- gf_log (this->name, GF_LOG_ERROR,
|
|
|
d1681e |
- "invalid volume uuid %s", priv->volume_uuid);
|
|
|
d1681e |
- goto out;
|
|
|
d1681e |
- }
|
|
|
d1681e |
-
|
|
|
d1681e |
- ret = gf_asprintf (& (priv->marker_xattr), "%s.%s.%s",
|
|
|
d1681e |
- MARKER_XATTR_PREFIX, priv->volume_uuid,
|
|
|
d1681e |
- XTIME);
|
|
|
d1681e |
-
|
|
|
d1681e |
- if (ret == -1){
|
|
|
d1681e |
- priv->marker_xattr = NULL;
|
|
|
d1681e |
- goto out;
|
|
|
d1681e |
- }
|
|
|
d1681e |
-
|
|
|
d1681e |
- gf_log (this->name, GF_LOG_DEBUG,
|
|
|
d1681e |
- "volume-uuid = %s", priv->volume_uuid);
|
|
|
d1681e |
- } else {
|
|
|
d1681e |
+ if (ret) {
|
|
|
d1681e |
priv->volume_uuid = NULL;
|
|
|
d1681e |
+ tmp_opt = "";
|
|
|
d1681e |
|
|
|
d1681e |
gf_log (this->name, GF_LOG_ERROR,
|
|
|
d1681e |
"please specify the volume-uuid"
|
|
|
d1681e |
@@ -3233,16 +3215,32 @@ init_xtime_priv (xlator_t *this, dict_t *options)
|
|
|
d1681e |
|
|
|
d1681e |
return -1;
|
|
|
d1681e |
}
|
|
|
d1681e |
+ gf_asprintf (&priv->volume_uuid, "%s", tmp_opt);
|
|
|
d1681e |
|
|
|
d1681e |
- if ((data = dict_get (options, TIMESTAMP_FILE)) != NULL) {
|
|
|
d1681e |
- priv->timestamp_file = data->data;
|
|
|
d1681e |
+ ret = gf_uuid_parse (priv->volume_uuid, priv->volume_uuid_bin);
|
|
|
d1681e |
|
|
|
d1681e |
- gf_log (this->name, GF_LOG_DEBUG,
|
|
|
d1681e |
- "the timestamp-file is = %s",
|
|
|
d1681e |
- priv->timestamp_file);
|
|
|
d1681e |
+ if (ret == -1) {
|
|
|
d1681e |
+ gf_log (this->name, GF_LOG_ERROR,
|
|
|
d1681e |
+ "invalid volume uuid %s", priv->volume_uuid);
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
|
|
|
d1681e |
- } else {
|
|
|
d1681e |
+ ret = gf_asprintf (&(priv->marker_xattr), "%s.%s.%s",
|
|
|
d1681e |
+ MARKER_XATTR_PREFIX, priv->volume_uuid,
|
|
|
d1681e |
+ XTIME);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (ret == -1) {
|
|
|
d1681e |
+ priv->marker_xattr = NULL;
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ gf_log (this->name, GF_LOG_DEBUG,
|
|
|
d1681e |
+ "volume-uuid = %s", priv->volume_uuid);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ ret = dict_get_str (options, "timestamp-file", &tmp_opt);
|
|
|
d1681e |
+ if (ret) {
|
|
|
d1681e |
priv->timestamp_file = NULL;
|
|
|
d1681e |
+ tmp_opt = "";
|
|
|
d1681e |
|
|
|
d1681e |
gf_log (this->name, GF_LOG_ERROR,
|
|
|
d1681e |
"please specify the timestamp-file"
|
|
|
d1681e |
@@ -3251,6 +3249,15 @@ init_xtime_priv (xlator_t *this, dict_t *options)
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
+ ret = gf_asprintf (&priv->timestamp_file, "%s", tmp_opt);
|
|
|
d1681e |
+ if (ret == -1) {
|
|
|
d1681e |
+ priv->timestamp_file = NULL;
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ gf_log (this->name, GF_LOG_DEBUG,
|
|
|
d1681e |
+ "the timestamp-file is = %s", priv->timestamp_file);
|
|
|
d1681e |
+
|
|
|
d1681e |
ret = 0;
|
|
|
d1681e |
out:
|
|
|
d1681e |
return ret;
|
|
|
d1681e |
@@ -3292,6 +3299,12 @@ marker_priv_cleanup (xlator_t *this)
|
|
|
d1681e |
LOCK_DESTROY (&priv->lock);
|
|
|
d1681e |
|
|
|
d1681e |
GF_FREE (priv);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (this->local_pool) {
|
|
|
d1681e |
+ mem_pool_destroy (this->local_pool);
|
|
|
d1681e |
+ this->local_pool = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
out:
|
|
|
d1681e |
return;
|
|
|
d1681e |
}
|
|
|
d1681e |
diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c
|
|
|
d1681e |
index af7b65a..c4817bc 100644
|
|
|
d1681e |
--- a/xlators/features/quota/src/quota.c
|
|
|
d1681e |
+++ b/xlators/features/quota/src/quota.c
|
|
|
d1681e |
@@ -5221,12 +5221,14 @@ quota_priv_dump (xlator_t *this)
|
|
|
d1681e |
GF_ASSERT (this);
|
|
|
d1681e |
|
|
|
d1681e |
priv = this->private;
|
|
|
d1681e |
+ if (!priv)
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
|
|
|
d1681e |
gf_proc_dump_add_section ("xlators.features.quota.priv", this->name);
|
|
|
d1681e |
|
|
|
d1681e |
ret = TRY_LOCK (&priv->lock);
|
|
|
d1681e |
if (ret)
|
|
|
d1681e |
- goto out;
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
else {
|
|
|
d1681e |
gf_proc_dump_write("soft-timeout", "%d", priv->soft_timeout);
|
|
|
d1681e |
gf_proc_dump_write("hard-timeout", "%d", priv->hard_timeout);
|
|
|
d1681e |
@@ -5246,6 +5248,27 @@ out:
|
|
|
d1681e |
void
|
|
|
d1681e |
fini (xlator_t *this)
|
|
|
d1681e |
{
|
|
|
d1681e |
+ quota_priv_t *priv = NULL;
|
|
|
d1681e |
+ rpc_clnt_t *rpc = NULL;
|
|
|
d1681e |
+ int i = 0, cnt = 0;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ priv = this->private;
|
|
|
d1681e |
+ if (!priv)
|
|
|
d1681e |
+ return;
|
|
|
d1681e |
+ rpc = priv->rpc_clnt;
|
|
|
d1681e |
+ priv->rpc_clnt = NULL;
|
|
|
d1681e |
+ this->private = NULL;
|
|
|
d1681e |
+ if (rpc) {
|
|
|
d1681e |
+ cnt = GF_ATOMIC_GET (rpc->refcount);
|
|
|
d1681e |
+ for (i = 0; i < cnt; i++)
|
|
|
d1681e |
+ rpc_clnt_unref (rpc);
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ LOCK_DESTROY (&priv->lock);
|
|
|
d1681e |
+ GF_FREE (priv);
|
|
|
d1681e |
+ if (this->local_pool) {
|
|
|
d1681e |
+ mem_pool_destroy (this->local_pool);
|
|
|
d1681e |
+ this->local_pool = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
return;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c
|
|
|
d1681e |
index 945458e..29989d3 100644
|
|
|
d1681e |
--- a/xlators/features/shard/src/shard.c
|
|
|
d1681e |
+++ b/xlators/features/shard/src/shard.c
|
|
|
d1681e |
@@ -5514,6 +5514,9 @@ shard_forget (xlator_t *this, inode_t *inode)
|
|
|
d1681e |
shard_priv_t *priv = NULL;
|
|
|
d1681e |
|
|
|
d1681e |
priv = this->private;
|
|
|
d1681e |
+ if (!priv)
|
|
|
d1681e |
+ return 0;
|
|
|
d1681e |
+
|
|
|
d1681e |
inode_ctx_del (inode, this, &ctx_uint);
|
|
|
d1681e |
if (!ctx_uint)
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
diff --git a/xlators/features/trash/src/trash.c b/xlators/features/trash/src/trash.c
|
|
|
d1681e |
index 4a41a14..d114858 100644
|
|
|
d1681e |
--- a/xlators/features/trash/src/trash.c
|
|
|
d1681e |
+++ b/xlators/features/trash/src/trash.c
|
|
|
d1681e |
@@ -33,7 +33,6 @@ trash_unlink_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
|
|
|
d1681e |
struct iatt *preoldparent, struct iatt *postoldparent,
|
|
|
d1681e |
struct iatt *prenewparent, struct iatt *postnewparent,
|
|
|
d1681e |
dict_t *xdata);
|
|
|
d1681e |
-
|
|
|
d1681e |
/* Common routines used in this translator */
|
|
|
d1681e |
|
|
|
d1681e |
/**
|
|
|
d1681e |
@@ -2406,6 +2405,7 @@ notify (xlator_t *this, int event, void *data, ...)
|
|
|
d1681e |
ret = create_internalop_directory (this);
|
|
|
d1681e |
|
|
|
d1681e |
}
|
|
|
d1681e |
+
|
|
|
d1681e |
out:
|
|
|
d1681e |
ret = default_notify (this, event, data);
|
|
|
d1681e |
if (ret)
|
|
|
d1681e |
@@ -2587,10 +2587,11 @@ void
|
|
|
d1681e |
fini (xlator_t *this)
|
|
|
d1681e |
{
|
|
|
d1681e |
trash_private_t *priv = NULL;
|
|
|
d1681e |
+ inode_table_t *inode_table = NULL;
|
|
|
d1681e |
|
|
|
d1681e |
GF_VALIDATE_OR_GOTO ("trash", this, out);
|
|
|
d1681e |
priv = this->private;
|
|
|
d1681e |
-
|
|
|
d1681e |
+ inode_table = priv->trash_itable;
|
|
|
d1681e |
if (priv) {
|
|
|
d1681e |
if (priv->newtrash_dir)
|
|
|
d1681e |
GF_FREE (priv->newtrash_dir);
|
|
|
d1681e |
@@ -2600,9 +2601,17 @@ fini (xlator_t *this)
|
|
|
d1681e |
GF_FREE (priv->brick_path);
|
|
|
d1681e |
if (priv->eliminate)
|
|
|
d1681e |
wipe_eliminate_path (&priv->eliminate);
|
|
|
d1681e |
+ if (inode_table) {
|
|
|
d1681e |
+ inode_table_destroy (inode_table);
|
|
|
d1681e |
+ priv->trash_itable = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
GF_FREE (priv);
|
|
|
d1681e |
}
|
|
|
d1681e |
- mem_pool_destroy (this->local_pool);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (this->local_pool) {
|
|
|
d1681e |
+ mem_pool_destroy (this->local_pool);
|
|
|
d1681e |
+ this->local_pool = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
this->private = NULL;
|
|
|
d1681e |
out:
|
|
|
d1681e |
return;
|
|
|
d1681e |
diff --git a/xlators/features/upcall/src/upcall.c b/xlators/features/upcall/src/upcall.c
|
|
|
d1681e |
index 3e1d307..66d22f6 100644
|
|
|
d1681e |
--- a/xlators/features/upcall/src/upcall.c
|
|
|
d1681e |
+++ b/xlators/features/upcall/src/upcall.c
|
|
|
d1681e |
@@ -2447,8 +2447,11 @@ fini (xlator_t *this)
|
|
|
d1681e |
|
|
|
d1681e |
priv->fini = 1;
|
|
|
d1681e |
|
|
|
d1681e |
- if (priv->reaper_init_done)
|
|
|
d1681e |
- pthread_join (priv->reaper_thr, NULL);
|
|
|
d1681e |
+ if (priv->reaper_thr) {
|
|
|
d1681e |
+ gf_thread_cleanup_xint (priv->reaper_thr);
|
|
|
d1681e |
+ priv->reaper_thr = 0;
|
|
|
d1681e |
+ priv->reaper_init_done = _gf_false;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
|
|
|
d1681e |
dict_unref (priv->xattrs);
|
|
|
d1681e |
LOCK_DESTROY (&priv->inode_ctx_lk);
|
|
|
d1681e |
@@ -2458,13 +2461,24 @@ fini (xlator_t *this)
|
|
|
d1681e |
* before calling xlator_fini */
|
|
|
d1681e |
GF_FREE (priv);
|
|
|
d1681e |
|
|
|
d1681e |
+ if (this->local_pool) {
|
|
|
d1681e |
+ mem_pool_destroy (this->local_pool);
|
|
|
d1681e |
+ this->local_pool = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
int
|
|
|
d1681e |
upcall_forget (xlator_t *this, inode_t *inode)
|
|
|
d1681e |
{
|
|
|
d1681e |
+ upcall_private_t *priv = this->private;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (!priv)
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+
|
|
|
d1681e |
upcall_cleanup_inode_ctx (this, inode);
|
|
|
d1681e |
+out:
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
diff --git a/xlators/performance/decompounder/src/decompounder.c b/xlators/performance/decompounder/src/decompounder.c
|
|
|
d1681e |
index d3d9b9f..095a300 100644
|
|
|
d1681e |
--- a/xlators/performance/decompounder/src/decompounder.c
|
|
|
d1681e |
+++ b/xlators/performance/decompounder/src/decompounder.c
|
|
|
d1681e |
@@ -946,5 +946,12 @@ out:
|
|
|
d1681e |
int32_t
|
|
|
d1681e |
fini (xlator_t *this)
|
|
|
d1681e |
{
|
|
|
d1681e |
+ if (!this)
|
|
|
d1681e |
+ return 0;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (this->local_pool) {
|
|
|
d1681e |
+ mem_pool_destroy (this->local_pool);
|
|
|
d1681e |
+ this->local_pool = NULL;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
diff --git a/xlators/performance/io-threads/src/io-threads.c b/xlators/performance/io-threads/src/io-threads.c
|
|
|
d1681e |
index 7c020e2..1e1816a 100644
|
|
|
d1681e |
--- a/xlators/performance/io-threads/src/io-threads.c
|
|
|
d1681e |
+++ b/xlators/performance/io-threads/src/io-threads.c
|
|
|
d1681e |
@@ -356,7 +356,8 @@ iot_schedule (call_frame_t *frame, xlator_t *this, call_stub_t *stub)
|
|
|
d1681e |
out:
|
|
|
d1681e |
gf_msg_debug (this->name, 0, "%s scheduled as %s fop",
|
|
|
d1681e |
gf_fop_list[stub->fop], iot_get_pri_meaning (pri));
|
|
|
d1681e |
- ret = do_iot_schedule (this->private, stub, pri);
|
|
|
d1681e |
+ if (this->private)
|
|
|
d1681e |
+ ret = do_iot_schedule (this->private, stub, pri);
|
|
|
d1681e |
return ret;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
@@ -1073,8 +1074,7 @@ notify (xlator_t *this, int32_t event, void *data, ...)
|
|
|
d1681e |
{
|
|
|
d1681e |
iot_conf_t *conf = this->private;
|
|
|
d1681e |
|
|
|
d1681e |
- if ((GF_EVENT_PARENT_DOWN == event) ||
|
|
|
d1681e |
- (GF_EVENT_CLEANUP == event))
|
|
|
d1681e |
+ if (GF_EVENT_PARENT_DOWN == event)
|
|
|
d1681e |
iot_exit_threads (conf);
|
|
|
d1681e |
|
|
|
d1681e |
default_notify (this, event, data);
|
|
|
d1681e |
diff --git a/xlators/protocol/server/src/server-rpc-fops.c b/xlators/protocol/server/src/server-rpc-fops.c
|
|
|
d1681e |
index 21f78a3..91d5c03 100644
|
|
|
d1681e |
--- a/xlators/protocol/server/src/server-rpc-fops.c
|
|
|
d1681e |
+++ b/xlators/protocol/server/src/server-rpc-fops.c
|
|
|
d1681e |
@@ -3487,6 +3487,13 @@ rpc_receive_common (rpcsvc_request_t *req, call_frame_t **fr,
|
|
|
d1681e |
SERVER_REQ_SET_ERROR (req, ret);
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
}
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (!(*fr)->root->client->bound_xl->itable) {
|
|
|
d1681e |
+ /* inode_table is not allocated successful in server_setvolume */
|
|
|
d1681e |
+ SERVER_REQ_SET_ERROR (req, ret);
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
ret = 0;
|
|
|
d1681e |
|
|
|
d1681e |
out:
|
|
|
d1681e |
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c
|
|
|
d1681e |
index 89fde39..737bb96 100644
|
|
|
d1681e |
--- a/xlators/protocol/server/src/server.c
|
|
|
d1681e |
+++ b/xlators/protocol/server/src/server.c
|
|
|
d1681e |
@@ -1578,7 +1578,6 @@ notify (xlator_t *this, int32_t event, void *data, ...)
|
|
|
d1681e |
victim->name);
|
|
|
d1681e |
/* we need the protocol/server xlator here as 'this' */
|
|
|
d1681e |
glusterfs_autoscale_threads (ctx, -1, this);
|
|
|
d1681e |
- default_notify (victim, GF_EVENT_CLEANUP, data);
|
|
|
d1681e |
}
|
|
|
d1681e |
break;
|
|
|
d1681e |
|
|
|
d1681e |
diff --git a/xlators/storage/posix/src/posix-handle.h b/xlators/storage/posix/src/posix-handle.h
|
|
|
d1681e |
index a40feb5..cb1f84e 100644
|
|
|
d1681e |
--- a/xlators/storage/posix/src/posix-handle.h
|
|
|
d1681e |
+++ b/xlators/storage/posix/src/posix-handle.h
|
|
|
d1681e |
@@ -180,6 +180,12 @@
|
|
|
d1681e |
|
|
|
d1681e |
|
|
|
d1681e |
#define MAKE_INODE_HANDLE(rpath, this, loc, iatt_p) do { \
|
|
|
d1681e |
+ if (!this->private) { \
|
|
|
d1681e |
+ gf_msg ("make_inode_handle", GF_LOG_ERROR, 0, \
|
|
|
d1681e |
+ P_MSG_INODE_HANDLE_CREATE, \
|
|
|
d1681e |
+ "private is NULL, fini is already called"); \
|
|
|
d1681e |
+ break; \
|
|
|
d1681e |
+ } \
|
|
|
d1681e |
if (gf_uuid_is_null (loc->gfid)) { \
|
|
|
d1681e |
gf_msg (this->name, GF_LOG_ERROR, 0, \
|
|
|
d1681e |
P_MSG_INODE_HANDLE_CREATE, \
|
|
|
d1681e |
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
|
|
|
d1681e |
index 4107265..334175d 100644
|
|
|
d1681e |
--- a/xlators/storage/posix/src/posix-helpers.c
|
|
|
d1681e |
+++ b/xlators/storage/posix/src/posix-helpers.c
|
|
|
d1681e |
@@ -1972,6 +1972,7 @@ abort:
|
|
|
d1681e |
gf_log (THIS->name, GF_LOG_INFO, "detaching not-only "
|
|
|
d1681e |
" child %s", priv->base_path);
|
|
|
d1681e |
top->notify (top, GF_EVENT_CLEANUP, victim);
|
|
|
d1681e |
+ xlator_mem_cleanup (victim);
|
|
|
d1681e |
}
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
|
|
|
d1681e |
index d1ef8a2..74ee98f 100644
|
|
|
d1681e |
--- a/xlators/storage/posix/src/posix.c
|
|
|
d1681e |
+++ b/xlators/storage/posix/src/posix.c
|
|
|
d1681e |
@@ -172,6 +172,8 @@ posix_forget (xlator_t *this, inode_t *inode)
|
|
|
d1681e |
struct posix_private *priv_posix = NULL;
|
|
|
d1681e |
|
|
|
d1681e |
priv_posix = (struct posix_private *) this->private;
|
|
|
d1681e |
+ if (!priv_posix)
|
|
|
d1681e |
+ return 0;
|
|
|
d1681e |
|
|
|
d1681e |
ret = inode_ctx_del (inode, this, &ctx_uint);
|
|
|
d1681e |
if (!ctx_uint)
|
|
|
d1681e |
@@ -226,6 +228,7 @@ posix_lookup (call_frame_t *frame, xlator_t *this,
|
|
|
d1681e |
VALIDATE_OR_GOTO (frame, out);
|
|
|
d1681e |
VALIDATE_OR_GOTO (this, out);
|
|
|
d1681e |
VALIDATE_OR_GOTO (loc, out);
|
|
|
d1681e |
+ VALIDATE_OR_GOTO (this->private, out);
|
|
|
d1681e |
|
|
|
d1681e |
priv = this->private;
|
|
|
d1681e |
|
|
|
d1681e |
@@ -1304,6 +1307,8 @@ posix_releasedir (xlator_t *this,
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
priv = this->private;
|
|
|
d1681e |
+ if (!priv)
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
|
|
|
d1681e |
pthread_mutex_lock (&priv->janitor_lock);
|
|
|
d1681e |
{
|
|
|
d1681e |
@@ -2103,6 +2108,7 @@ posix_unlink (call_frame_t *frame, xlator_t *this,
|
|
|
d1681e |
VALIDATE_OR_GOTO (frame, out);
|
|
|
d1681e |
VALIDATE_OR_GOTO (this, out);
|
|
|
d1681e |
VALIDATE_OR_GOTO (loc, out);
|
|
|
d1681e |
+ VALIDATE_OR_GOTO (this->private, out);
|
|
|
d1681e |
|
|
|
d1681e |
SET_FS_ID (frame->root->uid, frame->root->gid);
|
|
|
d1681e |
MAKE_ENTRY_HANDLE (real_path, par_path, this, loc, &stbuf);
|
|
|
d1681e |
@@ -3880,6 +3886,8 @@ posix_release (xlator_t *this, fd_t *fd)
|
|
|
d1681e |
"pfd->dir is %p (not NULL) for file fd=%p",
|
|
|
d1681e |
pfd->dir, fd);
|
|
|
d1681e |
}
|
|
|
d1681e |
+ if (!priv)
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
|
|
|
d1681e |
pthread_mutex_lock (&priv->janitor_lock);
|
|
|
d1681e |
{
|
|
|
d1681e |
@@ -4067,6 +4075,7 @@ posix_setxattr (call_frame_t *frame, xlator_t *this,
|
|
|
d1681e |
|
|
|
d1681e |
VALIDATE_OR_GOTO (frame, out);
|
|
|
d1681e |
VALIDATE_OR_GOTO (this, out);
|
|
|
d1681e |
+ VALIDATE_OR_GOTO (this->private, out);
|
|
|
d1681e |
VALIDATE_OR_GOTO (loc, out);
|
|
|
d1681e |
VALIDATE_OR_GOTO (dict, out);
|
|
|
d1681e |
|
|
|
d1681e |
@@ -4650,6 +4659,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,
|
|
|
d1681e |
VALIDATE_OR_GOTO (frame, out);
|
|
|
d1681e |
VALIDATE_OR_GOTO (this, out);
|
|
|
d1681e |
VALIDATE_OR_GOTO (loc, out);
|
|
|
d1681e |
+ VALIDATE_OR_GOTO (this->private, out);
|
|
|
d1681e |
|
|
|
d1681e |
SET_FS_ID (frame->root->uid, frame->root->gid);
|
|
|
d1681e |
MAKE_INODE_HANDLE (real_path, this, loc, NULL);
|
|
|
d1681e |
@@ -4757,11 +4767,12 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,
|
|
|
d1681e |
goto done;
|
|
|
d1681e |
}
|
|
|
d1681e |
if (loc->inode && name && (XATTR_IS_PATHINFO (name))) {
|
|
|
d1681e |
- if (LOC_HAS_ABSPATH (loc))
|
|
|
d1681e |
+ VALIDATE_OR_GOTO (this->private, out);
|
|
|
d1681e |
+ if (LOC_HAS_ABSPATH (loc)) {
|
|
|
d1681e |
MAKE_REAL_PATH (rpath, this, loc->path);
|
|
|
d1681e |
- else
|
|
|
d1681e |
+ } else {
|
|
|
d1681e |
rpath = real_path;
|
|
|
d1681e |
-
|
|
|
d1681e |
+ }
|
|
|
d1681e |
(void) snprintf (host_buf, sizeof(host_buf),
|
|
|
d1681e |
"<POSIX(%s):%s:%s>", priv->base_path,
|
|
|
d1681e |
((priv->node_uuid_pathinfo
|
|
|
d1681e |
@@ -7018,9 +7029,6 @@ notify (xlator_t *this,
|
|
|
d1681e |
void *data,
|
|
|
d1681e |
...)
|
|
|
d1681e |
{
|
|
|
d1681e |
- struct posix_private *priv = NULL;
|
|
|
d1681e |
-
|
|
|
d1681e |
- priv = this->private;
|
|
|
d1681e |
switch (event)
|
|
|
d1681e |
{
|
|
|
d1681e |
case GF_EVENT_PARENT_UP:
|
|
|
d1681e |
@@ -7029,31 +7037,6 @@ notify (xlator_t *this,
|
|
|
d1681e |
default_notify (this, GF_EVENT_CHILD_UP, data);
|
|
|
d1681e |
}
|
|
|
d1681e |
break;
|
|
|
d1681e |
- case GF_EVENT_CLEANUP:
|
|
|
d1681e |
- if (priv->health_check) {
|
|
|
d1681e |
- priv->health_check_active = _gf_false;
|
|
|
d1681e |
- pthread_cancel (priv->health_check);
|
|
|
d1681e |
- priv->health_check = 0;
|
|
|
d1681e |
- }
|
|
|
d1681e |
- if (priv->disk_space_check) {
|
|
|
d1681e |
- priv->disk_space_check_active = _gf_false;
|
|
|
d1681e |
- pthread_cancel (priv->disk_space_check);
|
|
|
d1681e |
- priv->disk_space_check = 0;
|
|
|
d1681e |
- }
|
|
|
d1681e |
- if (priv->janitor) {
|
|
|
d1681e |
- (void) gf_thread_cleanup_xint (priv->janitor);
|
|
|
d1681e |
- priv->janitor = 0;
|
|
|
d1681e |
- }
|
|
|
d1681e |
- if (priv->fsyncer) {
|
|
|
d1681e |
- (void) gf_thread_cleanup_xint (priv->fsyncer);
|
|
|
d1681e |
- priv->fsyncer = 0;
|
|
|
d1681e |
- }
|
|
|
d1681e |
- if (priv->mount_lock) {
|
|
|
d1681e |
- (void) sys_closedir (priv->mount_lock);
|
|
|
d1681e |
- priv->mount_lock = NULL;
|
|
|
d1681e |
- }
|
|
|
d1681e |
-
|
|
|
d1681e |
- break;
|
|
|
d1681e |
default:
|
|
|
d1681e |
/* */
|
|
|
d1681e |
break;
|
|
|
d1681e |
@@ -7917,10 +7900,36 @@ fini (xlator_t *this)
|
|
|
d1681e |
if (!priv)
|
|
|
d1681e |
return;
|
|
|
d1681e |
this->private = NULL;
|
|
|
d1681e |
+ if (priv->health_check) {
|
|
|
d1681e |
+ priv->health_check_active = _gf_false;
|
|
|
d1681e |
+ pthread_cancel (priv->health_check);
|
|
|
d1681e |
+ priv->health_check = 0;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ if (priv->disk_space_check) {
|
|
|
d1681e |
+ priv->disk_space_check_active = _gf_false;
|
|
|
d1681e |
+ pthread_cancel (priv->disk_space_check);
|
|
|
d1681e |
+ priv->disk_space_check = 0;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ if (priv->janitor) {
|
|
|
d1681e |
+ (void) gf_thread_cleanup_xint (priv->janitor);
|
|
|
d1681e |
+ priv->janitor = 0;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ if (priv->fsyncer) {
|
|
|
d1681e |
+ (void) gf_thread_cleanup_xint (priv->fsyncer);
|
|
|
d1681e |
+ priv->fsyncer = 0;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
/*unlock brick dir*/
|
|
|
d1681e |
if (priv->mount_lock)
|
|
|
d1681e |
(void) sys_closedir (priv->mount_lock);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ GF_FREE (priv->base_path);
|
|
|
d1681e |
+ LOCK_DESTROY (&priv->lock);
|
|
|
d1681e |
+ pthread_mutex_destroy (&priv->janitor_lock);
|
|
|
d1681e |
+ pthread_mutex_destroy (&priv->fsync_mutex);
|
|
|
d1681e |
+ GF_FREE (priv->hostname);
|
|
|
d1681e |
+ GF_FREE (priv->trash_path);
|
|
|
d1681e |
GF_FREE (priv);
|
|
|
d1681e |
+
|
|
|
d1681e |
return;
|
|
|
d1681e |
}
|
|
|
d1681e |
struct xlator_dumpops dumpops = {
|
|
|
d1681e |
diff --git a/xlators/system/posix-acl/src/posix-acl.c b/xlators/system/posix-acl/src/posix-acl.c
|
|
|
d1681e |
index 5dac688..aadd6fc 100644
|
|
|
d1681e |
--- a/xlators/system/posix-acl/src/posix-acl.c
|
|
|
d1681e |
+++ b/xlators/system/posix-acl/src/posix-acl.c
|
|
|
d1681e |
@@ -582,13 +582,15 @@ posix_acl_unref (xlator_t *this, struct posix_acl *acl)
|
|
|
d1681e |
int refcnt = 0;
|
|
|
d1681e |
|
|
|
d1681e |
conf = this->private;
|
|
|
d1681e |
+ if (!conf)
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
|
|
|
d1681e |
LOCK(&conf->acl_lock);
|
|
|
d1681e |
{
|
|
|
d1681e |
refcnt = --acl->refcnt;
|
|
|
d1681e |
}
|
|
|
d1681e |
UNLOCK(&conf->acl_lock);
|
|
|
d1681e |
-
|
|
|
d1681e |
+out:
|
|
|
d1681e |
if (!refcnt)
|
|
|
d1681e |
posix_acl_destroy (this, acl);
|
|
|
d1681e |
}
|
|
|
d1681e |
--
|
|
|
d1681e |
1.8.3.1
|
|
|
d1681e |
|