------------------------------------------------------------
revno: 650
revision-id: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
committer: Andrew Tridgell <[EMAIL PROTECTED]>
branch nick: s3-ctdb-tridge
timestamp: Thu 2007-10-18 14:12:24 +1000
message:
  in ctdb traversals we can skip talking to the ctdb daemon if its a persistent 
database
modified:
  source/lib/dbwrap_ctdb.c       dbwrap_ctdb.c-20070415131935-89u7zduywa3g216g-1
=== modified file 'source/lib/dbwrap_ctdb.c'
--- a/source/lib/dbwrap_ctdb.c  2007-10-05 01:48:34 +0000
+++ b/source/lib/dbwrap_ctdb.c  2007-10-18 04:12:24 +0000
@@ -318,6 +318,22 @@
        talloc_free(tmp_ctx);
 }
 
+static int traverse_persistent_callback(TDB_CONTEXT *tdb, TDB_DATA kbuf, 
TDB_DATA dbuf,
+                                       void *private_data)
+{
+       struct traverse_state *state = (struct traverse_state *)private_data;
+       struct db_record *rec;
+       TALLOC_CTX *tmp_ctx = talloc_new(state->db);
+       int ret = 0;
+       /* we have to give them a locked record to prevent races */
+       rec = db_ctdb_fetch_locked(state->db, tmp_ctx, kbuf);
+       if (rec && rec->value.dsize > 0) {
+               ret = state->fn(rec, state->private_data);
+       }
+       talloc_free(tmp_ctx);
+       return ret;
+}
+
 static int db_ctdb_traverse(struct db_context *db,
                            int (*fn)(struct db_record *rec,
                                      void *private_data),
@@ -331,6 +347,13 @@
        state.fn = fn;
        state.private_data = private_data;
 
+       if (db->persistent) {
+               /* for persistent databases we don't need to do a ctdb traverse,
+                  we can do a faster local traverse */
+               return tdb_traverse(ctx->wtdb->tdb, 
traverse_persistent_callback, &state);
+       }
+
+
        ctdbd_traverse(ctx->db_id, traverse_callback, &state);
        return 0;
 }
@@ -357,6 +380,19 @@
        state->fn(&rec, state->private_data);
 }
 
+static int traverse_persistent_callback_read(TDB_CONTEXT *tdb, TDB_DATA kbuf, 
TDB_DATA dbuf,
+                                       void *private_data)
+{
+       struct traverse_state *state = (struct traverse_state *)private_data;
+       struct db_record rec;
+       rec.key = kbuf;
+       rec.value = dbuf;
+       rec.store = db_ctdb_store_deny;
+       rec.delete_rec = db_ctdb_delete_deny;
+       rec.private_data = state->db;
+       return state->fn(&rec, state->private_data);
+}
+
 static int db_ctdb_traverse_read(struct db_context *db,
                                 int (*fn)(struct db_record *rec,
                                           void *private_data),
@@ -370,6 +406,12 @@
        state.fn = fn;
        state.private_data = private_data;
 
+       if (db->persistent) {
+               /* for persistent databases we don't need to do a ctdb traverse,
+                  we can do a faster local traverse */
+               return tdb_traverse_read(ctx->wtdb->tdb, 
traverse_persistent_callback_read, &state);
+       }
+
        ctdbd_traverse(ctx->db_id, traverse_read_callback, &state);
        return 0;
 }

Reply via email to