s3: Directly parse local existing records in db_ctdb_parse_record
authorVolker Lendecke <vl@samba.org>
Mon, 12 Nov 2012 12:36:48 +0000 (13:36 +0100)
committerMichael Adam <obnox@samba.org>
Thu, 29 Nov 2012 17:10:13 +0000 (18:10 +0100)
Reviewed-by: Michael Adam <obnox@samba.org>
source3/lib/dbwrap/dbwrap_ctdb.c

index 60375852302e7f64d252606b04d6ae60587d0a80..624840e746782ae567f0e1f89cb524348ff6ab0c 100644 (file)
@@ -1224,6 +1224,7 @@ static NTSTATUS db_ctdb_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
 struct db_ctdb_parse_record_state {
        void (*parser)(TDB_DATA key, TDB_DATA data, void *private_data);
        void *private_data;
+       bool done;
 };
 
 static void db_ctdb_parse_record_parser(
@@ -1235,6 +1236,19 @@ static void db_ctdb_parse_record_parser(
        state->parser(key, data, state->private_data);
 }
 
+static void db_ctdb_parse_record_parser_nonpersistent(
+       TDB_DATA key, struct ctdb_ltdb_header *header,
+       TDB_DATA data, void *private_data)
+{
+       struct db_ctdb_parse_record_state *state =
+               (struct db_ctdb_parse_record_state *)private_data;
+
+       if (db_ctdb_can_use_local_hdr(header, true)) {
+               state->parser(key, data, state->private_data);
+               state->done = true;
+       }
+}
+
 static NTSTATUS db_ctdb_parse_record(struct db_context *db, TDB_DATA key,
                                     void (*parser)(TDB_DATA key,
                                                    TDB_DATA data,
@@ -1274,6 +1288,14 @@ static NTSTATUS db_ctdb_parse_record(struct db_context *db, TDB_DATA key,
                        ctx, key, db_ctdb_parse_record_parser, &state);
        }
 
+       state.done = false;
+
+       status = db_ctdb_ltdb_parse(
+               ctx, key, db_ctdb_parse_record_parser_nonpersistent, &state);
+       if (NT_STATUS_IS_OK(status) && state.done) {
+               return NT_STATUS_OK;
+       }
+
        status = db_ctdb_fetch(db, talloc_tos(), key, &data);
        if (!NT_STATUS_IS_OK(status)) {
                return status;