summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2007-04-17 11:26:59 +1000
committerAndrew Tridgell <tridge@samba.org>2007-04-17 11:26:59 +1000
commit3c2ebff3cbfb398aef9d6d2cc8c82a5892f630c8 (patch)
tree1efc413e78dddd447cd1da4bcce473454f793bb8
parent3fc279760c82b4df070e3a16893824e66a6cc7ca (diff)
downloadsamba-3c2ebff3cbfb398aef9d6d2cc8c82a5892f630c8.tar.gz
samba-3c2ebff3cbfb398aef9d6d2cc8c82a5892f630c8.tar.xz
samba-3c2ebff3cbfb398aef9d6d2cc8c82a5892f630c8.zip
partial merge from volker (some overlaps removed)
(This used to be ctdb commit c4747460a8e0017acfd2a97a632ecd9395562d4f)
-rw-r--r--ctdb/common/ctdb_daemon.c24
-rw-r--r--ctdb/common/ctdb_lockwait.c54
2 files changed, 54 insertions, 24 deletions
diff --git a/ctdb/common/ctdb_daemon.c b/ctdb/common/ctdb_daemon.c
index 945030d77e..aec988115a 100644
--- a/ctdb/common/ctdb_daemon.c
+++ b/ctdb/common/ctdb_daemon.c
@@ -186,6 +186,24 @@ static void daemon_request_fetch_lock(struct ctdb_client *client,
struct client_fetch_lock_data *fl_data;
ctdb_db = find_ctdb_db(client->ctdb, f->db_id);
+ if (ctdb_db == NULL) {
+ struct ctdb_reply_fetch_lock r;
+
+ ZERO_STRUCT(r);
+ r.hdr.length = sizeof(r);
+ r.hdr.ctdb_magic = CTDB_MAGIC;
+ r.hdr.ctdb_version = CTDB_VERSION;
+ r.hdr.operation = CTDB_REPLY_FETCH_LOCK;
+ r.hdr.reqid = f->hdr.reqid;
+ r.state = -1;
+
+ /*
+ * Ignore the result, there's not much we can do anyway.
+ */
+ ctdb_queue_send(client->queue, (uint8_t *)&r.hdr,
+ r.hdr.length);
+ return;
+ }
key.dsize = f->keylen;
key.dptr = &f->key[0];
@@ -220,6 +238,12 @@ static void daemon_request_store_unlock(struct ctdb_client *client,
int res;
ctdb_db = find_ctdb_db(client->ctdb, f->db_id);
+ if (ctdb_db == NULL) {
+ ctdb_set_error(client->ctdb, "Could not find database %i",
+ f->db_id);
+ res = -1;
+ goto done;
+ }
/* write the data to ltdb */
key.dsize = f->keylen;
diff --git a/ctdb/common/ctdb_lockwait.c b/ctdb/common/ctdb_lockwait.c
index 304a0a413e..77cb6a82e2 100644
--- a/ctdb/common/ctdb_lockwait.c
+++ b/ctdb/common/ctdb_lockwait.c
@@ -71,48 +71,54 @@ static int lockwait_destructor(struct lockwait_handle *h)
*/
struct lockwait_handle *ctdb_lockwait(struct ctdb_db_context *ctdb_db,
TDB_DATA key,
- void (*callback)(void *), void *private_data)
+ void (*callback)(void *private_data),
+ void *private_data)
{
- struct lockwait_handle *h;
+ struct lockwait_handle *result;
int ret;
- h = talloc_zero(ctdb_db, struct lockwait_handle);
- if (h == NULL) {
+ if (!(result = talloc_zero(ctdb_db, struct lockwait_handle))) {
return NULL;
}
- ret = pipe(h->fd);
+ ret = pipe(result->fd);
+
if (ret != 0) {
- talloc_free(h);
+ talloc_free(result);
return NULL;
}
- h->child = fork();
- if (h->child == (pid_t)-1) {
- close(h->fd[0]);
- close(h->fd[1]);
- talloc_free(h);
+ result->child = fork();
+
+ if (result->child == (pid_t)-1) {
+ close(result->fd[0]);
+ close(result->fd[1]);
+ talloc_free(result);
return NULL;
}
- h->callback = callback;
- h->private_data = private_data;
+ result->callback = callback;
+ result->private_data = private_data;
- if (h->child == 0) {
- struct tdb_context *tdb = ctdb_db->ltdb->tdb;
- /* in child */
- tdb_chainlock(tdb, key);
- _exit(0);
+ if (result->child == 0) {
+ close(result->fd[0]);
+ /*
+ * Do we need a tdb_reopen here?
+ */
+ tdb_chainlock(ctdb_db->ltdb->tdb, key);
+ exit(0);
}
- close(h->fd[1]);
- talloc_set_destructor(h, lockwait_destructor);
+ close(result->fd[1]);
+ talloc_set_destructor(result, lockwait_destructor);
- h->fde = event_add_fd(ctdb_db->ctdb->ev, h, h->fd[0], EVENT_FD_READ, lockwait_handler, h);
- if (h->fde == NULL) {
- talloc_free(h);
+ result->fde = event_add_fd(ctdb_db->ctdb->ev, result, result->fd[0],
+ EVENT_FD_READ, lockwait_handler,
+ (void *)result);
+ if (result->fde == NULL) {
+ talloc_free(result);
return NULL;
}
- return h;
+ return result;
}