core: block unused signals in created threads
Block all signal except those which are set for explicit handling in glusterfs_signals_setup(). Since thread spawning code in libglusterfs and xlators can get called from application threads when used through libgfapi, it is necessary to do this blocking. Change-Id: Ia320f80521a83d2edcda50b9ad414583a0175281 BUG: 1011662 Signed-off-by: Anand Avati <avati@redhat.com> Reviewed-on: http://review.gluster.org/5995 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Amar Tumballi <amarts@redhat.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
This commit is contained in:
parent
8737b4697a
commit
84fa8af38d
@ -559,7 +559,7 @@ glfs_init_common (struct glfs *fs)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pthread_create (&fs->poller, NULL, glfs_poller, fs);
|
||||
ret = gf_thread_create (&fs->poller, NULL, glfs_poller, fs);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -2807,6 +2807,7 @@ out:
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Sets log file path from user provided arguments */
|
||||
int
|
||||
gf_set_log_file_path (cmd_args_t *cmd_args)
|
||||
@ -2868,3 +2869,29 @@ gf_set_log_file_path (cmd_args_t *cmd_args)
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
gf_thread_create (pthread_t *thread, const pthread_attr_t *attr,
|
||||
void *(*start_routine)(void *), void *arg)
|
||||
{
|
||||
sigset_t set, old;
|
||||
int ret;
|
||||
|
||||
sigemptyset (&set);
|
||||
|
||||
sigfillset (&set);
|
||||
sigdelset (&set, SIGSEGV);
|
||||
sigdelset (&set, SIGBUS);
|
||||
sigdelset (&set, SIGILL);
|
||||
sigdelset (&set, SIGSYS);
|
||||
sigdelset (&set, SIGFPE);
|
||||
sigdelset (&set, SIGABRT);
|
||||
|
||||
pthread_sigmask (SIG_BLOCK, &set, &old);
|
||||
|
||||
ret = pthread_create (thread, attr, start_routine, arg);
|
||||
|
||||
pthread_sigmask (SIG_SETMASK, &old, NULL);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -588,4 +588,7 @@ gf_boolean_t gf_is_local_addr (char *hostname);
|
||||
gf_boolean_t gf_is_same_address (char *host1, char *host2);
|
||||
void md5_wrapper(const unsigned char *data, size_t len, char *md5);
|
||||
|
||||
int gf_thread_create (pthread_t *thread, const pthread_attr_t *attr,
|
||||
void *(*start_routine)(void *), void *arg);
|
||||
|
||||
#endif /* _COMMON_UTILS_H */
|
||||
|
@ -453,8 +453,8 @@ syncenv_scale (struct syncenv *env)
|
||||
}
|
||||
|
||||
env->proc[i].env = env;
|
||||
ret = pthread_create (&env->proc[i].processor, NULL,
|
||||
syncenv_processor, &env->proc[i]);
|
||||
ret = gf_thread_create (&env->proc[i].processor, NULL,
|
||||
syncenv_processor, &env->proc[i]);
|
||||
if (ret)
|
||||
break;
|
||||
env->procs++;
|
||||
@ -507,8 +507,8 @@ syncenv_new (size_t stacksize, int procmin, int procmax)
|
||||
|
||||
for (i = 0; i < newenv->procmin; i++) {
|
||||
newenv->proc[i].env = newenv;
|
||||
ret = pthread_create (&newenv->proc[i].processor, NULL,
|
||||
syncenv_processor, &newenv->proc[i]);
|
||||
ret = gf_thread_create (&newenv->proc[i].processor, NULL,
|
||||
syncenv_processor, &newenv->proc[i]);
|
||||
if (ret)
|
||||
break;
|
||||
newenv->procs++;
|
||||
|
@ -213,7 +213,7 @@ gf_timer_registry_init (glusterfs_ctx_t *ctx)
|
||||
reg->stale.prev = ®->stale;
|
||||
|
||||
ctx->timer = reg;
|
||||
pthread_create (®->th, NULL, gf_timer_proc, ctx);
|
||||
gf_thread_create (®->th, NULL, gf_timer_proc, ctx);
|
||||
}
|
||||
out:
|
||||
return ctx->timer;
|
||||
|
@ -619,10 +619,9 @@ gf_rdma_get_device (rpc_transport_t *this, struct ibv_context *ibctx,
|
||||
}
|
||||
|
||||
/* completion threads */
|
||||
ret = pthread_create (&trav->send_thread,
|
||||
NULL,
|
||||
gf_rdma_send_completion_proc,
|
||||
trav->send_chan);
|
||||
ret = gf_thread_create (&trav->send_thread, NULL,
|
||||
gf_rdma_send_completion_proc,
|
||||
trav->send_chan);
|
||||
if (ret) {
|
||||
gf_log (this->name, GF_LOG_ERROR,
|
||||
"could not create send completion thread for "
|
||||
@ -630,10 +629,9 @@ gf_rdma_get_device (rpc_transport_t *this, struct ibv_context *ibctx,
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = pthread_create (&trav->recv_thread,
|
||||
NULL,
|
||||
gf_rdma_recv_completion_proc,
|
||||
trav->recv_chan);
|
||||
ret = gf_thread_create (&trav->recv_thread, NULL,
|
||||
gf_rdma_recv_completion_proc,
|
||||
trav->recv_chan);
|
||||
if (ret) {
|
||||
gf_log (this->name, GF_LOG_ERROR,
|
||||
"could not create recv completion thread "
|
||||
@ -641,10 +639,9 @@ gf_rdma_get_device (rpc_transport_t *this, struct ibv_context *ibctx,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = pthread_create (&trav->async_event_thread,
|
||||
NULL,
|
||||
gf_rdma_async_event_thread,
|
||||
ibctx);
|
||||
ret = gf_thread_create (&trav->async_event_thread, NULL,
|
||||
gf_rdma_async_event_thread,
|
||||
ibctx);
|
||||
if (ret) {
|
||||
gf_log (this->name, GF_LOG_ERROR,
|
||||
"could not create async_event_thread");
|
||||
@ -4198,9 +4195,9 @@ __gf_rdma_ctx_create (void)
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = pthread_create (&rdma_ctx->rdma_cm_thread, NULL,
|
||||
gf_rdma_cm_event_handler,
|
||||
rdma_ctx->rdma_cm_event_channel);
|
||||
ret = gf_thread_create (&rdma_ctx->rdma_cm_thread, NULL,
|
||||
gf_rdma_cm_event_handler,
|
||||
rdma_ctx->rdma_cm_event_channel);
|
||||
if (ret != 0) {
|
||||
gf_log (GF_RDMA_LOG_NAME, GF_LOG_WARNING,
|
||||
"creation of thread to handle rdma-cm events "
|
||||
|
@ -2423,7 +2423,7 @@ socket_spawn (rpc_transport_t *this)
|
||||
gf_log (this->name, GF_LOG_TRACE,
|
||||
"spawning %p with gen %u", this, priv->ot_gen);
|
||||
|
||||
if (pthread_create(&priv->thread,NULL,socket_poller,this) != 0) {
|
||||
if (gf_thread_create(&priv->thread,NULL,socket_poller,this) != 0) {
|
||||
gf_log (this->name, GF_LOG_ERROR,
|
||||
"could not create poll thread");
|
||||
}
|
||||
|
@ -5172,8 +5172,8 @@ unlock:
|
||||
* not need to handle CHILD_DOWN event here.
|
||||
*/
|
||||
if (conf->defrag) {
|
||||
ret = pthread_create (&conf->defrag->th, NULL,
|
||||
gf_defrag_start, this);
|
||||
ret = gf_thread_create (&conf->defrag->th, NULL,
|
||||
gf_defrag_start, this);
|
||||
if (ret) {
|
||||
conf->defrag = NULL;
|
||||
GF_FREE (conf->defrag);
|
||||
|
@ -483,8 +483,8 @@ gf_changelog_register (char *brick_path, char *scratch_dir,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = pthread_create (&gfc->gfc_changelog_processor,
|
||||
NULL, gf_changelog_process, gfc);
|
||||
ret = gf_thread_create (&gfc->gfc_changelog_processor,
|
||||
NULL, gf_changelog_process, gfc);
|
||||
if (ret) {
|
||||
errn = errno;
|
||||
gf_log (this->name, GF_LOG_ERROR,
|
||||
|
@ -1030,15 +1030,15 @@ changelog_spawn_helper_threads (xlator_t *this, changelog_priv_t *priv)
|
||||
int ret = 0;
|
||||
|
||||
priv->cr.this = this;
|
||||
ret = pthread_create (&priv->cr.rollover_th,
|
||||
NULL, changelog_rollover, priv);
|
||||
ret = gf_thread_create (&priv->cr.rollover_th,
|
||||
NULL, changelog_rollover, priv);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (priv->fsync_interval) {
|
||||
priv->cf.this = this;
|
||||
ret = pthread_create (&priv->cf.fsync_th,
|
||||
NULL, changelog_fsync_thread, priv);
|
||||
ret = gf_thread_create (&priv->cf.fsync_th,
|
||||
NULL, changelog_fsync_thread, priv);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
@ -1102,8 +1102,8 @@ changelog_spawn_notifier (xlator_t *this, changelog_priv_t *priv)
|
||||
priv->cn.this = this;
|
||||
priv->cn.rfd = pipe_fd[0];
|
||||
|
||||
ret = pthread_create (&priv->cn.notify_th,
|
||||
NULL, changelog_notifier, priv);
|
||||
ret = gf_thread_create (&priv->cn.notify_th,
|
||||
NULL, changelog_notifier, priv);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
@ -1078,7 +1078,7 @@ init (xlator_t *this)
|
||||
INIT_LIST_HEAD (&priv->callstubs);
|
||||
|
||||
this->private = priv;
|
||||
ret = pthread_create (&thread, &w_attr, index_worker, this);
|
||||
ret = gf_thread_create (&thread, &w_attr, index_worker, this);
|
||||
if (ret) {
|
||||
gf_log (this->name, GF_LOG_WARNING, "Failed to create "
|
||||
"worker thread, aborting");
|
||||
|
@ -3798,8 +3798,8 @@ fuse_init (xlator_t *this, fuse_in_header_t *finh, void *msg)
|
||||
}
|
||||
priv->revchan_in = pfd[0];
|
||||
priv->revchan_out = pfd[1];
|
||||
ret = pthread_create (&messenger, NULL, notify_kernel_loop,
|
||||
this);
|
||||
ret = gf_thread_create (&messenger, NULL, notify_kernel_loop,
|
||||
this);
|
||||
if (ret != 0) {
|
||||
gf_log ("glusterfs-fuse", GF_LOG_ERROR,
|
||||
"failed to start messenger daemon (%s)",
|
||||
@ -4973,8 +4973,8 @@ notify (xlator_t *this, int32_t event, void *data, ...)
|
||||
if (!private->fuse_thread_started) {
|
||||
private->fuse_thread_started = 1;
|
||||
|
||||
ret = pthread_create (&private->fuse_thread, NULL,
|
||||
fuse_thread_proc, this);
|
||||
ret = gf_thread_create (&private->fuse_thread, NULL,
|
||||
fuse_thread_proc, this);
|
||||
if (ret != 0) {
|
||||
gf_log (this->name, GF_LOG_DEBUG,
|
||||
"pthread_create() failed (%s)",
|
||||
|
@ -2534,7 +2534,7 @@ __iot_workers_scale (iot_conf_t *conf)
|
||||
while (diff) {
|
||||
diff --;
|
||||
|
||||
ret = pthread_create (&thread, &conf->w_attr, iot_worker, conf);
|
||||
ret = gf_thread_create (&thread, &conf->w_attr, iot_worker, conf);
|
||||
if (ret == 0) {
|
||||
conf->curr_count++;
|
||||
gf_log (conf->this->name, GF_LOG_DEBUG,
|
||||
|
@ -490,8 +490,8 @@ posix_aio_init (xlator_t *this)
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = pthread_create (&priv->aiothread, NULL,
|
||||
posix_aio_thread, this);
|
||||
ret = gf_thread_create (&priv->aiothread, NULL,
|
||||
posix_aio_thread, this);
|
||||
if (ret != 0) {
|
||||
io_destroy (priv->ctxp);
|
||||
goto out;
|
||||
|
@ -884,8 +884,8 @@ posix_spawn_janitor_thread (xlator_t *this)
|
||||
LOCK (&priv->lock);
|
||||
{
|
||||
if (!priv->janitor_present) {
|
||||
ret = pthread_create (&priv->janitor, NULL,
|
||||
posix_janitor_thread_proc, this);
|
||||
ret = gf_thread_create (&priv->janitor, NULL,
|
||||
posix_janitor_thread_proc, this);
|
||||
|
||||
if (ret < 0) {
|
||||
gf_log (this->name, GF_LOG_ERROR,
|
||||
@ -1227,8 +1227,8 @@ posix_spawn_health_check_thread (xlator_t *xl)
|
||||
if (priv->health_check_interval == 0)
|
||||
goto unlock;
|
||||
|
||||
ret = pthread_create (&priv->health_check, NULL,
|
||||
posix_health_check_thread_proc, xl);
|
||||
ret = gf_thread_create (&priv->health_check, NULL,
|
||||
posix_health_check_thread_proc, xl);
|
||||
if (ret < 0) {
|
||||
priv->health_check_interval = 0;
|
||||
priv->health_check_active = _gf_false;
|
||||
|
@ -4855,7 +4855,7 @@ init (xlator_t *this)
|
||||
pthread_cond_init (&_private->fsync_cond, NULL);
|
||||
INIT_LIST_HEAD (&_private->fsyncs);
|
||||
|
||||
ret = pthread_create (&_private->fsyncer, NULL, posix_fsyncer, this);
|
||||
ret = gf_thread_create (&_private->fsyncer, NULL, posix_fsyncer, this);
|
||||
if (ret) {
|
||||
gf_log (this->name, GF_LOG_ERROR, "fsyncer thread"
|
||||
" creation failed (%s)", strerror (errno));
|
||||
|
Loading…
x
Reference in New Issue
Block a user