The branch, master has been updated
       via  f4e25ec lib: Use tdb_storev in gencache
       via  4d9ff07 dbwrap: Use tdb_storev in dbwrap_ctdb
       via  c27c7d4 tdb: Use tdb_storev in tdb_append
       via  504b04b tdb: Add tdb_storev
       via  647e61b tdb: Add tdb_trace_1plusn_rec_flag_ret
       via  37e644f tdb: Vectorize _tdb_store
       via  f6f4e5e tdb: Vectorize tdb_update_hash
       via  6295080 tdb: Allow _v variant in tdb_update_hash_cmp
       via  babd543 tdb: Remove unnecessary checks
       via  4913180 tdb: Do an overflow check
       via  6dc4e29 tdb: Fix a signed/unsigned hickup
       via  28f2849 dbwrap_watch: Add dsize to DEBUG, avoid casts
      from  db32a0e dbcheck: Abandon dbcheck if we get an error during a 
transaction

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


- Log -----------------------------------------------------------------
commit f4e25ec9635d7ea61db011e7ad685b1e0ae61db9
Author: Volker Lendecke <v...@samba.org>
Date:   Fri Aug 12 20:57:26 2016 +0200

    lib: Use tdb_storev in gencache
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>
    
    Autobuild-User(master): Ralph Böhme <s...@samba.org>
    Autobuild-Date(master): Mon Aug 29 22:51:34 CEST 2016 on sn-devel-144

commit 4d9ff07150d316db081d412e958e46bf4b432a05
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Aug 10 21:12:06 2016 +0200

    dbwrap: Use tdb_storev in dbwrap_ctdb
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit c27c7d44fb89c08addc5280944c88787bf18c075
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Aug 10 20:57:42 2016 +0200

    tdb: Use tdb_storev in tdb_append
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 504b04b817d9bc46b638fbf2335fbcac1ed6ce93
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Aug 10 20:46:07 2016 +0200

    tdb: Add tdb_storev
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 647e61b0e8807d3f1f61f5a82cbe761691b61edb
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Aug 10 20:45:10 2016 +0200

    tdb: Add tdb_trace_1plusn_rec_flag_ret
    
    Needed for tdb_storev
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 37e644fc20bb77c486d973ed66c7e21ea055a5e1
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Aug 10 14:11:03 2016 +0200

    tdb: Vectorize _tdb_store
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit f6f4e5e6b590d41d7c411e3e406cc629d59f156a
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Aug 10 13:47:49 2016 +0200

    tdb: Vectorize tdb_update_hash
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 629508036113ce3afa5056857716d97ad5a3251d
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Aug 10 12:37:13 2016 +0200

    tdb: Allow _v variant in tdb_update_hash_cmp
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit babd5432ed91dec1b64b966e2a6633b9642a82d5
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Aug 10 11:31:44 2016 +0200

    tdb: Remove unnecessary checks
    
    This has already been done in tdb_find()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 4913180aada29a6118d19f27f3521b8456c5c912
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Aug 10 10:49:04 2016 +0200

    tdb: Do an overflow check
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 6dc4e294a51532fb4550ac68b4c3f5a5a9bcbf1b
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Aug 10 10:16:05 2016 +0200

    tdb: Fix a signed/unsigned hickup
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

commit 28f2849584d550403117004348b7370530a549a7
Author: Volker Lendecke <v...@samba.org>
Date:   Mon Jul 25 12:59:46 2016 +0200

    dbwrap_watch: Add dsize to DEBUG, avoid casts
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>

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

Summary of changes:
 lib/tdb/ABI/{tdb-1.3.5.sigs => tdb-1.3.11.sigs} |   1 +
 lib/tdb/common/tdb.c                            | 222 +++++++++++++++++-------
 lib/tdb/common/tdb_private.h                    |   5 +
 lib/tdb/include/tdb.h                           |  26 +++
 lib/tdb/wscript                                 |   2 +-
 source3/lib/dbwrap/dbwrap_ctdb.c                |  18 +-
 source3/lib/dbwrap/dbwrap_watch.c               |   6 +-
 source3/lib/gencache.c                          |  19 +-
 8 files changed, 208 insertions(+), 91 deletions(-)
 copy lib/tdb/ABI/{tdb-1.3.5.sigs => tdb-1.3.11.sigs} (97%)


Changeset truncated at 500 lines:

diff --git a/lib/tdb/ABI/tdb-1.3.5.sigs b/lib/tdb/ABI/tdb-1.3.11.sigs
similarity index 97%
copy from lib/tdb/ABI/tdb-1.3.5.sigs
copy to lib/tdb/ABI/tdb-1.3.11.sigs
index 2545c99..48f4278 100644
--- a/lib/tdb/ABI/tdb-1.3.5.sigs
+++ b/lib/tdb/ABI/tdb-1.3.11.sigs
@@ -52,6 +52,7 @@ tdb_set_logging_function: void (struct tdb_context *, const 
struct tdb_logging_c
 tdb_set_max_dead: void (struct tdb_context *, int)
 tdb_setalarm_sigptr: void (struct tdb_context *, volatile sig_atomic_t *)
 tdb_store: int (struct tdb_context *, TDB_DATA, TDB_DATA, int)
+tdb_storev: int (struct tdb_context *, TDB_DATA, const TDB_DATA *, int, int)
 tdb_summary: char *(struct tdb_context *)
 tdb_transaction_cancel: int (struct tdb_context *)
 tdb_transaction_commit: int (struct tdb_context *)
diff --git a/lib/tdb/common/tdb.c b/lib/tdb/common/tdb.c
index dd93680..a67d8fb 100644
--- a/lib/tdb/common/tdb.c
+++ b/lib/tdb/common/tdb.c
@@ -129,16 +129,32 @@ tdb_off_t tdb_find_lock_hash(struct tdb_context *tdb, 
TDB_DATA key, uint32_t has
 
 static TDB_DATA _tdb_fetch(struct tdb_context *tdb, TDB_DATA key);
 
+struct tdb_update_hash_state {
+       const TDB_DATA *dbufs;
+       int num_dbufs;
+       tdb_len_t dbufs_len;
+};
+
 static int tdb_update_hash_cmp(TDB_DATA key, TDB_DATA data, void *private_data)
 {
-       TDB_DATA *dbuf = (TDB_DATA *)private_data;
+       struct tdb_update_hash_state *state = private_data;
+       unsigned char *dptr = data.dptr;
+       int i;
 
-       if (dbuf->dsize != data.dsize) {
+       if (state->dbufs_len != data.dsize) {
                return -1;
        }
-       if (memcmp(dbuf->dptr, data.dptr, data.dsize) != 0) {
-               return -1;
+
+       for (i=0; i<state->num_dbufs; i++) {
+               TDB_DATA dbuf = state->dbufs[i];
+               int ret;
+               ret = memcmp(dptr, dbuf.dptr, dbuf.dsize);
+               if (ret != 0) {
+                       return -1;
+               }
+               dptr += dbuf.dsize;
        }
+
        return 0;
 }
 
@@ -146,10 +162,14 @@ static int tdb_update_hash_cmp(TDB_DATA key, TDB_DATA 
data, void *private_data)
    is <= the old data size and the key exists.
    on failure return -1.
 */
-static int tdb_update_hash(struct tdb_context *tdb, TDB_DATA key, uint32_t 
hash, TDB_DATA dbuf)
+static int tdb_update_hash(struct tdb_context *tdb, TDB_DATA key,
+                          uint32_t hash,
+                          const TDB_DATA *dbufs, int num_dbufs,
+                          tdb_len_t dbufs_len)
 {
        struct tdb_record rec;
-       tdb_off_t rec_ptr;
+       tdb_off_t rec_ptr, ofs;
+       int i;
 
        /* find entry */
        if (!(rec_ptr = tdb_find(tdb, key, hash, &rec)))
@@ -157,26 +177,41 @@ static int tdb_update_hash(struct tdb_context *tdb, 
TDB_DATA key, uint32_t hash,
 
        /* it could be an exact duplicate of what is there - this is
         * surprisingly common (eg. with a ldb re-index). */
-       if (rec.key_len == key.dsize &&
-           rec.data_len == dbuf.dsize &&
-           rec.full_hash == hash &&
-           tdb_parse_record(tdb, key, tdb_update_hash_cmp, &dbuf) == 0) {
-               return 0;
+       if (rec.data_len == dbufs_len) {
+               struct tdb_update_hash_state state = {
+                       .dbufs = dbufs, .num_dbufs = num_dbufs,
+                       .dbufs_len = dbufs_len
+               };
+               int ret;
+
+               ret = tdb_parse_record(tdb, key, tdb_update_hash_cmp, &state);
+               if (ret == 0) {
+                       return 0;
+               }
        }
 
        /* must be long enough key, data and tailer */
-       if (rec.rec_len < key.dsize + dbuf.dsize + sizeof(tdb_off_t)) {
+       if (rec.rec_len < key.dsize + dbufs_len + sizeof(tdb_off_t)) {
                tdb->ecode = TDB_SUCCESS; /* Not really an error */
                return -1;
        }
 
-       if (tdb->methods->tdb_write(tdb, rec_ptr + sizeof(rec) + rec.key_len,
-                     dbuf.dptr, dbuf.dsize) == -1)
-               return -1;
+       ofs = rec_ptr + sizeof(rec) + rec.key_len;
+
+       for (i=0; i<num_dbufs; i++) {
+               TDB_DATA dbuf = dbufs[i];
+               int ret;
 
-       if (dbuf.dsize != rec.data_len) {
+               ret = tdb->methods->tdb_write(tdb, ofs, dbuf.dptr, dbuf.dsize);
+               if (ret == -1) {
+                       return -1;
+               }
+               ofs += dbuf.dsize;
+       }
+
+       if (dbufs_len != rec.data_len) {
                /* update size */
-               rec.data_len = dbuf.dsize;
+               rec.data_len = dbufs_len;
                return tdb_rec_write(tdb, rec_ptr, &rec);
        }
 
@@ -491,13 +526,34 @@ tdb_off_t tdb_find_dead(struct tdb_context *tdb, uint32_t 
hash,
        return best_rec_ptr;
 }
 
-static int _tdb_store(struct tdb_context *tdb, TDB_DATA key,
-                      TDB_DATA dbuf, int flag, uint32_t hash)
+static int _tdb_storev(struct tdb_context *tdb, TDB_DATA key,
+                      const TDB_DATA *dbufs, int num_dbufs,
+                      int flag, uint32_t hash)
 {
        struct tdb_record rec;
-       tdb_off_t rec_ptr;
+       tdb_off_t rec_ptr, ofs;
+       tdb_len_t rec_len, dbufs_len;
+       int i;
        int ret = -1;
 
+       dbufs_len = 0;
+
+       for (i=0; i<num_dbufs; i++) {
+               size_t dsize = dbufs[i].dsize;
+
+               dbufs_len += dsize;
+               if (dbufs_len < dsize) {
+                       tdb->ecode = TDB_ERR_OOM;
+                       goto fail;
+               }
+       }
+
+       rec_len = key.dsize + dbufs_len;
+       if ((rec_len < key.dsize) || (rec_len < dbufs_len)) {
+               tdb->ecode = TDB_ERR_OOM;
+               goto fail;
+       }
+
        /* check for it existing, on insert. */
        if (flag == TDB_INSERT) {
                if (tdb_exists_hash(tdb, key, hash)) {
@@ -506,7 +562,8 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA key,
                }
        } else {
                /* first try in-place update, on modify or replace. */
-               if (tdb_update_hash(tdb, key, hash, dbuf) == 0) {
+               if (tdb_update_hash(tdb, key, hash, dbufs, num_dbufs,
+                                   dbufs_len) == 0) {
                        goto done;
                }
                if (tdb->ecode == TDB_ERR_NOEXIST &&
@@ -526,7 +583,7 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA key,
                tdb_delete_hash(tdb, key, hash);
 
        /* we have to allocate some space */
-       rec_ptr = tdb_allocate(tdb, hash, key.dsize + dbuf.dsize, &rec);
+       rec_ptr = tdb_allocate(tdb, hash, rec_len, &rec);
 
        if (rec_ptr == 0) {
                goto fail;
@@ -537,17 +594,36 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA 
key,
                goto fail;
 
        rec.key_len = key.dsize;
-       rec.data_len = dbuf.dsize;
+       rec.data_len = dbufs_len;
        rec.full_hash = hash;
        rec.magic = TDB_MAGIC;
 
+       ofs = rec_ptr;
+
        /* write out and point the top of the hash chain at it */
-       if (tdb_rec_write(tdb, rec_ptr, &rec) == -1
-           || tdb->methods->tdb_write(tdb, rec_ptr+sizeof(rec),
-                                      key.dptr, key.dsize) == -1
-           || tdb->methods->tdb_write(tdb, rec_ptr+sizeof(rec)+key.dsize,
-                                      dbuf.dptr, dbuf.dsize) == -1
-           || tdb_ofs_write(tdb, TDB_HASH_TOP(hash), &rec_ptr) == -1) {
+       ret = tdb_rec_write(tdb, ofs, &rec);
+       if (ret == -1) {
+               goto fail;
+       }
+       ofs += sizeof(rec);
+
+       ret = tdb->methods->tdb_write(tdb, ofs, key.dptr, key.dsize);
+       if (ret == -1) {
+               goto fail;
+       }
+       ofs += key.dsize;
+
+       for (i=0; i<num_dbufs; i++) {
+               ret = tdb->methods->tdb_write(tdb, ofs, dbufs[i].dptr,
+                                             dbufs[i].dsize);
+               if (ret == -1) {
+                       goto fail;
+               }
+               ofs += dbufs[i].dsize;
+       }
+
+       ret = tdb_ofs_write(tdb, TDB_HASH_TOP(hash), &rec_ptr);
+       if (ret == -1) {
                /* Need to tdb_unallocate() here */
                goto fail;
        }
@@ -561,6 +637,12 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA 
key,
        return ret;
 }
 
+static int _tdb_store(struct tdb_context *tdb, TDB_DATA key,
+                     TDB_DATA dbuf, int flag, uint32_t hash)
+{
+       return _tdb_storev(tdb, key, &dbuf, 1, flag, hash);
+}
+
 /* store an element in the database, replacing any existing element
    with the same key
 
@@ -588,50 +670,51 @@ _PUBLIC_ int tdb_store(struct tdb_context *tdb, TDB_DATA 
key, TDB_DATA dbuf, int
        return ret;
 }
 
-/* Append to an entry. Create if not exist. */
-_PUBLIC_ int tdb_append(struct tdb_context *tdb, TDB_DATA key, TDB_DATA 
new_dbuf)
+_PUBLIC_ int tdb_storev(struct tdb_context *tdb, TDB_DATA key,
+                       const TDB_DATA *dbufs, int num_dbufs, int flag)
 {
        uint32_t hash;
-       TDB_DATA dbuf;
-       int ret = -1;
+       int ret;
+
+       if (tdb->read_only || tdb->traverse_read) {
+               tdb->ecode = TDB_ERR_RDONLY;
+               tdb_trace_1plusn_rec_flag_ret(tdb, "tdb_storev", key,
+                                             dbufs, num_dbufs, flag, -1);
+               return -1;
+       }
 
        /* find which hash bucket it is in */
        hash = tdb->hash_fn(&key);
        if (tdb_lock(tdb, BUCKET(hash), F_WRLCK) == -1)
                return -1;
 
-       dbuf = _tdb_fetch(tdb, key);
+       ret = _tdb_storev(tdb, key, dbufs, num_dbufs, flag, hash);
+       tdb_trace_1plusn_rec_flag_ret(tdb, "tdb_storev", key,
+                                     dbufs, num_dbufs, flag, -1);
+       tdb_unlock(tdb, BUCKET(hash), F_WRLCK);
+       return ret;
+}
 
-       if (dbuf.dptr == NULL) {
-               dbuf.dptr = (unsigned char *)malloc(new_dbuf.dsize);
-       } else {
-               unsigned int new_len = dbuf.dsize + new_dbuf.dsize;
-               unsigned char *new_dptr;
-
-               /* realloc '0' is special: don't do that. */
-               if (new_len == 0)
-                       new_len = 1;
-               new_dptr = (unsigned char *)realloc(dbuf.dptr, new_len);
-               if (new_dptr == NULL) {
-                       free(dbuf.dptr);
-               }
-               dbuf.dptr = new_dptr;
-       }
+/* Append to an entry. Create if not exist. */
+_PUBLIC_ int tdb_append(struct tdb_context *tdb, TDB_DATA key, TDB_DATA 
new_dbuf)
+{
+       uint32_t hash;
+       TDB_DATA dbufs[2];
+       int ret = -1;
 
-       if (dbuf.dptr == NULL) {
-               tdb->ecode = TDB_ERR_OOM;
-               goto failed;
-       }
+       /* find which hash bucket it is in */
+       hash = tdb->hash_fn(&key);
+       if (tdb_lock(tdb, BUCKET(hash), F_WRLCK) == -1)
+               return -1;
 
-       memcpy(dbuf.dptr + dbuf.dsize, new_dbuf.dptr, new_dbuf.dsize);
-       dbuf.dsize += new_dbuf.dsize;
+       dbufs[0] = _tdb_fetch(tdb, key);
+       dbufs[1] = new_dbuf;
 
-       ret = _tdb_store(tdb, key, dbuf, 0, hash);
-       tdb_trace_2rec_retrec(tdb, "tdb_append", key, new_dbuf, dbuf);
+       ret = _tdb_storev(tdb, key, dbufs, 2, 0, hash);
+       tdb_trace_2rec_retrec(tdb, "tdb_append", key, dbufs[0], dbufs[1]);
 
-failed:
        tdb_unlock(tdb, BUCKET(hash), F_WRLCK);
-       SAFE_FREE(dbuf.dptr);
+       SAFE_FREE(dbufs[0].dptr);
        return ret;
 }
 
@@ -790,7 +873,7 @@ static int tdb_free_region(struct tdb_context *tdb, 
tdb_off_t offset, ssize_t le
  */
 _PUBLIC_ int tdb_wipe_all(struct tdb_context *tdb)
 {
-       int i;
+       uint32_t i;
        tdb_off_t offset = 0;
        ssize_t data_len;
        tdb_off_t recovery_head;
@@ -1132,6 +1215,25 @@ void tdb_trace_2rec_flag_ret(struct tdb_context *tdb, 
const char *op,
        tdb_trace_end_ret(tdb, ret);
 }
 
+void tdb_trace_1plusn_rec_flag_ret(struct tdb_context *tdb, const char *op,
+                                  TDB_DATA rec,
+                                  const TDB_DATA *recs, int num_recs,
+                                  unsigned flag, int ret)
+{
+       char msg[1 + sizeof(ret) * 4];
+       int i;
+
+       snprintf(msg, sizeof(msg), " %#x", flag);
+       tdb_trace_start(tdb);
+       tdb_trace_write(tdb, op);
+       tdb_trace_record(tdb, rec);
+       for (i=0; i<num_recs; i++) {
+               tdb_trace_record(tdb, recs[i]);
+       }
+       tdb_trace_write(tdb, msg);
+       tdb_trace_end_ret(tdb, ret);
+}
+
 void tdb_trace_2rec_retrec(struct tdb_context *tdb, const char *op,
                           TDB_DATA rec1, TDB_DATA rec2, TDB_DATA ret)
 {
diff --git a/lib/tdb/common/tdb_private.h b/lib/tdb/common/tdb_private.h
index de8d9e6..7ff29aa 100644
--- a/lib/tdb/common/tdb_private.h
+++ b/lib/tdb/common/tdb_private.h
@@ -96,6 +96,10 @@ void tdb_trace_1rec_retrec(struct tdb_context *tdb, const 
char *op,
 void tdb_trace_2rec_flag_ret(struct tdb_context *tdb, const char *op,
                             TDB_DATA rec1, TDB_DATA rec2, unsigned flag,
                             int ret);
+void tdb_trace_1plusn_rec_flag_ret(struct tdb_context *tdb, const char *op,
+                                  TDB_DATA rec,
+                                  const TDB_DATA *recs, int num_recs,
+                                  unsigned flag, int ret);
 void tdb_trace_2rec_retrec(struct tdb_context *tdb, const char *op,
                           TDB_DATA rec1, TDB_DATA rec2, TDB_DATA ret);
 #else
@@ -108,6 +112,7 @@ void tdb_trace_2rec_retrec(struct tdb_context *tdb, const 
char *op,
 #define tdb_trace_1rec_ret(tdb, op, rec, ret)
 #define tdb_trace_1rec_retrec(tdb, op, rec, ret)
 #define tdb_trace_2rec_flag_ret(tdb, op, rec1, rec2, flag, ret)
+#define tdb_trace_1plusn_rec_flag_ret(tdb, op, rec, recs, num_recs, flag, ret);
 #define tdb_trace_2rec_retrec(tdb, op, rec1, rec2, ret)
 #endif /* !TDB_TRACE */
 
diff --git a/lib/tdb/include/tdb.h b/lib/tdb/include/tdb.h
index 8478ca2..e86d267 100644
--- a/lib/tdb/include/tdb.h
+++ b/lib/tdb/include/tdb.h
@@ -357,6 +357,32 @@ int tdb_delete(struct tdb_context *tdb, TDB_DATA key);
  */
 int tdb_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, int flag);
 
+
+/**
+ * @brief Store an element in the database.
+ *
+ * This replaces any existing element with the same key.
+ *
+ * @param[in]  tdb      The tdb to store the entry.
+ *
+ * @param[in]  key      The key to use to store the entry.
+ *
+ * @param[in]  dbufs    A vector of memory chunks to write
+ *
+ * @param[in]  num_dbufs Length of the dbufs vector
+ *
+ * @param[in]  flag     The flags to store the key:\n\n
+ *                      TDB_INSERT: Don't overwrite an existing entry.\n
+ *                      TDB_MODIFY: Don't create a new entry\n
+ *
+ * @return              0 on success, -1 on error with error code set.
+ *
+ * @see tdb_error()
+ * @see tdb_errorstr()
+ */
+int tdb_storev(struct tdb_context *tdb, TDB_DATA key,
+              const TDB_DATA *dbufs, int num_dbufs, int flag);
+
 /**
  * @brief Append data to an entry.
  *
diff --git a/lib/tdb/wscript b/lib/tdb/wscript
index c854a21..4e52b6c 100644
--- a/lib/tdb/wscript
+++ b/lib/tdb/wscript
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 APPNAME = 'tdb'
-VERSION = '1.3.10'
+VERSION = '1.3.11'
 
 blddir = 'bin'
 
diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c
index 10f5f50..34aad45 100644
--- a/source3/lib/dbwrap/dbwrap_ctdb.c
+++ b/source3/lib/dbwrap/dbwrap_ctdb.c
@@ -128,22 +128,14 @@ static NTSTATUS db_ctdb_ltdb_store(struct db_ctdb_ctx *db,
                                   struct ctdb_ltdb_header *header,
                                   TDB_DATA data)
 {
-       TDB_DATA rec;
+       TDB_DATA recs[2];
        int ret;
 
-       rec.dsize = data.dsize + sizeof(struct ctdb_ltdb_header);
-       rec.dptr = (uint8_t *)talloc_size(talloc_tos(), rec.dsize);
-
-       if (rec.dptr == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       memcpy(rec.dptr, header, sizeof(struct ctdb_ltdb_header));
-       memcpy(sizeof(struct ctdb_ltdb_header) + (uint8_t *)rec.dptr, 
data.dptr, data.dsize);
-
-       ret = tdb_store(db->wtdb->tdb, key, rec, TDB_REPLACE);
+       recs[0] = (TDB_DATA) { .dptr = (uint8_t *)header,
+                              .dsize = sizeof(struct ctdb_ltdb_header) };
+       recs[1] = data;
 
-       talloc_free(rec.dptr);
+       ret = tdb_storev(db->wtdb->tdb, key, recs, 2, TDB_REPLACE);
 
        return (ret == 0) ? NT_STATUS_OK
                          : tdb_error_to_ntstatus(db->wtdb->tdb);
diff --git a/source3/lib/dbwrap/dbwrap_watch.c 
b/source3/lib/dbwrap/dbwrap_watch.c
index acc0f1a..00c332f 100644
--- a/source3/lib/dbwrap/dbwrap_watch.c
+++ b/source3/lib/dbwrap/dbwrap_watch.c
@@ -66,13 +66,13 @@ static bool dbwrap_record_watchers_key_parse(
        size_t db_id_len;
 
        if (wkey.dsize < sizeof(uint32_t)) {
-               DEBUG(1, ("Invalid watchers key\n"));
+               DBG_WARNING("Invalid watchers key, dsize=%zu\n", wkey.dsize);
                return false;
        }
        db_id_len = IVAL(wkey.dptr, 0);
        if (db_id_len > (wkey.dsize - sizeof(uint32_t))) {
-               DEBUG(1, ("Invalid watchers key, wkey.dsize=%d, "
-                         "db_id_len=%d\n", (int)wkey.dsize, (int)db_id_len));
+               DBG_WARNING("Invalid watchers key, wkey.dsize=%zu, "
+                           "db_id_len=%zu\n", wkey.dsize, db_id_len);
                return false;
        }
        if (p_db_id != NULL) {
diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c
index 84d273e..5af6eb8 100644
--- a/source3/lib/gencache.c
+++ b/source3/lib/gencache.c
@@ -278,9 +278,9 @@ bool gencache_set_data_blob(const char *keystr, const 
DATA_BLOB *blob,
        int ret;
        fstring hdr;
        int hdr_len;
-       char* val;
        time_t last_stabilize;
        static int writecount;
+       TDB_DATA dbufs[2];
 
        if (tdb_data_cmp(string_term_tdb_data(keystr),
                         last_stabilize_key()) == 0) {
@@ -311,13 +311,8 @@ bool gencache_set_data_blob(const char *keystr, const 
DATA_BLOB *blob,
                return false;


-- 
Samba Shared Repository

Reply via email to