diff options
author | Volker Lendecke <vl@samba.org> | 2011-08-18 13:37:23 +0200 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2011-08-22 17:11:06 +0200 |
commit | d55e6cf53c92909c632de7a3f653a8e3e2c8c6c6 (patch) | |
tree | aed5f57f01bd87cceeb7dfb67c75e5e29c721b80 | |
parent | a31d7516f5c6c1814e9f16645149eb597580dbef (diff) | |
download | samba-d55e6cf53c92909c632de7a3f653a8e3e2c8c6c6.tar.gz samba-d55e6cf53c92909c632de7a3f653a8e3e2c8c6c6.tar.xz samba-d55e6cf53c92909c632de7a3f653a8e3e2c8c6c6.zip |
libctdb: Reorder attachdb
No code change, this is for easier reading the sequence of what happens
Signed-off-by: Michael Adam <obnox@samba.org>
(This used to be ctdb commit 883b9b185dce03a6bf233fbf2cfabad9883519e5)
-rw-r--r-- | ctdb/libctdb/ctdb.c | 171 |
1 files changed, 90 insertions, 81 deletions
diff --git a/ctdb/libctdb/ctdb.c b/ctdb/libctdb/ctdb.c index 7115982d1a..141f42f63d 100644 --- a/ctdb/libctdb/ctdb.c +++ b/ctdb/libctdb/ctdb.c @@ -559,61 +559,71 @@ void ctdb_detachdb(struct ctdb_connection *ctdb, struct ctdb_db *db) free(db); } +static void destroy_req_db(struct ctdb_connection *ctdb, + struct ctdb_request *req); +static void attachdb_done(struct ctdb_connection *ctdb, + struct ctdb_request *req, + void *_db); static void attachdb_getdbpath_done(struct ctdb_connection *ctdb, struct ctdb_request *req, - void *_db) -{ - struct ctdb_db *db = _db; + void *_db); - /* Do callback on original request. */ - db->callback(ctdb, req->extra, db->private_data); -} - -struct ctdb_db *ctdb_attachdb_recv(struct ctdb_connection *ctdb, - struct ctdb_request *req) +struct ctdb_request * +ctdb_attachdb_send(struct ctdb_connection *ctdb, + const char *name, bool persistent, uint32_t tdb_flags, + ctdb_callback_t callback, void *private_data) { - struct ctdb_request *dbpath_req = req->extra; - struct ctdb_reply_control *reply; - struct ctdb_db *db = req->priv_data; - uint32_t tdb_flags = db->tdb_flags; - struct tdb_logging_context log; + struct ctdb_request *req; + struct ctdb_db *db; + uint32_t opcode; - /* Never sent the dbpath request? We've failed. */ - if (!dbpath_req) { - /* FIXME: Save errno? */ - errno = EINVAL; + /* FIXME: Search if db already open. */ + db = malloc(sizeof(*db)); + if (!db) { return NULL; } - reply = unpack_reply_control(ctdb, dbpath_req, CTDB_CONTROL_GETDBPATH); - if (!reply) { - return NULL; + if (persistent) { + opcode = CTDB_CONTROL_DB_ATTACH_PERSISTENT; + } else { + opcode = CTDB_CONTROL_DB_ATTACH; } - if (reply->status != 0) { - DEBUG(db->ctdb, LOG_ERR, - "ctdb_attachdb_recv: reply status %i", reply->status); + + req = new_ctdb_control_request(ctdb, opcode, CTDB_CURRENT_NODE, name, + strlen(name) + 1, attachdb_done, db); + if (!req) { + DEBUG(ctdb, LOG_ERR, + "ctdb_attachdb_send: failed allocating DB_ATTACH"); + free(db); return NULL; } - tdb_flags = db->persistent ? TDB_DEFAULT : TDB_NOSYNC; - tdb_flags |= TDB_DISALLOW_NESTING; + db->ctdb = ctdb; + db->tdb_flags = tdb_flags; + db->persistent = persistent; + db->callback = callback; + db->private_data = private_data; - log.log_fn = ctdb_tdb_log_bridge; - log.log_private = ctdb; - db->tdb = tdb_open_ex((char *)reply->data, 0, tdb_flags, O_RDWR, 0, - &log, NULL); - if (db->tdb == NULL) { - DEBUG(db->ctdb, LOG_ERR, - "ctdb_attachdb_recv: failed to tdb_open %s", - (char *)reply->data); - return NULL; - } + req->extra_destructor = destroy_req_db; + /* This is set non-NULL when we succeed, see ctdb_attachdb_recv */ + req->extra = NULL; - /* Finally, separate the db from the request (see destroy_req_db). */ - req->priv_data = NULL; + /* Flags get overloaded into srvid. */ + req->hdr.control->srvid = tdb_flags; DEBUG(db->ctdb, LOG_DEBUG, - "ctdb_attachdb_recv: db %p, tdb %s", db, (char *)reply->data); - return db; + "ctdb_attachdb_send: DB_ATTACH request %p", req); + return req; +} + +static void destroy_req_db(struct ctdb_connection *ctdb, + struct ctdb_request *req) +{ + /* Incomplete db is in priv_data. */ + free(req->priv_data); + /* second request is chained off this one. */ + if (req->extra) { + ctdb_request_free(ctdb, req->extra); + } } static void attachdb_done(struct ctdb_connection *ctdb, @@ -660,62 +670,61 @@ static void attachdb_done(struct ctdb_connection *ctdb, "ctdb_attachdb_send(async): created getdbpath request"); } -static void destroy_req_db(struct ctdb_connection *ctdb, - struct ctdb_request *req) +static void attachdb_getdbpath_done(struct ctdb_connection *ctdb, + struct ctdb_request *req, + void *_db) { - /* Incomplete db is in priv_data. */ - free(req->priv_data); - /* second request is chained off this one. */ - if (req->extra) { - ctdb_request_free(ctdb, req->extra); - } + struct ctdb_db *db = _db; + + /* Do callback on original request. */ + db->callback(ctdb, req->extra, db->private_data); } -struct ctdb_request * -ctdb_attachdb_send(struct ctdb_connection *ctdb, - const char *name, bool persistent, uint32_t tdb_flags, - ctdb_callback_t callback, void *private_data) +struct ctdb_db *ctdb_attachdb_recv(struct ctdb_connection *ctdb, + struct ctdb_request *req) { - struct ctdb_request *req; - struct ctdb_db *db; - uint32_t opcode; + struct ctdb_request *dbpath_req = req->extra; + struct ctdb_reply_control *reply; + struct ctdb_db *db = req->priv_data; + uint32_t tdb_flags = db->tdb_flags; + struct tdb_logging_context log; - /* FIXME: Search if db already open. */ - db = malloc(sizeof(*db)); - if (!db) { + /* Never sent the dbpath request? We've failed. */ + if (!dbpath_req) { + /* FIXME: Save errno? */ + errno = EINVAL; return NULL; } - if (persistent) { - opcode = CTDB_CONTROL_DB_ATTACH_PERSISTENT; - } else { - opcode = CTDB_CONTROL_DB_ATTACH; + reply = unpack_reply_control(ctdb, dbpath_req, CTDB_CONTROL_GETDBPATH); + if (!reply) { + return NULL; } - - req = new_ctdb_control_request(ctdb, opcode, CTDB_CURRENT_NODE, name, - strlen(name) + 1, attachdb_done, db); - if (!req) { - DEBUG(ctdb, LOG_ERR, - "ctdb_attachdb_send: failed allocating DB_ATTACH"); - free(db); + if (reply->status != 0) { + DEBUG(db->ctdb, LOG_ERR, + "ctdb_attachdb_recv: reply status %i", reply->status); return NULL; } - db->ctdb = ctdb; - db->tdb_flags = tdb_flags; - db->persistent = persistent; - db->callback = callback; - db->private_data = private_data; + tdb_flags = db->persistent ? TDB_DEFAULT : TDB_NOSYNC; + tdb_flags |= TDB_DISALLOW_NESTING; - req->extra_destructor = destroy_req_db; - /* This is set non-NULL when we succeed, see ctdb_attachdb_recv */ - req->extra = NULL; + log.log_fn = ctdb_tdb_log_bridge; + log.log_private = ctdb; + db->tdb = tdb_open_ex((char *)reply->data, 0, tdb_flags, O_RDWR, 0, + &log, NULL); + if (db->tdb == NULL) { + DEBUG(db->ctdb, LOG_ERR, + "ctdb_attachdb_recv: failed to tdb_open %s", + (char *)reply->data); + return NULL; + } - /* Flags get overloaded into srvid. */ - req->hdr.control->srvid = tdb_flags; + /* Finally, separate the db from the request (see destroy_req_db). */ + req->priv_data = NULL; DEBUG(db->ctdb, LOG_DEBUG, - "ctdb_attachdb_send: DB_ATTACH request %p", req); - return req; + "ctdb_attachdb_recv: db %p, tdb %s", db, (char *)reply->data); + return db; } static unsigned long lock_magic(struct ctdb_lock *lock) |