svn commit: samba r17475 - in branches/SOC/mkhl/ldb-map/modules: .
abartlet at samba.org
abartlet at samba.org
Thu Aug 10 10:03:43 GMT 2006
Author: abartlet
Date: 2006-08-10 10:03:42 +0000 (Thu, 10 Aug 2006)
New Revision: 17475
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17475
Log:
When we make more than one remote search, we need to wait for them all
to finish.
Andrew Bartlett
Modified:
branches/SOC/mkhl/ldb-map/modules/ldb_map.c
Changeset:
Modified: branches/SOC/mkhl/ldb-map/modules/ldb_map.c
===================================================================
--- branches/SOC/mkhl/ldb-map/modules/ldb_map.c 2006-08-10 01:51:27 UTC (rev 17474)
+++ branches/SOC/mkhl/ldb-map/modules/ldb_map.c 2006-08-10 10:03:42 UTC (rev 17475)
@@ -134,6 +134,10 @@
struct ldb_request *remote_req;
struct ldb_request *down_req;
struct ldb_request *search_req;
+
+ /* for search, we may have a lot of contexts */
+ int num_searches;
+ struct ldb_request **search_reqs;
};
/* Context data for mapped search requests */
@@ -2073,6 +2077,7 @@
const struct ldb_dn *dn,
const char * const *attrs,
const struct ldb_parse_tree *tree,
+ void *context,
ldb_search_callback callback)
{
struct ldb_request *req;
@@ -2099,7 +2104,7 @@
}
req->controls = NULL;
- req->context = ac;
+ req->context = context;
req->callback = callback;
ldb_set_timeout_from_prev_req(ac->module->ldb, ac->orig_req, req);
@@ -2129,7 +2134,7 @@
tree->operation = LDB_OP_PRESENT;
tree->u.present.attr = talloc_strdup(tree, IS_MAPPED);
- return map_search_base_req(ac, dn, attrs, tree, map_search_self_callback);
+ return map_search_base_req(ac, dn, attrs, tree, ac, map_search_self_callback);
}
/* Build a request to update the 'IS_MAPPED' attribute */
@@ -2325,13 +2330,23 @@
/* Prepare local search request */
/* TODO: use GUIDs here instead? */
- req = map_search_base_req(ac, ares->message->dn, NULL, NULL, map_local_merge_callback);
+
+ ac->search_reqs = talloc_realloc(ac, ac->search_reqs, struct ldb_request *, ac->num_searches + 2);
+ if (ac->search_reqs == NULL) {
+ talloc_free(ares);
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+
+ ac->search_reqs[ac->num_searches]
+ = req = map_search_base_req(ac, ares->message->dn,
+ NULL, NULL, sc, map_local_merge_callback);
if (req == NULL) {
talloc_free(sc);
talloc_free(ares);
return LDB_ERR_OPERATIONS_ERROR;
}
- req->context = sc;
+ ac->num_searches++;
+ ac->search_reqs[ac->num_searches] = NULL;
return ldb_next_request(ac->module, req);
}
@@ -2367,30 +2382,38 @@
}
ac = talloc_get_type(h->private_data, struct map_context);
+ ac->search_reqs = talloc_array(ac, struct ldb_request *, 2);
+ if (ac->search_reqs == NULL) {
+ talloc_free(h);
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+ ac->num_searches = 1;
+ ac->search_reqs[1] = NULL;
+
/* Prepare the remote operation */
- ac->remote_req = talloc(ac, struct ldb_request);
- if (ac->remote_req == NULL) {
+ ac->search_reqs[0] = talloc(ac, struct ldb_request);
+ if (ac->search_reqs[0] == NULL) {
goto oom;
}
- *(ac->remote_req) = *req; /* copy the request */
+ *(ac->search_reqs[0]) = *req; /* copy the request */
- ac->remote_req->handle = h; /* return our own handle to deal with this call */
+ ac->search_reqs[0]->handle = h; /* return our own handle to deal with this call */
- ac->remote_req->context = ac;
- ac->remote_req->callback = map_remote_search_callback;
+ ac->search_reqs[0]->context = ac;
+ ac->search_reqs[0]->callback = map_remote_search_callback;
/* Split local from remote attrs */
- ret = map_flarp(module, ac, ac->remote_req, &local_attrs, &remote_attrs, req->op.search.attrs, req->op.search.tree);
+ ret = map_flarp(module, ac, ac->search_reqs[0], &local_attrs, &remote_attrs, req->op.search.attrs, req->op.search.tree);
if (ret) {
goto failed;
}
ac->local_attrs = local_attrs;
- ac->remote_req->op.search.attrs = remote_attrs;
+ ac->search_reqs[0]->op.search.attrs = remote_attrs;
/* Split local from remote tree */
- ret = ldb_parse_tree_partition(module, ac, ac->remote_req, &local_tree, &remote_tree, req->op.search.tree);
+ ret = ldb_parse_tree_partition(module, ac, ac->search_reqs[0], &local_tree, &remote_tree, req->op.search.tree);
if (ret) {
goto failed;
}
@@ -2415,25 +2438,25 @@
}
if (remote_tree == NULL) {
/* Construct default remote parse tree */
- remote_tree = ldb_parse_tree(ac->remote_req, NULL);
+ remote_tree = ldb_parse_tree(ac->search_reqs[0], NULL);
if (remote_tree == NULL) {
goto failed;
}
}
ac->local_tree = local_tree;
- ac->remote_req->op.search.tree = remote_tree;
+ ac->search_reqs[0]->op.search.tree = remote_tree;
- ldb_set_timeout_from_prev_req(module->ldb, req, ac->remote_req);
+ ldb_set_timeout_from_prev_req(module->ldb, req, ac->search_reqs[0]);
h->state = LDB_ASYNC_INIT;
h->status = LDB_SUCCESS;
ac->step = MAP_SEARCH_REMOTE;
- ret = ldb_next_remote_request(module, ac->remote_req);
+ ret = ldb_next_remote_request(module, ac->search_reqs[0]);
if (ret == LDB_SUCCESS) {
- req->handle = ac->remote_req->handle;
+ req->handle = h;
}
return ret;
@@ -3046,12 +3069,15 @@
case MAP_RENAME_FIXUP:
return ac->down_req;
- case MAP_SEARCH_REMOTE:
case MAP_ADD_LOCAL:
case MAP_MODIFY_LOCAL:
case MAP_DELETE_LOCAL:
case MAP_RENAME_LOCAL:
return ac->local_req;
+
+ case MAP_SEARCH_REMOTE:
+ /* Can't happen */
+ break;
}
return NULL; /* unreachable; silences a warning */
@@ -3123,27 +3149,48 @@
ac = talloc_get_type(handle->private_data, struct map_context);
- req = map_get_req(ac);
-
- ret = ldb_wait(req->handle, LDB_WAIT_NONE);
-
- if (ret != LDB_SUCCESS) {
- handle->status = ret;
- goto done;
- }
- if (req->handle->status != LDB_SUCCESS) {
+ if (ac->step == MAP_SEARCH_REMOTE) {
+ int i;
+ for (i=0; i < ac->num_searches; i++) {
+ req = ac->search_reqs[i];
+ ret = ldb_wait(req->handle, LDB_WAIT_NONE);
+
+ if (ret != LDB_SUCCESS) {
+ handle->status = ret;
+ goto done;
+ }
+ if (req->handle->status != LDB_SUCCESS) {
+ handle->status = req->handle->status;
+ goto done;
+ }
+ if (req->handle->state != LDB_ASYNC_DONE) {
+ return LDB_SUCCESS;
+ }
+ }
+ } else {
+
+ req = map_get_req(ac);
+
+ ret = ldb_wait(req->handle, LDB_WAIT_NONE);
+
+ if (ret != LDB_SUCCESS) {
+ handle->status = ret;
+ goto done;
+ }
+ if (req->handle->status != LDB_SUCCESS) {
handle->status = req->handle->status;
goto done;
+ }
+ if (req->handle->state != LDB_ASYNC_DONE) {
+ return LDB_SUCCESS;
+ }
+
+ next = map_get_next(ac);
+ if (next) {
+ return next(handle);
+ }
}
- if (req->handle->state != LDB_ASYNC_DONE) {
- return LDB_SUCCESS;
- }
- next = map_get_next(ac);
- if (next) {
- return next(handle);
- }
-
ret = LDB_SUCCESS;
done:
More information about the samba-cvs
mailing list