diff options
| author | Pranith Kumar K <pkarampu@redhat.com> | 2020-04-07 16:05:16 +0530 | 
|---|---|---|
| committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2020-04-09 04:15:17 +0000 | 
| commit | 9115dd39e953953495d48c6d6f24f44828f8bd5f (patch) | |
| tree | b0c6b8747fc0ad5d752c1b7d099d43060354792c | |
| parent | 4398f68dada29418d2ec68ec538ec1378108221a (diff) | |
mount/fuse: Wait for 'mount' child to exit before dying
Problem:
tests/bugs/protocol/bug-1433815-auth-allow.t fails
sometimes because of stale mount. This stale mount
comes into picture when parent process dies without
waiting for the child process which mounts fuse fs
to die
Fix:
Wait for mounting child process to die before dying.
Fixes: #1152
Change-Id: I8baee8720e88614fdb762ea822d5877973eef8dc
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
| -rw-r--r-- | tests/bugs/protocol/bug-1433815-auth-allow.t | 1 | ||||
| -rw-r--r-- | xlators/mount/fuse/src/fuse-bridge.c | 27 | 
2 files changed, 27 insertions, 1 deletions
diff --git a/tests/bugs/protocol/bug-1433815-auth-allow.t b/tests/bugs/protocol/bug-1433815-auth-allow.t index 7020a7d9485..a78c0eb7111 100644 --- a/tests/bugs/protocol/bug-1433815-auth-allow.t +++ b/tests/bugs/protocol/bug-1433815-auth-allow.t @@ -30,7 +30,6 @@ TEST $GFS -f fubar.vol $M0  # If we had DONT_EXPECT_WITHIN we could use that, but we don't.  sleep 10  EXPECT 0 check_mounted $M0 -ps aux | grep gluster  # Set auth.allow to include us.  This mount should therefore succeed.  TEST $CLI volume set $V0 auth.allow "$(get_addresses)" diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index 3df1135a2ed..7949241ab0f 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -6374,6 +6374,7 @@ notify(xlator_t *this, int32_t event, void *data, ...)      fuse_private_t *private = NULL;      gf_boolean_t start_thread = _gf_false;      glusterfs_graph_t *graph = NULL; +    struct pollfd pfd = {0};     private      = this->private; @@ -6441,6 +6442,32 @@ notify(xlator_t *this, int32_t event, void *data, ...)              /* Authentication failure is an error and glusterfs should stop */              gf_log(this->name, GF_LOG_ERROR,                     "Server authenication failed. Shutting down."); +            pthread_mutex_lock(&private->sync_mutex); +            { +                /*Wait for mount to finish*/ +                if (!private->mount_finished) { +                    pfd.fd = private->status_pipe[0]; +                    pfd.events = POLLIN | POLLHUP | POLLERR; +                    if (poll(&pfd, 1, -1) < 0) { +                        gf_log(this->name, GF_LOG_ERROR, "poll error %s", +                               strerror(errno)); +                        goto auth_fail_unlock; +                    } +                    if (pfd.revents & POLLIN) { +                        if (fuse_get_mount_status(this) != 0) { +                            goto auth_fail_unlock; +                        } +                       private +                        ->mount_finished = _gf_true; +                    } else if (pfd.revents) { +                        gf_log(this->name, GF_LOG_ERROR, +                               "mount pipe closed without status"); +                        goto auth_fail_unlock; +                    } +                } +            } +        auth_fail_unlock: +            pthread_mutex_unlock(&private->sync_mutex);              fini(this);              break;          }  | 
