diff options
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 96c745a09c3..ecfe86d5d34 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -4906,9 +4906,10 @@ dump_history_fuse (circular_buffer_t *cb, void *data) int fuse_graph_setup (xlator_t *this, glusterfs_graph_t *graph) { - inode_table_t *itable = NULL; - int ret = 0; - fuse_private_t *priv = NULL; + inode_table_t *itable = NULL; + int ret = 0, winds = 0; + fuse_private_t *priv = NULL; + glusterfs_graph_t *prev_graph = NULL; priv = this->private; @@ -4929,13 +4930,30 @@ fuse_graph_setup (xlator_t *this, glusterfs_graph_t *graph) pthread_mutex_lock (&priv->sync_mutex); { - priv->next_graph = graph; - priv->event_recvd = 0; + prev_graph = priv->next_graph; + + if ((prev_graph != NULL) && (prev_graph->id > graph->id)) { + /* there was a race and an old graph was initialised + * before new one. + */ + prev_graph = graph; + } else { + priv->next_graph = graph; + priv->event_recvd = 0; - pthread_cond_signal (&priv->sync_cond); + pthread_cond_signal (&priv->sync_cond); + } + + if (prev_graph != NULL) + winds = ((xlator_t *)prev_graph->top)->winds; } pthread_mutex_unlock (&priv->sync_mutex); + if ((prev_graph != NULL) && (winds == 0)) { + xlator_notify (prev_graph->top, GF_EVENT_PARENT_DOWN, + prev_graph->top, NULL); + } + gf_log ("fuse", GF_LOG_INFO, "switched to graph %d", ((graph) ? graph->id : 0)); |