From: Ronnie Sahlberg Date: Wed, 20 Jul 2011 03:15:48 +0000 (+1000) Subject: ReadOnly: Add "readonly" flag to the ctdb_db_context to indicate if this database... X-Git-Tag: ctdb-1.12~31^2~25 X-Git-Url: http://git.samba.org/?a=commitdiff_plain;h=502f86f79944df4bac9094f716e54110c511dc24;p=ctdb.git ReadOnly: Add "readonly" flag to the ctdb_db_context to indicate if this database supports readonly operations or not. Add a private lock-less tdb file to the ctdb_db_context to use for tracking delegarions for records Assume all databases will support readonly mode for now and se thte flag for all databases. At later stage we will add support to control on a per database level whether delegations will be supported or not. --- diff --git a/include/ctdb_private.h b/include/ctdb_private.h index 833cdc95..d0f0dc49 100644 --- a/include/ctdb_private.h +++ b/include/ctdb_private.h @@ -502,9 +502,11 @@ struct ctdb_db_context { uint32_t db_id; uint32_t priority; bool persistent; + bool readonly; /* Do we support read-only delegations ? */ const char *db_name; const char *db_path; struct tdb_wrap *ltdb; + struct tdb_context *rottdb; /* ReadOnly tracking TDB */ struct ctdb_registered_call *calls; /* list of registered calls */ uint32_t seqnum; struct timed_event *seqnum_update; diff --git a/server/ctdb_ltdb_server.c b/server/ctdb_ltdb_server.c index f04b7de4..82ed0f2b 100644 --- a/server/ctdb_ltdb_server.c +++ b/server/ctdb_ltdb_server.c @@ -926,6 +926,33 @@ again: } } + /* Assume all non-persistent databases support read only delegations */ + if (!ctdb_db->persistent) { + ctdb_db->readonly = true; + } + + if (ctdb_db->readonly) { + char *ropath; + + ropath = talloc_asprintf(ctdb_db, "%s.RO", ctdb_db->db_path); + if (ropath == NULL) { + DEBUG(DEBUG_CRIT,("Failed to asprintf the tracking database\n")); + talloc_free(ctdb_db); + return -1; + } + ctdb_db->rottdb = tdb_open(ropath, + ctdb->tunable.database_hash_size, + TDB_NOLOCK|TDB_CLEAR_IF_FIRST|TDB_NOSYNC, + O_CREAT|O_RDWR, 0); + if (ctdb_db->rottdb == NULL) { + DEBUG(DEBUG_CRIT,("Failed to open/create the tracking database '%s'\n", ropath)); + talloc_free(ctdb_db); + return -1; + } + DEBUG(DEBUG_NOTICE,("OPENED tracking database : '%s'\n", ropath)); + } + + DLIST_ADD(ctdb->db_list, ctdb_db); /* setting this can help some high churn databases */