Skip to content

Commit

Permalink
libceph: fix authorizer invalidation, take 2
Browse files Browse the repository at this point in the history
Back in 2013, commit 4b8e8b5 ("libceph: fix authorizer
invalidation") tried to fix authorizer invalidation issues by clearing
validity field.  However, nothing ever consults this field, so it
doesn't force us to request any new secrets in any way and therefore we
never get out of the exponential backoff mode:

    [  129.973812] libceph: osd2 192.168.122.1:6810 connect authorization failure
    [  130.706785] libceph: osd2 192.168.122.1:6810 connect authorization failure
    [  131.710088] libceph: osd2 192.168.122.1:6810 connect authorization failure
    [  133.708321] libceph: osd2 192.168.122.1:6810 connect authorization failure
    [  137.706598] libceph: osd2 192.168.122.1:6810 connect authorization failure
    ...

AFAICT this was the case at the time 4b8e8b5 was merged, too.

Using timespec solely as a bool isn't nice, so introduce a new have_key
flag, specifically for this purpose.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Reviewed-by: Sage Weil <sage@redhat.com>
  • Loading branch information
Ilya Dryomov committed Jan 21, 2016
1 parent f6330cc commit 6abe097
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 5 deletions.
27 changes: 22 additions & 5 deletions net/ceph/auth_x.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ static int process_one_ticket(struct ceph_auth_client *ac,
th->secret_id = new_secret_id;
th->expires = new_expires;
th->renew_after = new_renew_after;
th->have_key = true;
dout(" got ticket service %d (%s) secret_id %lld len %d\n",
type, ceph_entity_type_name(type), th->secret_id,
(int)th->ticket_blob->vec.iov_len);
Expand Down Expand Up @@ -384,6 +385,24 @@ static int ceph_x_encode_ticket(struct ceph_x_ticket_handler *th,
return -ERANGE;
}

static bool need_key(struct ceph_x_ticket_handler *th)
{
if (!th->have_key)
return true;

return get_seconds() >= th->renew_after;
}

static bool have_key(struct ceph_x_ticket_handler *th)
{
if (th->have_key) {
if (get_seconds() >= th->expires)
th->have_key = false;
}

return th->have_key;
}

static void ceph_x_validate_tickets(struct ceph_auth_client *ac, int *pneed)
{
int want = ac->want_keys;
Expand All @@ -402,20 +421,18 @@ static void ceph_x_validate_tickets(struct ceph_auth_client *ac, int *pneed)
continue;

th = get_ticket_handler(ac, service);

if (IS_ERR(th)) {
*pneed |= service;
continue;
}

if (get_seconds() >= th->renew_after)
if (need_key(th))
*pneed |= service;
if (get_seconds() >= th->expires)
if (!have_key(th))
xi->have_keys &= ~service;
}
}


static int ceph_x_build_request(struct ceph_auth_client *ac,
void *buf, void *end)
{
Expand Down Expand Up @@ -674,7 +691,7 @@ static void ceph_x_invalidate_authorizer(struct ceph_auth_client *ac,

th = get_ticket_handler(ac, peer_type);
if (!IS_ERR(th))
memset(&th->validity, 0, sizeof(th->validity));
th->have_key = false;
}

static int calcu_signature(struct ceph_x_authorizer *au,
Expand Down
1 change: 1 addition & 0 deletions net/ceph/auth_x.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ struct ceph_x_ticket_handler {

struct ceph_crypto_key session_key;
struct ceph_timespec validity;
bool have_key;

u64 secret_id;
struct ceph_buffer *ticket_blob;
Expand Down

0 comments on commit 6abe097

Please sign in to comment.