summaryrefslogtreecommitdiffstats
path: root/xlators/features/changelog/src/changelog.c
diff options
context:
space:
mode:
authorKotresh HR <khiremat@redhat.com>2016-05-09 16:54:00 +0530
committerJeff Darcy <jdarcy@redhat.com>2016-06-16 09:03:15 -0700
commit650459c4178eff6fba82351d044c995ab7d046b1 (patch)
treef8c1f3516fdb1c923ef8e8af29513f7287d7a860 /xlators/features/changelog/src/changelog.c
parentdca4de364cd948ec7dade4416425ea1353911066 (diff)
features/changelog: Change barrier notification mechanism
Backport of http://review.gluster.org/14272 The barrier notification mechanism was fd based and 'select' was being used. 'select' breaks when number of fds opened by brick process exceeds 1024. To avoid this and also the maintainance of pipe between notify and 'changelog_rollover', the pipe has been replaced with pthread condition signal and timed wait mechanism. Change-Id: I530ea90d9a06953f8b23b4e12d122872ee1925de BUG: 1341952 Signed-off-by: Kotresh HR <khiremat@redhat.com> Reviewed-on: http://review.gluster.org/14615 Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com> Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Diffstat (limited to 'xlators/features/changelog/src/changelog.c')
-rw-r--r--xlators/features/changelog/src/changelog.c53
1 files changed, 26 insertions, 27 deletions
diff --git a/xlators/features/changelog/src/changelog.c b/xlators/features/changelog/src/changelog.c
index 8898d51..6c38293 100644
--- a/xlators/features/changelog/src/changelog.c
+++ b/xlators/features/changelog/src/changelog.c
@@ -2028,11 +2028,6 @@ changelog_cleanup_helper_threads (xlator_t *this, changelog_priv_t *priv)
if (priv->cr.rollover_th) {
(void) changelog_thread_cleanup (this, priv->cr.rollover_th);
priv->cr.rollover_th = 0;
- ret = close (priv->cr_wfd);
- if (ret)
- gf_log (this->name, GF_LOG_ERROR,
- "error closing write end of rollover pipe"
- " (reason: %s)", strerror (errno));
}
if (priv->cf.fsync_th) {
@@ -2047,7 +2042,6 @@ changelog_spawn_helper_threads (xlator_t *this, changelog_priv_t *priv)
{
int ret = 0;
int flags = 0;
- int pipe_fd[2] = {0, 0};
/* Geo-Rep snapshot dependency:
*
@@ -2061,27 +2055,7 @@ changelog_spawn_helper_threads (xlator_t *this, changelog_priv_t *priv)
* the write end of the pipe in 'reconfigure'.
*/
- ret = pipe (pipe_fd);
- if (ret == -1) {
- gf_log (this->name, GF_LOG_ERROR,
- "Cannot create pipe (reason: %s)", strerror (errno));
- goto out;
- }
-
- /* writer is non-blocking */
- flags = fcntl (pipe_fd[1], F_GETFL);
- flags |= O_NONBLOCK;
-
- ret = fcntl (pipe_fd[1], F_SETFL, flags);
- if (ret) {
- gf_log (this->name, GF_LOG_ERROR,
- "failed to set O_NONBLOCK flag");
- goto out;
- }
-
- priv->cr_wfd = pipe_fd[1];
- priv->cr.rfd = pipe_fd[0];
-
+ priv->cr.notify = _gf_false;
priv->cr.this = this;
ret = gf_thread_create (&priv->cr.rollover_th,
NULL, changelog_rollover, priv);
@@ -2384,6 +2358,8 @@ changelog_barrier_pthread_init (xlator_t *this, changelog_priv_t *priv)
gf_boolean_t dm_cond_black_init = _gf_false;
gf_boolean_t dm_mutex_white_init = _gf_false;
gf_boolean_t dm_cond_white_init = _gf_false;
+ gf_boolean_t cr_mutex_init = _gf_false;
+ gf_boolean_t cr_cond_init = _gf_false;
int ret = 0;
if ((ret = pthread_mutex_init(&priv->bn.bnotify_mutex, NULL)) != 0) {
@@ -2435,6 +2411,22 @@ changelog_barrier_pthread_init (xlator_t *this, changelog_priv_t *priv)
goto out;
}
dm_cond_white_init = _gf_true;
+
+ if ((pthread_mutex_init(&priv->cr.lock, NULL)) != 0) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "changelog_rollover lock init failed (%d)", ret);
+ ret = -1;
+ goto out;
+ }
+ cr_mutex_init = _gf_true;
+
+ if ((pthread_cond_init(&priv->cr.cond, NULL)) != 0) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "changelog_rollover cond init failed (%d)", ret);
+ ret = -1;
+ goto out;
+ }
+ cr_cond_init = _gf_true;
out:
if (ret) {
if (bn_mutex_init)
@@ -2449,6 +2441,10 @@ changelog_barrier_pthread_init (xlator_t *this, changelog_priv_t *priv)
pthread_mutex_destroy(&priv->dm.drain_white_mutex);
if (dm_cond_white_init)
pthread_cond_destroy (&priv->dm.drain_white_cond);
+ if (cr_mutex_init)
+ pthread_mutex_destroy(&priv->cr.lock);
+ if (cr_cond_init)
+ pthread_cond_destroy (&priv->cr.cond);
}
return ret;
}
@@ -2463,6 +2459,8 @@ changelog_barrier_pthread_destroy (changelog_priv_t *priv)
pthread_cond_destroy (&priv->dm.drain_black_cond);
pthread_mutex_destroy (&priv->dm.drain_white_mutex);
pthread_cond_destroy (&priv->dm.drain_white_cond);
+ pthread_mutex_destroy(&priv->cr.lock);
+ pthread_cond_destroy (&priv->cr.cond);
LOCK_DESTROY (&priv->bflags.lock);
}
@@ -2786,6 +2784,7 @@ init (xlator_t *this)
priv->current_color = FOP_COLOR_BLACK;
priv->explicit_rollover = _gf_false;
+ priv->cr.notify = _gf_false;
/* Mutex is not needed as threads are not spawned yet */
priv->bn.bnotify = _gf_false;
priv->bn.bnotify_error = _gf_false;