From 38e89649107b5c2258b38a6c2dd3faade74d6591 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Wed, 20 Jul 2011 15:17:29 +1000 Subject: ReadOnly: Add handlign of readonly requests readwrite requests, delegations and revoking of delegation to the processing loop for CALL requests coming in from a local client via domain socket (This used to be ctdb commit e7cbf5b5d03cc26a73a92066a651f8eab73624b8) --- ctdb/server/ctdb_daemon.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'ctdb/server/ctdb_daemon.c') diff --git a/ctdb/server/ctdb_daemon.c b/ctdb/server/ctdb_daemon.c index 75344ad386..2a5db64bf4 100644 --- a/ctdb/server/ctdb_daemon.c +++ b/ctdb/server/ctdb_daemon.c @@ -312,6 +312,7 @@ static void daemon_call_from_client_callback(struct ctdb_call_state *state) } r->hdr.reqid = dstate->reqid; r->datalen = dstate->call->reply_data.dsize; + r->status = dstate->call->status; memcpy(&r->data[0], dstate->call->reply_data.dptr, r->datalen); res = daemon_queue_send(client, &r->hdr); @@ -423,6 +424,52 @@ static void daemon_request_call_from_client(struct ctdb_client *client, return; } + /* Dont do READONLY if we dont have a tracking database */ + if ((c->flags & CTDB_WANT_READONLY) && ctdb_db->rottdb == NULL) { + c->flags &= ~CTDB_WANT_READONLY; + } + + if (header.flags & CTDB_REC_RO_REVOKE_COMPLETE) { + header.flags &= ~(CTDB_REC_RO_HAVE_DELEGATIONS|CTDB_REC_RO_HAVE_READONLY|CTDB_REC_RO_REVOKING_READONLY|CTDB_REC_RO_REVOKE_COMPLETE); + if (ctdb_ltdb_store(ctdb_db, key, &header, data) != 0) { + ctdb_fatal(ctdb, "Failed to write header with cleared REVOKE flag"); + } + } + + /* if we are revoking, we must defer all other calls until the revoke + * had completed. + */ + if (header.flags & CTDB_REC_RO_REVOKING_READONLY) { + talloc_free(data.dptr); + ret = ctdb_ltdb_unlock(ctdb_db, key); + + if (ctdb_add_revoke_deferred_call(ctdb, ctdb_db, key, (struct ctdb_req_header *)c, daemon_incoming_packet, client) != 0) { + ctdb_fatal(ctdb, "Failed to add deferred call for revoke child"); + } + return; + } + + if ((header.dmaster == ctdb->pnn) + && (!(c->flags & CTDB_WANT_READONLY)) + && (header.flags & (CTDB_REC_RO_HAVE_DELEGATIONS|CTDB_REC_RO_HAVE_READONLY)) ) { + header.flags |= CTDB_REC_RO_REVOKING_READONLY; + if (ctdb_ltdb_store(ctdb_db, key, &header, data) != 0) { + ctdb_fatal(ctdb, "Failed to store record with HAVE_DELEGATIONS set"); + } + ret = ctdb_ltdb_unlock(ctdb_db, key); + + if (ctdb_start_revoke_ro_record(ctdb, ctdb_db, key, &header, data) != 0) { + ctdb_fatal(ctdb, "Failed to start record revoke"); + } + talloc_free(data.dptr); + + if (ctdb_add_revoke_deferred_call(ctdb, ctdb_db, key, (struct ctdb_req_header *)c, daemon_incoming_packet, client) != 0) { + ctdb_fatal(ctdb, "Failed to add deferred call for revoke child"); + } + + return; + } + dstate = talloc(client, struct daemon_call_state); if (dstate == NULL) { ret = ctdb_ltdb_unlock(ctdb_db, key); -- cgit From de7c3de0a2622fcb0d7f4b6ea1aef245d1b761a3 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Wed, 17 Aug 2011 16:14:57 +1000 Subject: ReadOnly: clear out the tracking record once a revoke is completed (This used to be ctdb commit 7af255551f058d1f6bfdd38ca603e7a19d1bb7ba) --- ctdb/server/ctdb_daemon.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'ctdb/server/ctdb_daemon.c') diff --git a/ctdb/server/ctdb_daemon.c b/ctdb/server/ctdb_daemon.c index 2a5db64bf4..742170a690 100644 --- a/ctdb/server/ctdb_daemon.c +++ b/ctdb/server/ctdb_daemon.c @@ -434,6 +434,10 @@ static void daemon_request_call_from_client(struct ctdb_client *client, if (ctdb_ltdb_store(ctdb_db, key, &header, data) != 0) { ctdb_fatal(ctdb, "Failed to write header with cleared REVOKE flag"); } + /* and clear out the tracking data */ + if (tdb_delete(ctdb_db->rottdb, key) != 0) { + DEBUG(DEBUG_ERR,(__location__ " Failed to clear out trackingdb record\n")); + } } /* if we are revoking, we must defer all other calls until the revoke -- cgit From 9729d3e339d33ef85025aab2c09c180430998f35 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Tue, 23 Aug 2011 10:41:52 +1000 Subject: ReadOnly: Check the readonly flag instead of whether the tdb pointer is NULL or not (This used to be ctdb commit 01314c2cb3a480917d6a632b83c39f0a48bba0e7) --- ctdb/server/ctdb_daemon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ctdb/server/ctdb_daemon.c') diff --git a/ctdb/server/ctdb_daemon.c b/ctdb/server/ctdb_daemon.c index 742170a690..88d12103f7 100644 --- a/ctdb/server/ctdb_daemon.c +++ b/ctdb/server/ctdb_daemon.c @@ -425,7 +425,7 @@ static void daemon_request_call_from_client(struct ctdb_client *client, } /* Dont do READONLY if we dont have a tracking database */ - if ((c->flags & CTDB_WANT_READONLY) && ctdb_db->rottdb == NULL) { + if ((c->flags & CTDB_WANT_READONLY) && !ctdb_db->readonly) { c->flags &= ~CTDB_WANT_READONLY; } -- cgit