diff options
-rw-r--r-- | source3/lib/dbwrap/dbwrap_ctdb.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c index 7df025f9bb..7bb206bea5 100644 --- a/source3/lib/dbwrap/dbwrap_ctdb.c +++ b/source3/lib/dbwrap/dbwrap_ctdb.c @@ -1283,6 +1283,7 @@ struct traverse_state { struct db_context *db; int (*fn)(struct db_record *rec, void *private_data); void *private_data; + int count; }; static void traverse_callback(TDB_DATA key, TDB_DATA data, void *private_data) @@ -1339,6 +1340,7 @@ static int db_ctdb_traverse(struct db_context *db, void *private_data), void *private_data) { + NTSTATUS status; struct db_ctdb_ctx *ctx = talloc_get_type_abort(db->private_data, struct db_ctdb_ctx); struct traverse_state state; @@ -1346,6 +1348,7 @@ static int db_ctdb_traverse(struct db_context *db, state.db = db; state.fn = fn; state.private_data = private_data; + state.count = 0; if (db->persistent) { struct tdb_context *ltdb = ctx->wtdb->tdb; @@ -1365,7 +1368,6 @@ static int db_ctdb_traverse(struct db_context *db, 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; @@ -1397,9 +1399,11 @@ static int db_ctdb_traverse(struct db_context *db, return ret; } - - ctdbd_traverse(ctx->db_id, traverse_callback, &state); - return 0; + status = ctdbd_traverse(ctx->db_id, traverse_callback, &state); + if (!NT_STATUS_IS_OK(status)) { + return -1; + } + return state.count; } static NTSTATUS db_ctdb_store_deny(struct db_record *rec, TDB_DATA data, int flag) @@ -1422,6 +1426,7 @@ static void traverse_read_callback(TDB_DATA key, TDB_DATA data, void *private_da rec.delete_rec = db_ctdb_delete_deny; rec.private_data = state->db; state->fn(&rec, state->private_data); + state->count++; } static int traverse_persistent_callback_read(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, @@ -1453,6 +1458,7 @@ static int traverse_persistent_callback_read(TDB_CONTEXT *tdb, TDB_DATA kbuf, TD rec.value.dsize -= sizeof(struct ctdb_ltdb_header); rec.value.dptr += sizeof(struct ctdb_ltdb_header); + state->count++; return state->fn(&rec, state->private_data); } @@ -1461,6 +1467,7 @@ static int db_ctdb_traverse_read(struct db_context *db, void *private_data), void *private_data) { + NTSTATUS status; struct db_ctdb_ctx *ctx = talloc_get_type_abort(db->private_data, struct db_ctdb_ctx); struct traverse_state state; @@ -1468,6 +1475,7 @@ static int db_ctdb_traverse_read(struct db_context *db, state.db = db; state.fn = fn; state.private_data = private_data; + state.count = 0; if (db->persistent) { /* for persistent databases we don't need to do a ctdb traverse, @@ -1475,8 +1483,11 @@ static int db_ctdb_traverse_read(struct db_context *db, return tdb_traverse_read(ctx->wtdb->tdb, traverse_persistent_callback_read, &state); } - ctdbd_traverse(ctx->db_id, traverse_read_callback, &state); - return 0; + status = ctdbd_traverse(ctx->db_id, traverse_read_callback, &state); + if (!NT_STATUS_IS_OK(status)) { + return -1; + } + return state.count; } static int db_ctdb_get_seqnum(struct db_context *db) |