From 1c65e9e28ab87fa7958f287921ddfa2a704be82e Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Tue, 14 Mar 2017 16:12:55 +1100 Subject: [PATCH] ctdb-readonly: Avoid a tight loop waiting for revoke to complete BUG: https://bugzilla.samba.org/show_bug.cgi?id=12697 During revoking readonly delegations, if one of the nodes disappears, then there is no point re-trying revoking readonly delegation. The database needs to be recovered before the revoke operation can succeed. So retry only after a grace period. Signed-off-by: Amitay Isaacs Reviewed-by: Martin Schwenke Autobuild-User(master): Martin Schwenke Autobuild-Date(master): Fri Mar 17 14:05:57 CET 2017 on sn-devel-144 (cherry picked from commit ad758cb869ac83534993caa212abc9fe9905ec68) --- ctdb/server/ctdb_call.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ctdb/server/ctdb_call.c b/ctdb/server/ctdb_call.c index a05ec1a..8ce3928 100644 --- a/ctdb/server/ctdb_call.c +++ b/ctdb/server/ctdb_call.c @@ -1600,7 +1600,6 @@ static int deferred_call_destructor(struct revokechild_deferred_call *deferred_c { struct ctdb_context *ctdb = deferred_call->ctdb; struct revokechild_requeue_handle *requeue_handle = talloc(ctdb, struct revokechild_requeue_handle); - struct ctdb_req_call_old *c = (struct ctdb_req_call_old *)deferred_call->hdr; requeue_handle->ctdb = ctdb; requeue_handle->hdr = deferred_call->hdr; @@ -1608,9 +1607,12 @@ static int deferred_call_destructor(struct revokechild_deferred_call *deferred_c requeue_handle->ctx = deferred_call->ctx; talloc_steal(requeue_handle, requeue_handle->hdr); - /* when revoking, any READONLY requests have 1 second grace to let read/write finish first */ + /* Always delay revoke requests. Either wait for the read/write + * operation to complete, or if revoking failed wait for recovery to + * complete + */ tevent_add_timer(ctdb->ev, requeue_handle, - timeval_current_ofs(c->flags & CTDB_WANT_READONLY ? 1 : 0, 0), + timeval_current_ofs(1, 0), deferred_call_requeue, requeue_handle); return 0; -- 2.9.3