diff options
Diffstat (limited to 'xlators/protocol/server/src/server.c')
-rw-r--r-- | xlators/protocol/server/src/server.c | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c index d07b840b3fc..24e31500453 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -958,6 +958,8 @@ init (xlator_t *this) if (ret) conf->conf_dir = CONFDIR; + conf->child_up = _gf_false; + /*ret = dict_get_str (this->options, "statedump-path", &statedump_path); if (!ret) { gf_path_strip_trailing_slashes (statedump_path); @@ -1237,6 +1239,35 @@ out: } int +server_process_child_event (xlator_t *this, int32_t event, void *data, + enum gf_cbk_procnum cbk_procnum) +{ + int ret = -1; + server_conf_t *conf = NULL; + rpc_transport_t *xprt = NULL; + + GF_VALIDATE_OR_GOTO(this->name, data, out); + + conf = this->private; + GF_VALIDATE_OR_GOTO(this->name, conf, out); + + pthread_mutex_lock (&conf->mutex); + { + list_for_each_entry (xprt, &conf->xprt_list, list) { + rpcsvc_callback_submit (conf->rpc, xprt, + &server_cbk_prog, + cbk_procnum, + NULL, 0); + } + } + pthread_mutex_unlock (&conf->mutex); + ret = 0; +out: + return ret; +} + + +int notify (xlator_t *this, int32_t event, void *data, ...) { int ret = -1; @@ -1246,6 +1277,10 @@ notify (xlator_t *this, int32_t event, void *data, ...) server_conf_t *conf = NULL; va_list ap; + GF_VALIDATE_OR_GOTO (THIS->name, this, out); + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, conf, out); + dict = data; va_start (ap, data); output = va_arg (ap, dict_t*); @@ -1272,7 +1307,41 @@ notify (xlator_t *this, int32_t event, void *data, ...) conf->parent_up = _gf_true; - /* fall through and notify the event to children */ + default_notify (this, event, data); + break; + } + + case GF_EVENT_CHILD_UP: + { + conf->child_up = _gf_true; + ret = server_process_child_event (this, event, data, + GF_CBK_CHILD_UP); + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, 0, + PS_MSG_SERVER_EVENT_UPCALL_FAILED, + "server_process_child_event failed"); + goto out; + } + + default_notify (this, event, data); + break; + } + + case GF_EVENT_CHILD_DOWN: + { + conf->child_up = _gf_false; + ret = server_process_child_event (this, event, data, + GF_CBK_CHILD_DOWN); + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, 0, + PS_MSG_SERVER_EVENT_UPCALL_FAILED, + "server_process_child_event failed"); + goto out; + } + + default_notify (this, event, data); + break; + } default: |