s3:dbwrap_ctdb: return the number of records in db_ctdb_traverse() for persistent dbs
authorStefan Metzmacher <metze@samba.org>
Fri, 14 Oct 2011 14:11:06 +0000 (16:11 +0200)
committerKarolin Seeger <kseeger@samba.org>
Sat, 18 Feb 2012 18:44:38 +0000 (19:44 +0100)
metze

Autobuild-User: Stefan Metzmacher <metze@samba.org>
Autobuild-Date: Fri Oct 14 20:59:37 CEST 2011 on sn-devel-104
(cherry picked from commit 15b8efeae3b0133ae60a8ce582e4ca4d4dbe6bb1)

The last 4 patches address bug #8527 (db_ctdb_traverse fails to traverse records
created within the current transaction).

source3/lib/dbwrap_ctdb.c

index 7481d88345ed4ec1e90773cec0696fe0c63036c6..2c68f211e81e63594c1cf4e62c8c5f7c4494fbc0 100644 (file)
@@ -1278,12 +1278,21 @@ static int db_ctdb_traverse(struct db_context *db,
                        return ret;
                }
                if (ctx->transaction && ctx->transaction->m_write) {
-                       /* we now have to handle keys not yet present at transaction start */
+                       /*
+                        * we now have to handle keys not yet
+                        * present at transaction start
+                        */
                        struct db_context *newkeys = db_open_rbt(talloc_tos());
                        struct ctdb_marshall_buffer *mbuf = ctx->transaction->m_write;
                        struct ctdb_rec_data *rec=NULL;
                        NTSTATUS status;
                        int i;
+                       int count = 0;
+
+                       if (newkeys == NULL) {
+                               return -1;
+                       }
+
                        for (i=0; i<mbuf->count; i++) {
                                TDB_DATA key;
                                rec =db_ctdb_marshall_loop_next(mbuf, rec,
@@ -1298,9 +1307,12 @@ static int db_ctdb_traverse(struct db_context *db,
                        status = dbwrap_traverse(newkeys,
                                                 traverse_persistent_callback_dbwrap,
                                                 &state,
-                                                NULL);
-                       ret = NT_STATUS_IS_OK(status) ? 0 : -1;
+                                                &count);
                        talloc_free(newkeys);
+                       if (!NT_STATUS_IS_OK(status)) {
+                               return -1;
+                       }
+                       ret += count;
                }
                return ret;
        }