The branch, master has been updated
       via  2deeb99fff1a90c79ba1927e1a069362e250a63c (commit)
      from  f0dcc1fad452a25305a9c8425eadc68e7f569bfd (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 2deeb99fff1a90c79ba1927e1a069362e250a63c
Author: Simo Sorce <[EMAIL PROTECTED]>
Date:   Wed Oct 15 14:03:20 2008 -0400

    Transform the sequence_number operation into a normal extended operation as 
it should always have been. Make it also async so that it is not a special case.

-----------------------------------------------------------------------

Summary of changes:
 source4/dsdb/samdb/ldb_modules/objectguid.c      |    2 +-
 source4/dsdb/samdb/ldb_modules/partition.c       |  246 ++++++++++++++++------
 source4/dsdb/samdb/ldb_modules/simple_ldap_map.c |   68 +++++--
 source4/lib/ldb/common/ldb.c                     |   50 +++--
 source4/lib/ldb/common/ldb_modules.c             |    4 -
 source4/lib/ldb/include/ldb.h                    |   37 ++--
 source4/lib/ldb/ldb.i                            |   20 --
 source4/lib/ldb/ldb_tdb/ldb_search.c             |   24 --
 source4/lib/ldb/ldb_tdb/ldb_tdb.c                |  144 +++++++++++---
 source4/lib/ldb/ldb_tdb/ldb_tdb.h                |    2 +
 source4/lib/ldb/ldb_wrap.c                       |   20 --
 source4/setup/schema_samba4.ldif                 |    2 +
 12 files changed, 412 insertions(+), 207 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/samdb/ldb_modules/objectguid.c 
b/source4/dsdb/samdb/ldb_modules/objectguid.c
index 0549059..3d72568 100644
--- a/source4/dsdb/samdb/ldb_modules/objectguid.c
+++ b/source4/dsdb/samdb/ldb_modules/objectguid.c
@@ -194,7 +194,7 @@ static int objectguid_add(struct ldb_module *module, struct 
ldb_request *req)
        }
 
        /* Get a sequence number from the backend */
-       /* FIXME: ldb_sequence_number is still SYNC now, when this changes,
+       /* FIXME: ldb_sequence_number is a semi-async call,
         * make sure this function is split and a callback is used */
        ret = ldb_sequence_number(module->ldb, LDB_SEQ_NEXT, &seq_num);
        if (ret == LDB_SUCCESS) {
diff --git a/source4/dsdb/samdb/ldb_modules/partition.c 
b/source4/dsdb/samdb/ldb_modules/partition.c
index b452b66..b4a7a47 100644
--- a/source4/dsdb/samdb/ldb_modules/partition.c
+++ b/source4/dsdb/samdb/ldb_modules/partition.c
@@ -115,10 +115,6 @@ int partition_request(struct ldb_module *module, struct 
ldb_request *request)
                PARTITION_FIND_OP(module, extended);
                ret = module->ops->extended(module, request);
                break;
-       case LDB_SEQUENCE_NUMBER:
-               PARTITION_FIND_OP(module, sequence_number);
-               ret = module->ops->sequence_number(module, request);
-               break;
        default:
                PARTITION_FIND_OP(module, request);
                ret = module->ops->request(module, request);
@@ -716,9 +712,8 @@ static int partition_del_trans(struct ldb_module *module)
        return ret2;
 }
 
-/* NOTE: ldb_sequence_number is still a completely SYNCHRONOUS call
- * implemented only in ldb_rdb. It does not require ldb_wait() to be
- * called after a request is made */
+
+/* FIXME: This function is still semi-async */
 static int partition_sequence_number(struct ldb_module *module, struct 
ldb_request *req)
 {
        int i, ret;
@@ -727,113 +722,241 @@ static int partition_sequence_number(struct ldb_module 
*module, struct ldb_reque
        uint64_t timestamp = 0;
        struct partition_private_data *data = 
talloc_get_type(module->private_data, 
                                                              struct 
partition_private_data);
+       struct ldb_seqnum_request *seq;
+       struct ldb_seqnum_result *seqr;
+       struct ldb_request *treq;
+       struct ldb_seqnum_request *tseq;
+       struct ldb_seqnum_result *tseqr;
+       struct ldb_extended *ext;
+       struct ldb_result *res;
 
-       switch (req->op.seq_num.type) {
+       seq = talloc_get_type(req->op.extended.data, struct ldb_seqnum_request);
+
+       switch (seq->type) {
        case LDB_SEQ_NEXT:
        case LDB_SEQ_HIGHEST_SEQ:
-               ret = ldb_next_request(module, req);
-               if (ret != LDB_SUCCESS) {
-                       return ret;
+               res = talloc_zero(req, struct ldb_result);
+               if (res == NULL) {
+                       return LDB_ERR_OPERATIONS_ERROR;
                }
-               if (req->op.seq_num.flags & LDB_SEQ_TIMESTAMP_SEQUENCE) {
-                       timestamp_sequence = req->op.seq_num.seq_num;
-               } else {
-                       seq_number = seq_number + req->op.seq_num.seq_num;
+               tseq = talloc_zero(res, struct ldb_seqnum_request);
+               if (tseq == NULL) {
+                       talloc_free(res);
+                       return LDB_ERR_OPERATIONS_ERROR;
+               }
+               tseq->type = seq->type;
+
+               ret = ldb_build_extended_req(&treq, module->ldb, res,
+                                            LDB_EXTENDED_SEQUENCE_NUMBER,
+                                            tseq,
+                                            NULL,
+                                            res,
+                                            ldb_extended_default_callback,
+                                            NULL);
+               ret = ldb_next_request(module, treq);
+               if (ret == LDB_SUCCESS) {
+                       ret = ldb_wait(treq->handle, LDB_WAIT_ALL);
                }
-
-               /* gross hack part1 */
-               ret = ldb_request_add_control(req,
-                                       DSDB_CONTROL_CURRENT_PARTITION_OID,
-                                       false, NULL);
                if (ret != LDB_SUCCESS) {
+                       talloc_free(res);
                        return ret;
                }
+               seqr = talloc_get_type(res->extended->data,
+                                       struct ldb_seqnum_result);
+               if (seqr->flags & LDB_SEQ_TIMESTAMP_SEQUENCE) {
+                       timestamp_sequence = seqr->seq_num;
+               } else {
+                       seq_number += seqr->seq_num;
+               }
+               talloc_free(res);
 
-               /* Look at base DN */
-               /* Figure out which partition it is under */
                /* Skip the lot if 'data' isn't here yet (initialistion) */
                for (i=0; data && data->partitions && data->partitions[i]; i++) 
{
 
-                       /* gross hack part2 */
-                       int j;
-                       for (j=0; req->controls[j]; j++) {
-                               if (strcmp(req->controls[j]->oid, 
DSDB_CONTROL_CURRENT_PARTITION_OID) == 0) {
-                                       req->controls[j]->data = 
data->partitions[i];
-                                       break;
-                               }
+                       res = talloc_zero(req, struct ldb_result);
+                       if (res == NULL) {
+                               return LDB_ERR_OPERATIONS_ERROR;
+                       }
+                       tseq = talloc_zero(res, struct ldb_seqnum_request);
+                       if (tseq == NULL) {
+                               talloc_free(res);
+                               return LDB_ERR_OPERATIONS_ERROR;
+                       }
+                       tseq->type = seq->type;
+
+                       ret = ldb_build_extended_req(&treq, module->ldb, res,
+                                                    
LDB_EXTENDED_SEQUENCE_NUMBER,
+                                                    tseq,
+                                                    NULL,
+                                                    res,
+                                                    
ldb_extended_default_callback,
+                                                    NULL);
+                       if (ret != LDB_SUCCESS) {
+                               talloc_free(res);
+                               return ret;
                        }
 
-                       ret = partition_request(data->partitions[i]->module, 
req);
+                       ret = ldb_request_add_control(treq,
+                                                     
DSDB_CONTROL_CURRENT_PARTITION_OID,
+                                                     false, 
data->partitions[i]);
                        if (ret != LDB_SUCCESS) {
+                               talloc_free(res);
                                return ret;
                        }
-                       if (req->op.seq_num.flags & LDB_SEQ_TIMESTAMP_SEQUENCE) 
{
-                               timestamp_sequence = MAX(timestamp_sequence, 
req->op.seq_num.seq_num);
+
+                       ret = partition_request(data->partitions[i]->module, 
treq);
+                       if (ret != LDB_SUCCESS) {
+                               talloc_free(res);
+                               return ret;
+                       }
+                       ret = ldb_wait(treq->handle, LDB_WAIT_ALL);
+                       if (ret != LDB_SUCCESS) {
+                               talloc_free(res);
+                               return ret;
+                       }
+                       tseqr = talloc_get_type(res->extended->data,
+                                               struct ldb_seqnum_result);
+                       if (tseqr->flags & LDB_SEQ_TIMESTAMP_SEQUENCE) {
+                               timestamp_sequence = MAX(timestamp_sequence,
+                                                        tseqr->seq_num);
                        } else {
-                               seq_number = seq_number + 
req->op.seq_num.seq_num;
+                               seq_number += tseqr->seq_num;
                        }
+                       talloc_free(res);
                }
-               /* fall though */
+               /* fall through */
        case LDB_SEQ_HIGHEST_TIMESTAMP:
-       {
-               struct ldb_request *date_req = talloc(req, struct ldb_request);
-               if (!date_req) {
+
+               res = talloc_zero(req, struct ldb_result);
+               if (res == NULL) {
                        return LDB_ERR_OPERATIONS_ERROR;
                }
-               *date_req = *req;
-               date_req->op.seq_num.flags = LDB_SEQ_HIGHEST_TIMESTAMP;
 
-               ret = ldb_next_request(module, date_req);
+               tseq = talloc_zero(res, struct ldb_seqnum_request);
+               if (tseq == NULL) {
+                       talloc_free(res);
+                       return LDB_ERR_OPERATIONS_ERROR;
+               }
+               tseq->type = LDB_SEQ_HIGHEST_TIMESTAMP;
+
+               ret = ldb_build_extended_req(&treq, module->ldb, res,
+                                            LDB_EXTENDED_SEQUENCE_NUMBER,
+                                            tseq,
+                                            NULL,
+                                            res,
+                                            ldb_extended_default_callback,
+                                            NULL);
                if (ret != LDB_SUCCESS) {
+                       talloc_free(res);
                        return ret;
                }
-               timestamp = date_req->op.seq_num.seq_num;
 
-               /* Look at base DN */
-               /* Figure out which partition it is under */
+               ret = ldb_next_request(module, treq);
+               if (ret != LDB_SUCCESS) {
+                       talloc_free(res);
+                       return ret;
+               }
+               ret = ldb_wait(treq->handle, LDB_WAIT_ALL);
+               if (ret != LDB_SUCCESS) {
+                       talloc_free(res);
+                       return ret;
+               }
+
+               tseqr = talloc_get_type(res->extended->data,
+                                          struct ldb_seqnum_result);
+               timestamp = tseqr->seq_num;
+
+               talloc_free(res);
+
                /* Skip the lot if 'data' isn't here yet (initialistion) */
                for (i=0; data && data->partitions && data->partitions[i]; i++) 
{
 
-                       ret = partition_request(data->partitions[i]->module, 
req);
+                       res = talloc_zero(req, struct ldb_result);
+                       if (res == NULL) {
+                               return LDB_ERR_OPERATIONS_ERROR;
+                       }
+
+                       tseq = talloc_zero(res, struct ldb_seqnum_request);
+                       if (tseq == NULL) {
+                               talloc_free(res);
+                               return LDB_ERR_OPERATIONS_ERROR;
+                       }
+                       tseq->type = LDB_SEQ_HIGHEST_TIMESTAMP;
+
+                       ret = ldb_build_extended_req(&treq, module->ldb, res,
+                                                    
LDB_EXTENDED_SEQUENCE_NUMBER,
+                                                    tseq,
+                                                    NULL,
+                                                    res,
+                                                    
ldb_extended_default_callback,
+                                                    NULL);
+                       if (ret != LDB_SUCCESS) {
+                               talloc_free(res);
+                               return ret;
+                       }
+
+                       ret = partition_request(data->partitions[i]->module, 
treq);
                        if (ret != LDB_SUCCESS) {
+                               talloc_free(res);
                                return ret;
                        }
-                       timestamp = MAX(timestamp, 
date_req->op.seq_num.seq_num);
+                       ret = ldb_wait(treq->handle, LDB_WAIT_ALL);
+                       if (ret != LDB_SUCCESS) {
+                               talloc_free(res);
+                               return ret;
+                       }
+
+                       tseqr = talloc_get_type(res->extended->data,
+                                                 struct ldb_seqnum_result);
+                       timestamp = MAX(timestamp, tseqr->seq_num);
+
+                       talloc_free(res);
                }
+
                break;
        }
+
+       ext = talloc_zero(req, struct ldb_extended);
+       if (!ext) {
+               return LDB_ERR_OPERATIONS_ERROR;
        }
+       seqr = talloc_zero(ext, struct ldb_seqnum_result);
+       if (seqr == NULL) {
+               talloc_free(ext);
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
+       ext->oid = LDB_EXTENDED_SEQUENCE_NUMBER;
+       ext->data = seqr;
 
-       switch (req->op.seq_num.flags) {
+       switch (seq->type) {
        case LDB_SEQ_NEXT:
        case LDB_SEQ_HIGHEST_SEQ:
 
-               req->op.seq_num.flags = 0;
-
                /* Has someone above set a timebase sequence? */
                if (timestamp_sequence) {
-                       req->op.seq_num.seq_num = (((unsigned long 
long)timestamp << 24) | (seq_number & 0xFFFFFF));
+                       seqr->seq_num = (((unsigned long long)timestamp << 24) 
| (seq_number & 0xFFFFFF));
                } else {
-                       req->op.seq_num.seq_num = seq_number;
+                       seqr->seq_num = seq_number;
                }
 
-               if (timestamp_sequence > req->op.seq_num.seq_num) {
-                       req->op.seq_num.seq_num = timestamp_sequence;
-                       req->op.seq_num.flags |= LDB_SEQ_TIMESTAMP_SEQUENCE;
+               if (timestamp_sequence > seqr->seq_num) {
+                       seqr->seq_num = timestamp_sequence;
+                       seqr->flags |= LDB_SEQ_TIMESTAMP_SEQUENCE;
                }
 
-               req->op.seq_num.flags |= LDB_SEQ_GLOBAL_SEQUENCE;
+               seqr->flags |= LDB_SEQ_GLOBAL_SEQUENCE;
                break;
        case LDB_SEQ_HIGHEST_TIMESTAMP:
-               req->op.seq_num.seq_num = timestamp;
+               seqr->seq_num = timestamp;
                break;
        }
 
-       switch (req->op.seq_num.flags) {
-       case LDB_SEQ_NEXT:
-               req->op.seq_num.seq_num++;
+       if (seq->type == LDB_SEQ_NEXT) {
+               seqr->seq_num++;
        }
-       return LDB_SUCCESS;
+
+       /* send request done */
+       return ldb_module_done(req, NULL, ext, LDB_SUCCESS);
 }
 
 static int partition_extended_replicated_objects(struct ldb_module *module, 
struct ldb_request *req)
@@ -906,6 +1029,10 @@ static int partition_extended(struct ldb_module *module, 
struct ldb_request *req
                return ldb_next_request(module, req);
        }
 
+       if (strcmp(req->op.extended.oid, LDB_EXTENDED_SEQUENCE_NUMBER) == 0) {
+               return partition_sequence_number(module, req);
+       }
+
        if (strcmp(req->op.extended.oid, DSDB_EXTENDED_REPLICATED_OBJECTS_OID) 
== 0) {
                return partition_extended_replicated_objects(module, req);
        }
@@ -1204,7 +1331,6 @@ _PUBLIC_ const struct ldb_module_ops 
ldb_partition_module_ops = {
        .del               = partition_delete,
        .rename            = partition_rename,
        .extended          = partition_extended,
-       .sequence_number   = partition_sequence_number,
        .start_transaction = partition_start_trans,
        .end_transaction   = partition_end_trans,
        .del_transaction   = partition_del_trans,
diff --git a/source4/dsdb/samdb/ldb_modules/simple_ldap_map.c 
b/source4/dsdb/samdb/ldb_modules/simple_ldap_map.c
index d15e85a..c353914 100644
--- a/source4/dsdb/samdb/ldb_modules/simple_ldap_map.c
+++ b/source4/dsdb/samdb/ldb_modules/simple_ldap_map.c
@@ -603,10 +603,18 @@ static int nsuniqueid_init(struct ldb_module *module)
        return ldb_next_init(module);
 }
 
-static int get_seq(struct ldb_request *req,
-                  struct ldb_reply *ares)
+static int get_seq_callback(struct ldb_request *req,
+                           struct ldb_reply *ares)
 {
        unsigned long long *seq = (unsigned long long *)req->context;
+
+       if (!ares) {
+               return ldb_request_done(req, LDB_ERR_OPERATIONS_ERROR);
+       }
+       if (ares->error != LDB_SUCCESS) {
+               return ldb_request_done(req, ares->error);
+       }
+
        if (ares->type == LDB_REPLY_ENTRY) {
                struct ldb_message_element *el = 
ldb_msg_find_element(ares->message, "contextCSN");
                if (el) {
@@ -618,6 +626,7 @@ static int get_seq(struct ldb_request *req,
                return ldb_request_done(req, LDB_SUCCESS);
        }
 
+       talloc_free(ares);
        return LDB_SUCCESS;
 }
 
@@ -626,7 +635,7 @@ static int entryuuid_sequence_number(struct ldb_module 
*module, struct ldb_reque
        int ret;
        struct map_private *map_private;
        struct entryuuid_private *entryuuid_private;
-       unsigned long long seq = 0;
+       unsigned long long seq_num = 0;
        struct ldb_request *search_req;
 
        const struct ldb_control *partition_ctrl;
@@ -636,6 +645,12 @@ static int entryuuid_sequence_number(struct ldb_module 
*module, struct ldb_reque
                "contextCSN", NULL
        };
 
+       struct ldb_seqnum_request *seq;
+       struct ldb_seqnum_result *seqr;
+       struct ldb_extended *ext;
+
+       seq = talloc_get_type(req->op.extended.data, struct ldb_seqnum_request);
+
        map_private = talloc_get_type(module->private_data, struct map_private);
 
        entryuuid_private = talloc_get_type(map_private->caller_private, struct 
entryuuid_private);
@@ -655,7 +670,7 @@ static int entryuuid_sequence_number(struct ldb_module 
*module, struct ldb_reque
        ret = ldb_build_search_req(&search_req, module->ldb, req,
                                   partition->dn, LDB_SCOPE_BASE,
                                   NULL, contextCSN_attr, NULL,
-                                  &seq, get_seq,
+                                  &seq_num, get_seq_callback,
                                   NULL);
        if (ret != LDB_SUCCESS) {
                return ret;
@@ -672,36 +687,59 @@ static int entryuuid_sequence_number(struct ldb_module 
*module, struct ldb_reque
                return ret;
        }
 
-       switch (req->op.seq_num.type) {
+       ext = talloc_zero(req, struct ldb_extended);
+       if (!ext) {
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
+       seqr = talloc_zero(req, struct ldb_seqnum_result);
+       if (seqr == NULL) {
+               talloc_free(ext);
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
+       ext->oid = LDB_EXTENDED_SEQUENCE_NUMBER;
+       ext->data = seqr;
+
+       switch (seq->type) {
        case LDB_SEQ_HIGHEST_SEQ:
-               req->op.seq_num.seq_num = seq;
+               seqr->seq_num = seq_num;
                break;
        case LDB_SEQ_NEXT:
-               req->op.seq_num.seq_num = seq;
-               req->op.seq_num.seq_num++;
+               seqr->seq_num = seq_num;
+               seqr->seq_num++;
                break;
        case LDB_SEQ_HIGHEST_TIMESTAMP:
        {
-               req->op.seq_num.seq_num = (seq >> 24);
+               seqr->seq_num = (seq_num >> 24);
                break;
        }
        }
-       req->op.seq_num.flags = 0;
-       req->op.seq_num.flags |= LDB_SEQ_TIMESTAMP_SEQUENCE;
-       req->op.seq_num.flags |= LDB_SEQ_GLOBAL_SEQUENCE;
-       return LDB_SUCCESS;
+       seqr->flags = 0;
+       seqr->flags |= LDB_SEQ_TIMESTAMP_SEQUENCE;
+       seqr->flags |= LDB_SEQ_GLOBAL_SEQUENCE;
+
+       /* send request done */
+       return ldb_module_done(req, NULL, ext, LDB_SUCCESS);
+}
+
+static int entryuuid_extended(struct ldb_module *module, struct ldb_request 
*req)
+{
+       if (strcmp(req->op.extended.oid, LDB_EXTENDED_SEQUENCE_NUMBER) == 0) {
+               return entryuuid_sequence_number(module, req);
+       }
+
+       return ldb_next_request(module, req);
 }
 
 _PUBLIC_ const struct ldb_module_ops ldb_entryuuid_module_ops = {
        .name              = "entryuuid",
        .init_context      = entryuuid_init,
-       .sequence_number   = entryuuid_sequence_number,
+       .extended          = entryuuid_extended,
        LDB_MAP_OPS
 };
 
 _PUBLIC_ const struct ldb_module_ops ldb_nsuniqueid_module_ops = {
        .name              = "nsuniqueid",
        .init_context      = nsuniqueid_init,
-       .sequence_number   = entryuuid_sequence_number,
+       .extended          = entryuuid_extended,
        LDB_MAP_OPS
 };
diff --git a/source4/lib/ldb/common/ldb.c b/source4/lib/ldb/common/ldb.c
index 75c8109..c013565 100644
--- a/source4/lib/ldb/common/ldb.c
+++ b/source4/lib/ldb/common/ldb.c
@@ -527,10 +527,6 @@ int ldb_request(struct ldb_context *ldb, struct 
ldb_request *req)
                FIRST_OP(ldb, extended);
                ret = module->ops->extended(module, req);
                break;
-       case LDB_SEQUENCE_NUMBER:
-               FIRST_OP(ldb, sequence_number);
-               ret = module->ops->sequence_number(module, req);
-               break;


-- 
Samba Shared Repository

Reply via email to