1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-26 10:04:02 +03:00

partial merge from volker (some overlaps removed)

(This used to be ctdb commit c4747460a8e0017acfd2a97a632ecd9395562d4f)
This commit is contained in:
Andrew Tridgell 2007-04-17 11:26:59 +10:00
parent 3fc279760c
commit 3c2ebff3cb
2 changed files with 54 additions and 24 deletions

View 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;

View 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;
}