autobuild v3.12.2-37
Resolves: bz#1662059 bz#1662828 bz#1664529 Signed-off-by: Milind Changire <mchangir@redhat.com>
This commit is contained in:
parent
6611e93be3
commit
dfef94e4a2
@ -0,0 +1,92 @@
|
|||||||
|
From 11f9ffcd733c95e8a728c150ff2ffc3dbeaddac1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mohit Agrawal <moagrawa@redhat.com>
|
||||||
|
Date: Fri, 11 Jan 2019 11:57:20 +0530
|
||||||
|
Subject: [PATCH 502/506] posix: posix_health_check_thread_proc crash due to
|
||||||
|
priv is NULL
|
||||||
|
|
||||||
|
Problem: posix_fini sends a cancellation request to health_check
|
||||||
|
thread and cleanup priv without ensuring health_check thread
|
||||||
|
is running
|
||||||
|
|
||||||
|
Solution: Make health_check && disk_space thread joinable and call
|
||||||
|
gf_thread_cleanup_xint to wait unless thread is not finished
|
||||||
|
|
||||||
|
> Change-Id: I4d37b08138766881dab0922a47ed68a2c3411f13
|
||||||
|
> fixes: bz#1636570
|
||||||
|
> (Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/21717/)
|
||||||
|
> (Cherry pick from commit e82bcc33ed2d5cd54d3f918397f31818089299ad)
|
||||||
|
|
||||||
|
Change-Id: I9edadd5bc445549b5f45bab98e4794d62a185f1c
|
||||||
|
BUG: 1662828
|
||||||
|
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
|
||||||
|
Reviewed-on: https://code.engineering.redhat.com/gerrit/160404
|
||||||
|
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||||
|
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||||
|
---
|
||||||
|
xlators/storage/posix/src/posix-helpers.c | 8 +++-----
|
||||||
|
xlators/storage/posix/src/posix.c | 15 +++++++++++----
|
||||||
|
2 files changed, 14 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
|
||||||
|
index cddf02e63..ed5d3e55e 100644
|
||||||
|
--- a/xlators/storage/posix/src/posix-helpers.c
|
||||||
|
+++ b/xlators/storage/posix/src/posix-helpers.c
|
||||||
|
@@ -1854,8 +1854,6 @@ posix_spawn_health_check_thread (xlator_t *xl)
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* run the thread detached, resources will be freed on exit */
|
||||||
|
- pthread_detach (priv->health_check);
|
||||||
|
priv->health_check_active = _gf_true;
|
||||||
|
}
|
||||||
|
unlock:
|
||||||
|
@@ -1958,9 +1956,9 @@ posix_spawn_disk_space_check_thread (xlator_t *xl)
|
||||||
|
priv->disk_space_check_active = _gf_false;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = gf_thread_create_detached (&priv->disk_space_check,
|
||||||
|
- posix_disk_space_check_thread_proc,
|
||||||
|
- xl, "posix_reserve");
|
||||||
|
+ ret = gf_thread_create (&priv->disk_space_check, NULL,
|
||||||
|
+ posix_disk_space_check_thread_proc,
|
||||||
|
+ xl, "posix_reserve");
|
||||||
|
if (ret < 0) {
|
||||||
|
priv->disk_space_check_active = _gf_false;
|
||||||
|
gf_msg (xl->name, GF_LOG_ERROR, errno,
|
||||||
|
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
|
||||||
|
index 13b4aa6b6..591119ea9 100644
|
||||||
|
--- a/xlators/storage/posix/src/posix.c
|
||||||
|
+++ b/xlators/storage/posix/src/posix.c
|
||||||
|
@@ -7999,18 +7999,25 @@ void
|
||||||
|
fini (xlator_t *this)
|
||||||
|
{
|
||||||
|
struct posix_private *priv = this->private;
|
||||||
|
+ gf_boolean_t health_check = _gf_false;
|
||||||
|
+
|
||||||
|
if (!priv)
|
||||||
|
return;
|
||||||
|
LOCK (&priv->lock);
|
||||||
|
- if (priv->health_check_active) {
|
||||||
|
+ {
|
||||||
|
+ health_check = priv->health_check_active;
|
||||||
|
priv->health_check_active = _gf_false;
|
||||||
|
- pthread_cancel (priv->health_check);
|
||||||
|
- priv->health_check = 0;
|
||||||
|
}
|
||||||
|
UNLOCK (&priv->lock);
|
||||||
|
+
|
||||||
|
+ if (health_check) {
|
||||||
|
+ (void)gf_thread_cleanup_xint(priv->health_check);
|
||||||
|
+ priv->health_check = 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (priv->disk_space_check) {
|
||||||
|
priv->disk_space_check_active = _gf_false;
|
||||||
|
- pthread_cancel (priv->disk_space_check);
|
||||||
|
+ (void)gf_thread_cleanup_xint(priv->disk_space_check);
|
||||||
|
priv->disk_space_check = 0;
|
||||||
|
}
|
||||||
|
if (priv->janitor) {
|
||||||
|
--
|
||||||
|
2.20.1
|
||||||
|
|
202
0503-core-brick-process-is-crashed-at-the-time-of-spawn-t.patch
Normal file
202
0503-core-brick-process-is-crashed-at-the-time-of-spawn-t.patch
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
From 5989899b7aa5cc86e589c5ff20560476b959d98b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mohit Agrawal <moagrawa@redhat.com>
|
||||||
|
Date: Fri, 11 Jan 2019 12:42:20 +0530
|
||||||
|
Subject: [PATCH 503/506] core: brick process is crashed at the time of spawn
|
||||||
|
thread
|
||||||
|
|
||||||
|
Problem: brick is getting crashed at the time of calling
|
||||||
|
pthread_detach after just call gf_thread_create.If
|
||||||
|
sufficient resources are not available on the system
|
||||||
|
pthread_create returns EAGAIN (non-negative) but the
|
||||||
|
caller function expects negative error code in case of failure
|
||||||
|
|
||||||
|
Solution: Change the condition in caller function to avoid the crash
|
||||||
|
|
||||||
|
> Change-Id: Ifeaa49f809957eb6c33aa9792f5af1b55566756d
|
||||||
|
> fixes: bz#1662906
|
||||||
|
> (Cherry pick from commit 1e28c54c5ec8d84ec8a22493161314010992918e)
|
||||||
|
> (Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/21976/)
|
||||||
|
|
||||||
|
Change-Id: I9e5c3de4b98236de22f834d66268ab21001817a1
|
||||||
|
BUG: 1662828
|
||||||
|
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
|
||||||
|
Reviewed-on: https://code.engineering.redhat.com/gerrit/160409
|
||||||
|
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||||
|
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||||
|
---
|
||||||
|
xlators/storage/posix/src/posix-helpers.c | 15 ++++++-----
|
||||||
|
xlators/storage/posix/src/posix.c | 31 +++++++++++++++++------
|
||||||
|
xlators/storage/posix/src/posix.h | 6 ++---
|
||||||
|
3 files changed, 35 insertions(+), 17 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
|
||||||
|
index ed5d3e55e..1137f1c41 100644
|
||||||
|
--- a/xlators/storage/posix/src/posix-helpers.c
|
||||||
|
+++ b/xlators/storage/posix/src/posix-helpers.c
|
||||||
|
@@ -1322,7 +1322,7 @@ posix_janitor_thread_proc (void *data)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-void
|
||||||
|
+int
|
||||||
|
posix_spawn_janitor_thread (xlator_t *this)
|
||||||
|
{
|
||||||
|
struct posix_private *priv = NULL;
|
||||||
|
@@ -1337,7 +1337,7 @@ posix_spawn_janitor_thread (xlator_t *this)
|
||||||
|
posix_janitor_thread_proc,
|
||||||
|
this, "posixjan");
|
||||||
|
|
||||||
|
- if (ret < 0) {
|
||||||
|
+ if (ret) {
|
||||||
|
gf_msg (this->name, GF_LOG_ERROR, errno,
|
||||||
|
P_MSG_THREAD_FAILED, "spawning janitor "
|
||||||
|
"thread failed");
|
||||||
|
@@ -1349,6 +1349,7 @@ posix_spawn_janitor_thread (xlator_t *this)
|
||||||
|
}
|
||||||
|
unlock:
|
||||||
|
UNLOCK (&priv->lock);
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
@@ -1822,7 +1823,7 @@ abort:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void
|
||||||
|
+int
|
||||||
|
posix_spawn_health_check_thread (xlator_t *xl)
|
||||||
|
{
|
||||||
|
struct posix_private *priv = NULL;
|
||||||
|
@@ -1845,7 +1846,7 @@ posix_spawn_health_check_thread (xlator_t *xl)
|
||||||
|
ret = gf_thread_create (&priv->health_check, NULL,
|
||||||
|
posix_health_check_thread_proc,
|
||||||
|
xl, "posixhc");
|
||||||
|
- if (ret < 0) {
|
||||||
|
+ if (ret) {
|
||||||
|
priv->health_check_interval = 0;
|
||||||
|
priv->health_check_active = _gf_false;
|
||||||
|
gf_msg (xl->name, GF_LOG_ERROR, errno,
|
||||||
|
@@ -1858,6 +1859,7 @@ posix_spawn_health_check_thread (xlator_t *xl)
|
||||||
|
}
|
||||||
|
unlock:
|
||||||
|
UNLOCK (&priv->lock);
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
@@ -1940,7 +1942,7 @@ out:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-void
|
||||||
|
+int
|
||||||
|
posix_spawn_disk_space_check_thread (xlator_t *xl)
|
||||||
|
{
|
||||||
|
struct posix_private *priv = NULL;
|
||||||
|
@@ -1959,7 +1961,7 @@ posix_spawn_disk_space_check_thread (xlator_t *xl)
|
||||||
|
ret = gf_thread_create (&priv->disk_space_check, NULL,
|
||||||
|
posix_disk_space_check_thread_proc,
|
||||||
|
xl, "posix_reserve");
|
||||||
|
- if (ret < 0) {
|
||||||
|
+ if (ret) {
|
||||||
|
priv->disk_space_check_active = _gf_false;
|
||||||
|
gf_msg (xl->name, GF_LOG_ERROR, errno,
|
||||||
|
P_MSG_DISK_SPACE_CHECK_FAILED,
|
||||||
|
@@ -1971,6 +1973,7 @@ posix_spawn_disk_space_check_thread (xlator_t *xl)
|
||||||
|
}
|
||||||
|
unlock:
|
||||||
|
UNLOCK (&priv->lock);
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
|
||||||
|
index 591119ea9..8a6282d29 100644
|
||||||
|
--- a/xlators/storage/posix/src/posix.c
|
||||||
|
+++ b/xlators/storage/posix/src/posix.c
|
||||||
|
@@ -7317,12 +7317,19 @@ reconfigure (xlator_t *this, dict_t *options)
|
||||||
|
|
||||||
|
GF_OPTION_RECONF ("reserve", priv->disk_reserve,
|
||||||
|
options, uint32, out);
|
||||||
|
- if (priv->disk_reserve)
|
||||||
|
- posix_spawn_disk_space_check_thread (this);
|
||||||
|
+ if (priv->disk_reserve) {
|
||||||
|
+ ret = posix_spawn_disk_space_check_thread (this);
|
||||||
|
+ if (ret)
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
GF_OPTION_RECONF ("health-check-interval", priv->health_check_interval,
|
||||||
|
options, uint32, out);
|
||||||
|
- posix_spawn_health_check_thread (this);
|
||||||
|
+ if (priv->health_check_interval) {
|
||||||
|
+ ret = posix_spawn_health_check_thread (this);
|
||||||
|
+ if (ret)
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
GF_OPTION_RECONF ("shared-brick-count", priv->shared_brick_count,
|
||||||
|
options, int32, out);
|
||||||
|
@@ -7925,20 +7932,28 @@ init (xlator_t *this)
|
||||||
|
_private->disk_space_full = 0;
|
||||||
|
GF_OPTION_INIT ("reserve",
|
||||||
|
_private->disk_reserve, uint32, out);
|
||||||
|
- if (_private->disk_reserve)
|
||||||
|
- posix_spawn_disk_space_check_thread (this);
|
||||||
|
+ if (_private->disk_reserve) {
|
||||||
|
+ ret = posix_spawn_disk_space_check_thread (this);
|
||||||
|
+ if (ret)
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
_private->health_check_active = _gf_false;
|
||||||
|
GF_OPTION_INIT ("health-check-interval",
|
||||||
|
_private->health_check_interval, uint32, out);
|
||||||
|
- if (_private->health_check_interval)
|
||||||
|
- posix_spawn_health_check_thread (this);
|
||||||
|
+ if (_private->health_check_interval) {
|
||||||
|
+ ret = posix_spawn_health_check_thread (this);
|
||||||
|
+ if (ret)
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
pthread_mutex_init (&_private->janitor_lock, NULL);
|
||||||
|
pthread_cond_init (&_private->janitor_cond, NULL);
|
||||||
|
INIT_LIST_HEAD (&_private->janitor_fds);
|
||||||
|
|
||||||
|
- posix_spawn_janitor_thread (this);
|
||||||
|
+ ret = posix_spawn_janitor_thread (this);
|
||||||
|
+ if (ret)
|
||||||
|
+ goto out;
|
||||||
|
|
||||||
|
pthread_mutex_init (&_private->fsync_mutex, NULL);
|
||||||
|
pthread_cond_init (&_private->fsync_cond, NULL);
|
||||||
|
diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h
|
||||||
|
index bda41726c..cb8dc8acc 100644
|
||||||
|
--- a/xlators/storage/posix/src/posix.h
|
||||||
|
+++ b/xlators/storage/posix/src/posix.h
|
||||||
|
@@ -305,7 +305,7 @@ int posix_handle_pair (xlator_t *this, const char *real_path, char *key,
|
||||||
|
data_t *value, int flags, struct iatt *stbuf);
|
||||||
|
int posix_fhandle_pair (xlator_t *this, int fd, char *key, data_t *value,
|
||||||
|
int flags, struct iatt *stbuf);
|
||||||
|
-void posix_spawn_janitor_thread (xlator_t *this);
|
||||||
|
+int posix_spawn_janitor_thread (xlator_t *this);
|
||||||
|
int posix_acl_xattr_set (xlator_t *this, const char *path, dict_t *xattr_req);
|
||||||
|
int posix_gfid_heal (xlator_t *this, const char *path, loc_t *loc, dict_t *xattr_req);
|
||||||
|
int posix_entry_create_xattr_set (xlator_t *this, const char *path,
|
||||||
|
@@ -320,9 +320,9 @@ gf_boolean_t posix_special_xattr (char **pattern, char *key);
|
||||||
|
void
|
||||||
|
__posix_fd_set_odirect (fd_t *fd, struct posix_fd *pfd, int opflags,
|
||||||
|
off_t offset, size_t size);
|
||||||
|
-void posix_spawn_health_check_thread (xlator_t *this);
|
||||||
|
+int posix_spawn_health_check_thread (xlator_t *this);
|
||||||
|
|
||||||
|
-void posix_spawn_disk_space_check_thread (xlator_t *this);
|
||||||
|
+int posix_spawn_disk_space_check_thread (xlator_t *this);
|
||||||
|
|
||||||
|
void *posix_fsyncer (void *);
|
||||||
|
int
|
||||||
|
--
|
||||||
|
2.20.1
|
||||||
|
|
@ -0,0 +1,39 @@
|
|||||||
|
From b6feae228a82f34b88b67b8a8f8fa55189dcdb72 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Susant Palai <spalai@redhat.com>
|
||||||
|
Date: Fri, 11 Jan 2019 13:00:59 +0530
|
||||||
|
Subject: [PATCH 504/506] dht: Add NULL check for stbuf in dht_rmdir_lookup_cbk
|
||||||
|
|
||||||
|
> Change-Id: I2ced288113a369cc6497a77ac1871007df434da4
|
||||||
|
> fixes: bz#1664647
|
||||||
|
> Signed-off-by: Susant Palai <spalai@redhat.com>
|
||||||
|
|
||||||
|
upstream patch: https://review.gluster.org/#/c/glusterfs/+/22004/
|
||||||
|
|
||||||
|
Change-Id: Ib53b06f6bbf20e0fbf1663cddf7fd76b37f23186
|
||||||
|
BUG: 1664529
|
||||||
|
Signed-off-by: Susant Palai <spalai@redhat.com>
|
||||||
|
Reviewed-on: https://code.engineering.redhat.com/gerrit/160438
|
||||||
|
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||||
|
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
||||||
|
---
|
||||||
|
xlators/cluster/dht/src/dht-common.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c
|
||||||
|
index ff0099c1d..767c6a868 100644
|
||||||
|
--- a/xlators/cluster/dht/src/dht-common.c
|
||||||
|
+++ b/xlators/cluster/dht/src/dht-common.c
|
||||||
|
@@ -9842,8 +9842,8 @@ dht_rmdir_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
|
||||||
|
|
||||||
|
gf_msg (this->name, GF_LOG_WARNING, op_errno,
|
||||||
|
DHT_MSG_FILE_LOOKUP_FAILED,
|
||||||
|
- "lookup failed for %s on %s (type=0%o)",
|
||||||
|
- local->loc.path, src->name, stbuf->ia_type);
|
||||||
|
+ "lookup failed for %s on %s", local->loc.path,
|
||||||
|
+ src->name);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.20.1
|
||||||
|
|
378
0505-features-shard-Fix-launch-of-multiple-synctasks-for-.patch
Normal file
378
0505-features-shard-Fix-launch-of-multiple-synctasks-for-.patch
Normal file
@ -0,0 +1,378 @@
|
|||||||
|
From a7ade5267ebaf4bf318ee2aebe48000cee583e3b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Krutika Dhananjay <kdhananj@redhat.com>
|
||||||
|
Date: Fri, 28 Dec 2018 18:53:15 +0530
|
||||||
|
Subject: [PATCH 505/506] features/shard: Fix launch of multiple synctasks for
|
||||||
|
background deletion
|
||||||
|
|
||||||
|
> Upstream: https://review.gluster.org/21957
|
||||||
|
> BUG: 1662368
|
||||||
|
> Change-Id: Ib33773d27fb4be463c7a8a5a6a4b63689705324e
|
||||||
|
|
||||||
|
PROBLEM:
|
||||||
|
|
||||||
|
When multiple sharded files are deleted in quick succession, multiple
|
||||||
|
issues were observed:
|
||||||
|
1. misleading logs corresponding to a sharded file where while one log
|
||||||
|
message said the shards corresponding to the file were deleted
|
||||||
|
successfully, this was followed by multiple logs suggesting the very
|
||||||
|
same operation failed. This was because of multiple synctasks
|
||||||
|
attempting to clean up shards of the same file and only one of them
|
||||||
|
succeeding (the one that gets ENTRYLK successfully), and the rest of
|
||||||
|
them logging failure.
|
||||||
|
|
||||||
|
2. multiple synctasks to do background deletion would be launched, one
|
||||||
|
for each deleted file but all of them could readdir entries from
|
||||||
|
.remove_me at the same time could potentially contend for ENTRYLK on
|
||||||
|
.shard for each of the entry names. This is undesirable and wasteful.
|
||||||
|
|
||||||
|
FIX:
|
||||||
|
Background deletion will now follow a state machine. In the event that
|
||||||
|
there are multiple attempts to launch synctask for background deletion,
|
||||||
|
one for each file deleted, only the first task is launched. And if while
|
||||||
|
this task is doing the cleanup, more attempts are made to delete other
|
||||||
|
files, the state of the synctask is adjusted so that it restarts the
|
||||||
|
crawl even after reaching end-of-directory to pick up any files it may
|
||||||
|
have missed in the previous iteration.
|
||||||
|
|
||||||
|
This patch also fixes uninitialized lk-owner during syncop_entrylk()
|
||||||
|
which was leading to multiple background deletion synctasks entering
|
||||||
|
the critical section at the same time and leading to illegal memory access
|
||||||
|
of base inode in the second syntcask after it was destroyed post shard deletion
|
||||||
|
by the first synctask.
|
||||||
|
|
||||||
|
Change-Id: Ib33773d27fb4be463c7a8a5a6a4b63689705324e
|
||||||
|
BUG: 1662059
|
||||||
|
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
|
||||||
|
Reviewed-on: https://code.engineering.redhat.com/gerrit/160437
|
||||||
|
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||||
|
Reviewed-by: Xavi Hernandez <xhernandez@redhat.com>
|
||||||
|
---
|
||||||
|
xlators/features/shard/src/shard.c | 199 +++++++++++++++++++----------
|
||||||
|
xlators/features/shard/src/shard.h | 12 +-
|
||||||
|
2 files changed, 136 insertions(+), 75 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c
|
||||||
|
index 5b72399f5..8aed1a386 100644
|
||||||
|
--- a/xlators/features/shard/src/shard.c
|
||||||
|
+++ b/xlators/features/shard/src/shard.c
|
||||||
|
@@ -1465,16 +1465,45 @@ int
|
||||||
|
shard_start_background_deletion (xlator_t *this)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
+ gf_boolean_t i_cleanup = _gf_true;
|
||||||
|
+ shard_priv_t *priv = NULL;
|
||||||
|
call_frame_t *cleanup_frame = NULL;
|
||||||
|
|
||||||
|
+ priv = this->private;
|
||||||
|
+
|
||||||
|
+ LOCK(&priv->lock);
|
||||||
|
+ {
|
||||||
|
+ switch (priv->bg_del_state) {
|
||||||
|
+ case SHARD_BG_DELETION_NONE:
|
||||||
|
+ i_cleanup = _gf_true;
|
||||||
|
+ priv->bg_del_state = SHARD_BG_DELETION_LAUNCHING;
|
||||||
|
+ break;
|
||||||
|
+ case SHARD_BG_DELETION_LAUNCHING:
|
||||||
|
+ i_cleanup = _gf_false;
|
||||||
|
+ break;
|
||||||
|
+ case SHARD_BG_DELETION_IN_PROGRESS:
|
||||||
|
+ priv->bg_del_state = SHARD_BG_DELETION_LAUNCHING;
|
||||||
|
+ i_cleanup = _gf_false;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ UNLOCK(&priv->lock);
|
||||||
|
+ if (!i_cleanup)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
cleanup_frame = create_frame (this, this->ctx->pool);
|
||||||
|
if (!cleanup_frame) {
|
||||||
|
gf_msg (this->name, GF_LOG_WARNING, ENOMEM,
|
||||||
|
SHARD_MSG_MEMALLOC_FAILED, "Failed to create "
|
||||||
|
"new frame to delete shards");
|
||||||
|
- return -ENOMEM;
|
||||||
|
+ ret = -ENOMEM;
|
||||||
|
+ goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ set_lk_owner_from_ptr(&cleanup_frame->root->lk_owner, cleanup_frame->root);
|
||||||
|
+
|
||||||
|
ret = synctask_new (this->ctx->env, shard_delete_shards,
|
||||||
|
shard_delete_shards_cbk, cleanup_frame,
|
||||||
|
cleanup_frame);
|
||||||
|
@@ -1484,7 +1513,16 @@ shard_start_background_deletion (xlator_t *this)
|
||||||
|
"failed to create task to do background "
|
||||||
|
"cleanup of shards");
|
||||||
|
STACK_DESTROY (cleanup_frame->root);
|
||||||
|
+ goto err;
|
||||||
|
}
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+err:
|
||||||
|
+ LOCK(&priv->lock);
|
||||||
|
+ {
|
||||||
|
+ priv->bg_del_state = SHARD_BG_DELETION_NONE;
|
||||||
|
+ }
|
||||||
|
+ UNLOCK(&priv->lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1493,7 +1531,7 @@ shard_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
|
||||||
|
int32_t op_ret, int32_t op_errno, inode_t *inode,
|
||||||
|
struct iatt *buf, dict_t *xdata, struct iatt *postparent)
|
||||||
|
{
|
||||||
|
- int ret = 0;
|
||||||
|
+ int ret = -1;
|
||||||
|
shard_priv_t *priv = NULL;
|
||||||
|
gf_boolean_t i_start_cleanup = _gf_false;
|
||||||
|
|
||||||
|
@@ -1526,22 +1564,23 @@ shard_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
|
||||||
|
|
||||||
|
LOCK (&priv->lock);
|
||||||
|
{
|
||||||
|
- if (priv->first_lookup == SHARD_FIRST_LOOKUP_PENDING) {
|
||||||
|
- priv->first_lookup = SHARD_FIRST_LOOKUP_IN_PROGRESS;
|
||||||
|
+ if (priv->first_lookup_done == _gf_false) {
|
||||||
|
+ priv->first_lookup_done = _gf_true;
|
||||||
|
i_start_cleanup = _gf_true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UNLOCK (&priv->lock);
|
||||||
|
|
||||||
|
- if (i_start_cleanup) {
|
||||||
|
- ret = shard_start_background_deletion (this);
|
||||||
|
- if (ret) {
|
||||||
|
- LOCK (&priv->lock);
|
||||||
|
- {
|
||||||
|
- priv->first_lookup = SHARD_FIRST_LOOKUP_PENDING;
|
||||||
|
- }
|
||||||
|
- UNLOCK (&priv->lock);
|
||||||
|
+ if (!i_start_cleanup)
|
||||||
|
+ goto unwind;
|
||||||
|
+
|
||||||
|
+ ret = shard_start_background_deletion(this);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ LOCK(&priv->lock);
|
||||||
|
+ {
|
||||||
|
+ priv->first_lookup_done = _gf_false;
|
||||||
|
}
|
||||||
|
+ UNLOCK(&priv->lock);
|
||||||
|
}
|
||||||
|
unwind:
|
||||||
|
SHARD_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode, buf,
|
||||||
|
@@ -2940,9 +2979,10 @@ shard_unlink_block_inode (shard_local_t *local, int shard_block_num)
|
||||||
|
if (ctx->fsync_needed) {
|
||||||
|
unref_base_inode++;
|
||||||
|
list_del_init (&ctx->to_fsync_list);
|
||||||
|
- if (base_inode)
|
||||||
|
+ if (base_inode) {
|
||||||
|
__shard_inode_ctx_get (base_inode, this, &base_ictx);
|
||||||
|
- base_ictx->fsync_count--;
|
||||||
|
+ base_ictx->fsync_count--;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
UNLOCK(&inode->lock);
|
||||||
|
@@ -3334,10 +3374,15 @@ shard_delete_shards_of_entry (call_frame_t *cleanup_frame, xlator_t *this,
|
||||||
|
loc.inode = inode_ref (priv->dot_shard_rm_inode);
|
||||||
|
|
||||||
|
ret = syncop_entrylk (FIRST_CHILD(this), this->name, &loc,
|
||||||
|
- entry->d_name, ENTRYLK_LOCK, ENTRYLK_WRLCK, NULL,
|
||||||
|
- NULL);
|
||||||
|
- if (ret)
|
||||||
|
+ entry->d_name, ENTRYLK_LOCK_NB, ENTRYLK_WRLCK,
|
||||||
|
+ NULL, NULL);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ if (ret == -EAGAIN) {
|
||||||
|
+ ret = 0;
|
||||||
|
+ }
|
||||||
|
goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
{
|
||||||
|
ret = __shard_delete_shards_of_entry (cleanup_frame, this,
|
||||||
|
entry, inode);
|
||||||
|
@@ -3352,20 +3397,6 @@ out:
|
||||||
|
int
|
||||||
|
shard_delete_shards_cbk (int ret, call_frame_t *frame, void *data)
|
||||||
|
{
|
||||||
|
- xlator_t *this = NULL;
|
||||||
|
- shard_priv_t *priv = NULL;
|
||||||
|
-
|
||||||
|
- this = frame->this;
|
||||||
|
- priv = this->private;
|
||||||
|
-
|
||||||
|
- if (ret < 0) {
|
||||||
|
- gf_msg (this->name, GF_LOG_WARNING, -ret,
|
||||||
|
- SHARD_MSG_SHARDS_DELETION_FAILED,
|
||||||
|
- "Background deletion of shards failed");
|
||||||
|
- priv->first_lookup = SHARD_FIRST_LOOKUP_PENDING;
|
||||||
|
- } else {
|
||||||
|
- priv->first_lookup = SHARD_FIRST_LOOKUP_DONE;
|
||||||
|
- }
|
||||||
|
SHARD_STACK_DESTROY (frame);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -3482,6 +3513,7 @@ shard_delete_shards (void *opaque)
|
||||||
|
gf_dirent_t entries;
|
||||||
|
gf_dirent_t *entry = NULL;
|
||||||
|
call_frame_t *cleanup_frame = NULL;
|
||||||
|
+ gf_boolean_t done = _gf_false;
|
||||||
|
|
||||||
|
this = THIS;
|
||||||
|
priv = this->private;
|
||||||
|
@@ -3534,52 +3566,81 @@ shard_delete_shards (void *opaque)
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
- while ((ret = syncop_readdirp (FIRST_CHILD(this), local->fd, 131072,
|
||||||
|
- offset, &entries, local->xattr_req,
|
||||||
|
- NULL))) {
|
||||||
|
- if (ret > 0)
|
||||||
|
- ret = 0;
|
||||||
|
- list_for_each_entry (entry, &entries.list, list) {
|
||||||
|
- offset = entry->d_off;
|
||||||
|
-
|
||||||
|
- if (!strcmp (entry->d_name, ".") ||
|
||||||
|
- !strcmp (entry->d_name, ".."))
|
||||||
|
- continue;
|
||||||
|
+ for (;;) {
|
||||||
|
+ offset = 0;
|
||||||
|
+ LOCK(&priv->lock);
|
||||||
|
+ {
|
||||||
|
+ if (priv->bg_del_state == SHARD_BG_DELETION_LAUNCHING) {
|
||||||
|
+ priv->bg_del_state = SHARD_BG_DELETION_IN_PROGRESS;
|
||||||
|
+ } else if (priv->bg_del_state == SHARD_BG_DELETION_IN_PROGRESS) {
|
||||||
|
+ priv->bg_del_state = SHARD_BG_DELETION_NONE;
|
||||||
|
+ done = _gf_true;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ UNLOCK(&priv->lock);
|
||||||
|
+ if (done)
|
||||||
|
+ break;
|
||||||
|
+ while ((ret = syncop_readdirp (FIRST_CHILD(this), local->fd,
|
||||||
|
+ 131072, offset, &entries,
|
||||||
|
+ local->xattr_req, NULL))) {
|
||||||
|
+ if (ret > 0)
|
||||||
|
+ ret = 0;
|
||||||
|
+ list_for_each_entry (entry, &entries.list, list) {
|
||||||
|
+ offset = entry->d_off;
|
||||||
|
+
|
||||||
|
+ if (!strcmp (entry->d_name, ".") ||
|
||||||
|
+ !strcmp (entry->d_name, ".."))
|
||||||
|
+ continue;
|
||||||
|
|
||||||
|
- if (!entry->inode) {
|
||||||
|
- ret = shard_lookup_marker_entry (this, local,
|
||||||
|
- entry);
|
||||||
|
- if (ret < 0)
|
||||||
|
+ if (!entry->inode) {
|
||||||
|
+ ret = shard_lookup_marker_entry (this,
|
||||||
|
+ local,
|
||||||
|
+ entry);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ link_inode = inode_link (entry->inode,
|
||||||
|
+ local->fd->inode,
|
||||||
|
+ entry->d_name,
|
||||||
|
+ &entry->d_stat);
|
||||||
|
+
|
||||||
|
+ gf_msg_debug (this->name, 0, "Initiating "
|
||||||
|
+ "deletion of shards of gfid %s",
|
||||||
|
+ entry->d_name);
|
||||||
|
+ ret = shard_delete_shards_of_entry (cleanup_frame,
|
||||||
|
+ this,
|
||||||
|
+ entry,
|
||||||
|
+ link_inode);
|
||||||
|
+ inode_unlink (link_inode, local->fd->inode,
|
||||||
|
+ entry->d_name);
|
||||||
|
+ inode_unref (link_inode);
|
||||||
|
+ if (ret) {
|
||||||
|
+ gf_msg (this->name, GF_LOG_ERROR, -ret,
|
||||||
|
+ SHARD_MSG_SHARDS_DELETION_FAILED,
|
||||||
|
+ "Failed to clean up shards of "
|
||||||
|
+ "gfid %s", entry->d_name);
|
||||||
|
continue;
|
||||||
|
- }
|
||||||
|
- link_inode = inode_link (entry->inode, local->fd->inode,
|
||||||
|
- entry->d_name, &entry->d_stat);
|
||||||
|
-
|
||||||
|
- gf_msg_debug (this->name, 0, "Initiating deletion of "
|
||||||
|
- "shards of gfid %s", entry->d_name);
|
||||||
|
- ret = shard_delete_shards_of_entry (cleanup_frame, this,
|
||||||
|
- entry, link_inode);
|
||||||
|
- inode_unlink (link_inode, local->fd->inode,
|
||||||
|
- entry->d_name);
|
||||||
|
- inode_unref (link_inode);
|
||||||
|
- if (ret) {
|
||||||
|
- gf_msg (this->name, GF_LOG_ERROR, -ret,
|
||||||
|
- SHARD_MSG_SHARDS_DELETION_FAILED,
|
||||||
|
- "Failed to clean up shards of gfid %s",
|
||||||
|
+ }
|
||||||
|
+ gf_msg (this->name, GF_LOG_INFO, 0,
|
||||||
|
+ SHARD_MSG_SHARDS_DELETION_COMPLETED,
|
||||||
|
+ "Deleted shards of gfid=%s from backend",
|
||||||
|
entry->d_name);
|
||||||
|
- continue;
|
||||||
|
}
|
||||||
|
- gf_msg (this->name, GF_LOG_INFO, 0,
|
||||||
|
- SHARD_MSG_SHARDS_DELETION_COMPLETED, "Deleted "
|
||||||
|
- "shards of gfid=%s from backend",
|
||||||
|
- entry->d_name);
|
||||||
|
+ gf_dirent_free (&entries);
|
||||||
|
+ if (ret)
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
- gf_dirent_free (&entries);
|
||||||
|
- if (ret)
|
||||||
|
- break;
|
||||||
|
}
|
||||||
|
ret = 0;
|
||||||
|
+ loc_wipe(&loc);
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
err:
|
||||||
|
+ LOCK(&priv->lock);
|
||||||
|
+ {
|
||||||
|
+ priv->bg_del_state = SHARD_BG_DELETION_NONE;
|
||||||
|
+ }
|
||||||
|
+ UNLOCK(&priv->lock);
|
||||||
|
loc_wipe (&loc);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
diff --git a/xlators/features/shard/src/shard.h b/xlators/features/shard/src/shard.h
|
||||||
|
index ac3813c8c..37934f3a2 100644
|
||||||
|
--- a/xlators/features/shard/src/shard.h
|
||||||
|
+++ b/xlators/features/shard/src/shard.h
|
||||||
|
@@ -196,11 +196,10 @@ shard_unlock_entrylk (call_frame_t *frame, xlator_t *this);
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
- SHARD_FIRST_LOOKUP_PENDING = 0,
|
||||||
|
- SHARD_FIRST_LOOKUP_IN_PROGRESS,
|
||||||
|
- SHARD_FIRST_LOOKUP_DONE,
|
||||||
|
-} shard_first_lookup_state_t;
|
||||||
|
-
|
||||||
|
+ SHARD_BG_DELETION_NONE = 0,
|
||||||
|
+ SHARD_BG_DELETION_LAUNCHING,
|
||||||
|
+ SHARD_BG_DELETION_IN_PROGRESS,
|
||||||
|
+} shard_bg_deletion_state_t;
|
||||||
|
/* rm = "remove me" */
|
||||||
|
|
||||||
|
typedef struct shard_priv {
|
||||||
|
@@ -213,7 +212,8 @@ typedef struct shard_priv {
|
||||||
|
int inode_count;
|
||||||
|
struct list_head ilist_head;
|
||||||
|
uint32_t deletion_rate;
|
||||||
|
- shard_first_lookup_state_t first_lookup;
|
||||||
|
+ shard_bg_deletion_state_t bg_del_state;
|
||||||
|
+ gf_boolean_t first_lookup_done;
|
||||||
|
uint64_t lru_limit;
|
||||||
|
} shard_priv_t;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.20.1
|
||||||
|
|
@ -0,0 +1,49 @@
|
|||||||
|
From 6f7a336da731a5113d8fdf9632f37ef181f04f9c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Krutika Dhananjay <kdhananj@redhat.com>
|
||||||
|
Date: Fri, 28 Dec 2018 07:27:11 +0530
|
||||||
|
Subject: [PATCH 506/506] features/shard: Assign fop id during background
|
||||||
|
deletion to prevent excessive logging
|
||||||
|
|
||||||
|
> Upstream: https://review.gluster.org/21946
|
||||||
|
> BUG: 1662368
|
||||||
|
> Change-Id: I0ca8d3b3bfbcd354b4a555eee520eb0479bcda35
|
||||||
|
|
||||||
|
... of the kind
|
||||||
|
|
||||||
|
"[2018-12-26 05:22:44.195019] E [MSGID: 133010]
|
||||||
|
[shard.c:2253:shard_common_lookup_shards_cbk] 0-volume1-shard: Lookup
|
||||||
|
on shard 785 failed. Base file gfid = cd938e64-bf06-476f-a5d4-d580a0d37416
|
||||||
|
[No such file or directory]"
|
||||||
|
|
||||||
|
shard_common_lookup_shards_cbk() has a specific check to ignore ENOENT error without
|
||||||
|
logging them during specific fops. But because background deletion is done in a new
|
||||||
|
frame (with local->fop being GF_FOP_NULL), the ENOENT check is skipped and the
|
||||||
|
absence of shards gets logged everytime.
|
||||||
|
|
||||||
|
To fix this, local->fop is initialized to GF_FOP_UNLINK during background deletion.
|
||||||
|
|
||||||
|
Change-Id: I0ca8d3b3bfbcd354b4a555eee520eb0479bcda35
|
||||||
|
BUG: 1662059
|
||||||
|
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
|
||||||
|
Reviewed-on: https://code.engineering.redhat.com/gerrit/160436
|
||||||
|
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
||||||
|
Reviewed-by: Xavi Hernandez <xhernandez@redhat.com>
|
||||||
|
---
|
||||||
|
xlators/features/shard/src/shard.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c
|
||||||
|
index 8aed1a386..19dd3e4ba 100644
|
||||||
|
--- a/xlators/features/shard/src/shard.c
|
||||||
|
+++ b/xlators/features/shard/src/shard.c
|
||||||
|
@@ -3530,6 +3530,7 @@ shard_delete_shards (void *opaque)
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
cleanup_frame->local = local;
|
||||||
|
+ local->fop = GF_FOP_UNLINK;
|
||||||
|
|
||||||
|
local->xattr_req = dict_new ();
|
||||||
|
if (!local->xattr_req) {
|
||||||
|
--
|
||||||
|
2.20.1
|
||||||
|
|
@ -192,7 +192,7 @@ Release: 0.1%{?prereltag:.%{prereltag}}%{?dist}
|
|||||||
%else
|
%else
|
||||||
Name: glusterfs
|
Name: glusterfs
|
||||||
Version: 3.12.2
|
Version: 3.12.2
|
||||||
Release: 36%{?dist}
|
Release: 37%{?dist}
|
||||||
%endif
|
%endif
|
||||||
License: GPLv2 or LGPLv3+
|
License: GPLv2 or LGPLv3+
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
@ -766,6 +766,11 @@ Patch0498: 0498-mem-pool-Code-refactor-in-mem_pool.c.patch
|
|||||||
Patch0499: 0499-cluster-dht-Fix-incorrect-backport.patch
|
Patch0499: 0499-cluster-dht-Fix-incorrect-backport.patch
|
||||||
Patch0500: 0500-extras-Add-readdir-ahead-to-samba-group-command.patch
|
Patch0500: 0500-extras-Add-readdir-ahead-to-samba-group-command.patch
|
||||||
Patch0501: 0501-glusterd-aggregate-rsp-from-peers-for-profile-comman.patch
|
Patch0501: 0501-glusterd-aggregate-rsp-from-peers-for-profile-comman.patch
|
||||||
|
Patch0502: 0502-posix-posix_health_check_thread_proc-crash-due-to-pr.patch
|
||||||
|
Patch0503: 0503-core-brick-process-is-crashed-at-the-time-of-spawn-t.patch
|
||||||
|
Patch0504: 0504-dht-Add-NULL-check-for-stbuf-in-dht_rmdir_lookup_cbk.patch
|
||||||
|
Patch0505: 0505-features-shard-Fix-launch-of-multiple-synctasks-for-.patch
|
||||||
|
Patch0506: 0506-features-shard-Assign-fop-id-during-background-delet.patch
|
||||||
|
|
||||||
%description
|
%description
|
||||||
GlusterFS is a distributed file-system capable of scaling to several
|
GlusterFS is a distributed file-system capable of scaling to several
|
||||||
@ -1216,7 +1221,7 @@ while read p
|
|||||||
do
|
do
|
||||||
# if the destination file exists, its most probably stale
|
# if the destination file exists, its most probably stale
|
||||||
# so we must remove it
|
# so we must remove it
|
||||||
rename_to=( $(grep -i 'rename to' $p | cut -f 3 -d ' ') )
|
rename_to=( $(egrep '^rename to' $p | cut -f 3 -d ' ') )
|
||||||
if [ ${#rename_to[*]} -gt 0 ]; then
|
if [ ${#rename_to[*]} -gt 0 ]; then
|
||||||
for f in ${rename_to[*]}
|
for f in ${rename_to[*]}
|
||||||
do
|
do
|
||||||
@ -2726,6 +2731,9 @@ fi
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Jan 14 2019 Milind Changire <mchangir@redhat.com> - 3.12.2-37
|
||||||
|
- fixes bugs bz#1662059 bz#1662828 bz#1664529
|
||||||
|
|
||||||
* Fri Jan 04 2019 Milind Changire <mchangir@redhat.com> - 3.12.2-36
|
* Fri Jan 04 2019 Milind Changire <mchangir@redhat.com> - 3.12.2-36
|
||||||
- fixes bugs bz#1290124 bz#1655385 bz#1663232
|
- fixes bugs bz#1290124 bz#1655385 bz#1663232
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user