From b24f8e2ae5ac22fc2e5dbfebebf9c5fa2f338588 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 1 Mar 2011 23:19:19 +1030 Subject: [PATCH] tdb2: remove tdb_traverse_read It's not actually different from tdb_traverse(). We can re-add it later if it makes sense. --- ccan/tdb2/hash.c | 14 +++--- ccan/tdb2/private.h | 16 +++--- ccan/tdb2/tdb2.h | 4 -- ccan/tdb2/test/run-firstkey-nextkey.c | 4 +- ccan/tdb2/test/run-remap-in-read_traverse.c | 4 +- ccan/tdb2/test/run-traverse.c | 55 +-------------------- ccan/tdb2/traverse.c | 27 ++-------- 7 files changed, 26 insertions(+), 98 deletions(-) diff --git a/ccan/tdb2/hash.c b/ccan/tdb2/hash.c index 17601c0c..afa5b745 100644 --- a/ccan/tdb2/hash.c +++ b/ccan/tdb2/hash.c @@ -678,7 +678,7 @@ again: } /* Return 1 if we find something, 0 if not, -1 on error. */ -int next_in_hash(struct tdb_context *tdb, int ltype, +int next_in_hash(struct tdb_context *tdb, struct traverse_info *tinfo, TDB_DATA *kbuf, size_t *dlen) { @@ -689,7 +689,7 @@ int next_in_hash(struct tdb_context *tdb, int ltype, hl_start = (tdb_off_t)tinfo->toplevel_group << (64 - group_bits); hl_range = 1ULL << group_bits; - if (tdb_lock_hashes(tdb, hl_start, hl_range, ltype, + if (tdb_lock_hashes(tdb, hl_start, hl_range, F_RDLCK, TDB_LOCK_WAIT) != 0) return -1; @@ -699,7 +699,7 @@ int next_in_hash(struct tdb_context *tdb, int ltype, if (tdb_read_convert(tdb, off, &rec, sizeof(rec))) { tdb_unlock_hashes(tdb, - hl_start, hl_range, ltype); + hl_start, hl_range, F_RDLCK); return -1; } if (rec_magic(&rec) != TDB_USED_MAGIC) { @@ -725,11 +725,11 @@ int next_in_hash(struct tdb_context *tdb, int ltype, off + sizeof(rec), kbuf->dsize); } - tdb_unlock_hashes(tdb, hl_start, hl_range, ltype); + tdb_unlock_hashes(tdb, hl_start, hl_range, F_RDLCK); return kbuf->dptr ? 1 : -1; } - tdb_unlock_hashes(tdb, hl_start, hl_range, ltype); + tdb_unlock_hashes(tdb, hl_start, hl_range, F_RDLCK); tinfo->toplevel_group++; tinfo->levels[0].hashtable @@ -740,7 +740,7 @@ int next_in_hash(struct tdb_context *tdb, int ltype, } /* Return 1 if we find something, 0 if not, -1 on error. */ -int first_in_hash(struct tdb_context *tdb, int ltype, +int first_in_hash(struct tdb_context *tdb, struct traverse_info *tinfo, TDB_DATA *kbuf, size_t *dlen) { @@ -751,7 +751,7 @@ int first_in_hash(struct tdb_context *tdb, int ltype, tinfo->levels[0].entry = 0; tinfo->levels[0].total_buckets = (1 << TDB_HASH_GROUP_BITS); - return next_in_hash(tdb, ltype, tinfo, kbuf, dlen); + return next_in_hash(tdb, tinfo, kbuf, dlen); } /* Even if the entry isn't in this hash bucket, you'd have to lock this diff --git a/ccan/tdb2/private.h b/ccan/tdb2/private.h index 69fd40fc..3366aea2 100644 --- a/ccan/tdb2/private.h +++ b/ccan/tdb2/private.h @@ -382,6 +382,14 @@ struct tdb_methods { /* hash.c: */ void tdb_hash_init(struct tdb_context *tdb); +int first_in_hash(struct tdb_context *tdb, + struct traverse_info *tinfo, + TDB_DATA *kbuf, size_t *dlen); + +int next_in_hash(struct tdb_context *tdb, + struct traverse_info *tinfo, + TDB_DATA *kbuf, size_t *dlen); + /* Hash random memory. */ uint64_t tdb_hash(struct tdb_context *tdb, const void *ptr, size_t len); @@ -538,14 +546,6 @@ bool tdb_has_expansion_lock(struct tdb_context *tdb); /* If it needs recovery, grab all the locks and do it. */ int tdb_lock_and_recover(struct tdb_context *tdb); -/* traverse.c: */ -int first_in_hash(struct tdb_context *tdb, int ltype, - struct traverse_info *tinfo, - TDB_DATA *kbuf, size_t *dlen); -int next_in_hash(struct tdb_context *tdb, int ltype, - struct traverse_info *tinfo, - TDB_DATA *kbuf, size_t *dlen); - /* transaction.c: */ int tdb_transaction_recover(struct tdb_context *tdb); bool tdb_needs_recovery(struct tdb_context *tdb); diff --git a/ccan/tdb2/tdb2.h b/ccan/tdb2/tdb2.h index 3374e0ca..23f57f84 100644 --- a/ccan/tdb2/tdb2.h +++ b/ccan/tdb2/tdb2.h @@ -377,10 +377,6 @@ char *tdb_summary(struct tdb_context *tdb, enum tdb_summary_flags flags); -int64_t tdb_traverse_read(struct tdb_context *tdb, - tdb_traverse_func fn, void *p); - - /** * enum tdb_attribute_type - descriminator for union tdb_attribute. */ diff --git a/ccan/tdb2/test/run-firstkey-nextkey.c b/ccan/tdb2/test/run-firstkey-nextkey.c index d07745f9..a71e1a7a 100644 --- a/ccan/tdb2/test/run-firstkey-nextkey.c +++ b/ccan/tdb2/test/run-firstkey-nextkey.c @@ -110,11 +110,11 @@ int main(int argc, char *argv[]) ok1(store_records(tdb)); td.calls = 0; - num = tdb_traverse_read(tdb, trav, &td); + num = tdb_traverse(tdb, trav, &td); ok1(num == NUM_RECORDS); ok1(td.calls == NUM_RECORDS); - /* Simple loop should match tdb_traverse_read */ + /* Simple loop should match tdb_traverse */ for (j = 0, k = tdb_firstkey(tdb); j < td.calls; j++) { int val; diff --git a/ccan/tdb2/test/run-remap-in-read_traverse.c b/ccan/tdb2/test/run-remap-in-read_traverse.c index fbca83da..5c473cbe 100644 --- a/ccan/tdb2/test/run-remap-in-read_traverse.c +++ b/ccan/tdb2/test/run-remap-in-read_traverse.c @@ -52,8 +52,8 @@ int main(int argc, char *argv[]) ok1(external_agent_operation(agent, OPEN, filename) == SUCCESS); i = add_records_to_grow(agent, tdb->fd, tdb->map_size); - /* Do a read traverse. */ - ok1(tdb_traverse_read(tdb, NULL, NULL) == i); + /* Do a traverse. */ + ok1(tdb_traverse(tdb, NULL, NULL) == i); /* Now store something! */ ok1(tdb_store(tdb, d, d, TDB_INSERT) == 0); diff --git a/ccan/tdb2/test/run-traverse.c b/ccan/tdb2/test/run-traverse.c index 02335d6a..5d35db48 100644 --- a/ccan/tdb2/test/run-traverse.c +++ b/ccan/tdb2/test/run-traverse.c @@ -119,7 +119,7 @@ int main(int argc, char *argv[]) hattr.base.next = &tap_log_attr; - plan_tests(sizeof(flags) / sizeof(flags[0]) * 53 + 1); + plan_tests(sizeof(flags) / sizeof(flags[0]) * 32 + 1); for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) { tdb = tdb_open("run-traverse.tdb", flags[i], O_RDWR|O_CREAT|O_TRUNC, 0600, &hattr); @@ -127,30 +127,12 @@ int main(int argc, char *argv[]) if (!tdb) continue; - ok1(tdb_traverse_read(tdb, NULL, NULL) == 0); ok1(tdb_traverse(tdb, NULL, NULL) == 0); ok1(store_records(tdb)); - num = tdb_traverse_read(tdb, NULL, NULL); - ok1(num == NUM_RECORDS); num = tdb_traverse(tdb, NULL, NULL); ok1(num == NUM_RECORDS); - /* Full traverse (read-only). */ - td.calls = 0; - td.call_limit = UINT_MAX; - td.low = INT_MAX; - td.high = INT_MIN; - td.mismatch = false; - td.delete = false; - - num = tdb_traverse_read(tdb, trav, &td); - ok1(num == NUM_RECORDS); - ok1(!td.mismatch); - ok1(td.calls == NUM_RECORDS); - ok1(td.low == 0); - ok1(td.high == NUM_RECORDS-1); - /* Full traverse. */ td.calls = 0; td.call_limit = UINT_MAX; @@ -183,38 +165,6 @@ int main(int argc, char *argv[]) ok1(tdb_check(tdb, NULL, NULL) == 0); ok1(tap_log_messages == 0); - /* Growing traverse. Expect failure on r/o traverse. */ - tgd.calls = 0; - tgd.num_large = 0; - tgd.mismatch = false; - tgd.error = TDB_SUCCESS; - num = tdb_traverse_read(tdb, trav_grow, &tgd); - ok1(num == 1); - ok1(tgd.error == TDB_ERR_RDONLY); - ok1(tgd.calls == 1); - ok1(!tgd.mismatch); - ok1(tap_log_messages == 1); - tap_log_messages = 0; - ok1(tdb_check(tdb, NULL, NULL) == 0); - - /* Deleting traverse. Expect failure on r/o traverse. */ - td.calls = 0; - td.call_limit = UINT_MAX; - td.low = INT_MAX; - td.high = INT_MIN; - td.mismatch = false; - td.delete = true; - td.delete_error = TDB_SUCCESS; - num = tdb_traverse_read(tdb, trav, &td); - ok1(num == 1); - ok1(td.delete_error == TDB_ERR_RDONLY); - ok1(!td.mismatch); - ok1(td.calls == 1); - ok1(td.low == td.high); - ok1(tap_log_messages == 1); - tap_log_messages = 0; - ok1(tdb_check(tdb, NULL, NULL) == 0); - /* Deleting traverse (delete everything). */ td.calls = 0; td.call_limit = UINT_MAX; @@ -233,12 +183,11 @@ int main(int argc, char *argv[]) ok1(tdb_check(tdb, NULL, NULL) == 0); /* Now it's empty! */ - ok1(tdb_traverse_read(tdb, NULL, NULL) == 0); ok1(tdb_traverse(tdb, NULL, NULL) == 0); /* Re-add. */ ok1(store_records(tdb)); - ok1(tdb_traverse_read(tdb, NULL, NULL) == NUM_RECORDS); + ok1(tdb_traverse(tdb, NULL, NULL) == NUM_RECORDS); ok1(tdb_check(tdb, NULL, NULL) == 0); /* Grow. This will cause us to be reshuffled. */ diff --git a/ccan/tdb2/traverse.c b/ccan/tdb2/traverse.c index b79cc8b4..9c71d0d1 100644 --- a/ccan/tdb2/traverse.c +++ b/ccan/tdb2/traverse.c @@ -18,8 +18,7 @@ #include "private.h" #include -static int64_t traverse(struct tdb_context *tdb, int ltype, - tdb_traverse_func fn, void *p) +int64_t tdb_traverse(struct tdb_context *tdb, tdb_traverse_func fn, void *p) { int ret; struct traverse_info tinfo; @@ -27,9 +26,9 @@ static int64_t traverse(struct tdb_context *tdb, int ltype, int64_t count = 0; k.dptr = NULL; - for (ret = first_in_hash(tdb, ltype, &tinfo, &k, &d.dsize); + for (ret = first_in_hash(tdb, &tinfo, &k, &d.dsize); ret == 1; - ret = next_in_hash(tdb, ltype, &tinfo, &k, &d.dsize)) { + ret = next_in_hash(tdb, &tinfo, &k, &d.dsize)) { d.dptr = k.dptr + k.dsize; count++; @@ -44,28 +43,12 @@ static int64_t traverse(struct tdb_context *tdb, int ltype, return -1; return count; } - -int64_t tdb_traverse(struct tdb_context *tdb, tdb_traverse_func fn, void *p) -{ - return traverse(tdb, F_WRLCK, fn, p); -} -int64_t tdb_traverse_read(struct tdb_context *tdb, - tdb_traverse_func fn, void *p) -{ - int64_t ret; - bool was_ro = tdb->read_only; - tdb->read_only = true; - ret = traverse(tdb, F_RDLCK, fn, p); - tdb->read_only = was_ro; - return ret; -} - TDB_DATA tdb_firstkey(struct tdb_context *tdb) { struct traverse_info tinfo; struct tdb_data k; - switch (first_in_hash(tdb, F_RDLCK, &tinfo, &k, NULL)) { + switch (first_in_hash(tdb, &tinfo, &k, NULL)) { case 1: return k; case 0: @@ -88,7 +71,7 @@ TDB_DATA tdb_nextkey(struct tdb_context *tdb, TDB_DATA key) return tdb_null; tdb_unlock_hashes(tdb, h.hlock_start, h.hlock_range, F_RDLCK); - switch (next_in_hash(tdb, F_RDLCK, &tinfo, &key, NULL)) { + switch (next_in_hash(tdb, &tinfo, &key, NULL)) { case 1: return key; case 0: -- 2.39.2