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