diff options
| author | Mohit Agrawal <moagrawal@redhat.com> | 2020-01-21 21:09:56 +0530 | 
|---|---|---|
| committer | hari gowtham <hari.gowtham005@gmail.com> | 2020-02-11 08:44:38 +0000 | 
| commit | cf68b3f73de6b531c15ea103d884e89aeee706b4 (patch) | |
| tree | 918a057f8f4aafdc1dd8639080d1100f8b927c96 | |
| parent | 9bde9ac78f31214a8c4b18bccc54abd9a809cdc9 (diff) | |
server: Mount fails after reboot 1/3 gluster nodes
Problem: At the time of coming up one server node(1x3) after reboot
client is unmounted.The client is unmounted because a client
is getting AUTH_FAILED event and client call fini for the graph.The
client is getting AUTH_FAILED because brick is not attached with a
graph at that moment
Solution: To avoid the unmounting the client graph throw ENOENT error
          from server in case if brick is not attached with server at
          the time of authenticate clients.
> Credits: Xavi Hernandez <xhernandez@redhat.com>
> Change-Id: Ie6fbd73cbcf23a35d8db8841b3b6036e87682f5e
> Fixes: bz#1793852
> Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
> (cherry picked from commit > f6421dff22a6ddaf14134f6894deae219948c89d)
Change-Id: Ie6fbd73cbcf23a35d8db8841b3b6036e87682f5e
Fixes: bz#1794020
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
| -rw-r--r-- | tests/bugs/protocol/bug-1433815-auth-allow.t | 1 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client-handshake.c | 3 | ||||
| -rw-r--r-- | xlators/protocol/server/src/server-handshake.c | 41 | 
3 files changed, 29 insertions, 16 deletions
diff --git a/tests/bugs/protocol/bug-1433815-auth-allow.t b/tests/bugs/protocol/bug-1433815-auth-allow.t index fa22ad8afd5..a78c0eb7111 100644 --- a/tests/bugs/protocol/bug-1433815-auth-allow.t +++ b/tests/bugs/protocol/bug-1433815-auth-allow.t @@ -17,6 +17,7 @@ TEST $CLI volume create $V0 $H0:$B0/$V0  # Set auth.allow so it *doesn't* include ourselves.  TEST $CLI volume set $V0 auth.allow 1.2.3.4  TEST $CLI volume start $V0 +EXPECT_WITHIN $CHILD_UP_TIMEOUT "1" online_brick_count  # "System getspec" will include the username and password if the request comes  # from a server (which we are).  Unfortunately, this will cause authentication diff --git a/xlators/protocol/client/src/client-handshake.c b/xlators/protocol/client/src/client-handshake.c index c43756a3fec..0002361e961 100644 --- a/xlators/protocol/client/src/client-handshake.c +++ b/xlators/protocol/client/src/client-handshake.c @@ -1031,8 +1031,7 @@ client_setvolume_cbk(struct rpc_req *req, struct iovec *iov, int count,                 "SETVOLUME on remote-host failed: %s", remote_error);          errno = op_errno; -        if (remote_error && -            (strcmp("Authentication failed", remote_error) == 0)) { +        if (remote_error && (op_errno == EACCES)) {              auth_fail = _gf_true;              op_ret = 0;          } diff --git a/xlators/protocol/server/src/server-handshake.c b/xlators/protocol/server/src/server-handshake.c index 382f2410ee8..1d1177ddf43 100644 --- a/xlators/protocol/server/src/server-handshake.c +++ b/xlators/protocol/server/src/server-handshake.c @@ -250,6 +250,7 @@ server_setvolume(rpcsvc_request_t *req)      char *subdir_mount = NULL;      char *client_name = NULL;      gf_boolean_t cleanup_starting = _gf_false; +    gf_boolean_t xlator_in_graph = _gf_true;      params = dict_new();      reply = dict_new(); @@ -311,8 +312,10 @@ server_setvolume(rpcsvc_request_t *req)      LOCK(&ctx->volfile_lock);      {          xl = get_xlator_by_name(this, name); -        if (!xl) +        if (!xl) { +            xlator_in_graph = _gf_false;              xl = this; +        }      }      UNLOCK(&ctx->volfile_lock);      if (xl == NULL) { @@ -568,20 +571,30 @@ server_setvolume(rpcsvc_request_t *req)                           "failed to set error "                           "msg");      } else { -        gf_event(EVENT_CLIENT_AUTH_REJECT, -                 "client_uid=%s;" -                 "client_identifier=%s;server_identifier=%s;" -                 "brick_path=%s", -                 client->client_uid, req->trans->peerinfo.identifier, -                 req->trans->myinfo.identifier, name); -        gf_msg(this->name, GF_LOG_ERROR, EACCES, PS_MSG_AUTHENTICATE_ERROR, -               "Cannot authenticate client" -               " from %s %s", -               client->client_uid, (clnt_version) ? clnt_version : "old"); -          op_ret = -1; -        op_errno = EACCES; -        ret = dict_set_str(reply, "ERROR", "Authentication failed"); +        if (!xlator_in_graph) { +            gf_msg(this->name, GF_LOG_ERROR, ENOENT, PS_MSG_AUTHENTICATE_ERROR, +                   "Cannot authenticate client" +                   " from %s %s because brick is not attached in graph", +                   client->client_uid, (clnt_version) ? clnt_version : "old"); + +            op_errno = ENOENT; +            ret = dict_set_str(reply, "ERROR", "Brick not found"); +        } else { +            gf_event(EVENT_CLIENT_AUTH_REJECT, +                     "client_uid=%s;" +                     "client_identifier=%s;server_identifier=%s;" +                     "brick_path=%s", +                     client->client_uid, req->trans->peerinfo.identifier, +                     req->trans->myinfo.identifier, name); +            gf_msg(this->name, GF_LOG_ERROR, EACCES, PS_MSG_AUTHENTICATE_ERROR, +                   "Cannot authenticate client" +                   " from %s %s", +                   client->client_uid, (clnt_version) ? clnt_version : "old"); + +            op_errno = EACCES; +            ret = dict_set_str(reply, "ERROR", "Authentication failed"); +        }          if (ret < 0)              gf_msg_debug(this->name, 0,                           "failed to set error "  | 
