]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
partial merge from volker (some overlaps removed)
authorAndrew Tridgell <tridge@samba.org>
Tue, 17 Apr 2007 01:26:59 +0000 (11:26 +1000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 17 Apr 2007 01:26:59 +0000 (11:26 +1000)
(This used to be ctdb commit c4747460a8e0017acfd2a97a632ecd9395562d4f)

ctdb/common/ctdb_daemon.c
ctdb/common/ctdb_lockwait.c

index 945030d77e2a275f574b9933a13066c998deea04..aec988115a98ef1e0d6e2bec8b560826f8908d29 100644 (file)
@@ -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;
index 304a0a413ea0f992d1dbe950739b25ecf33e9f44..77cb6a82e209cf4844ffb9ec40b8dd279e4707bd 100644 (file)
@@ -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;
 }