From 3352e4e947777d4a90a2dd4f3037e1e494231b25 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 31 Aug 2011 15:31:06 +0930 Subject: [PATCH 1/1] tdb2: unify tdb1_parse_record into tdb_parse_record Switch on the TDB_VERSION1 flag. --- ccan/tdb2/private.h | 5 +++++ ccan/tdb2/tdb.c | 5 +++++ ccan/tdb2/tdb1.h | 5 ----- ccan/tdb2/tdb1_io.c | 18 +++++++++--------- ccan/tdb2/tdb1_private.h | 11 ++++++----- ccan/tdb2/tdb1_tdb.c | 32 +++++++------------------------- 6 files changed, 32 insertions(+), 44 deletions(-) diff --git a/ccan/tdb2/private.h b/ccan/tdb2/private.h index 3acc06a9..59badc62 100644 --- a/ccan/tdb2/private.h +++ b/ccan/tdb2/private.h @@ -665,6 +665,11 @@ enum TDB_ERROR tdb1_fetch(struct tdb_context *tdb, TDB_DATA key, int tdb1_append(struct tdb_context *tdb, TDB_DATA key, TDB_DATA new_dbuf); int tdb1_delete(struct tdb_context *tdb, TDB_DATA key); int tdb1_exists(struct tdb_context *tdb, TDB_DATA key); +enum TDB_ERROR tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key, + enum TDB_ERROR (*parser)(TDB_DATA key, + TDB_DATA data, + void *private_data), + void *private_data); /* tdb.c: */ enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb, diff --git a/ccan/tdb2/tdb.c b/ccan/tdb2/tdb.c index 5e92af8c..a3897831 100644 --- a/ccan/tdb2/tdb.c +++ b/ccan/tdb2/tdb.c @@ -526,6 +526,11 @@ enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb, struct hash_info h; enum TDB_ERROR ecode; + if (tdb->flags & TDB_VERSION1) { + return tdb->last_error = tdb1_parse_record(tdb, key, parse, + data); + } + off = find_and_lock(tdb, key, F_RDLCK, &h, &rec, NULL); if (TDB_OFF_IS_ERR(off)) { return tdb->last_error = off; diff --git a/ccan/tdb2/tdb1.h b/ccan/tdb2/tdb1.h index 75cf39d7..f0536f98 100644 --- a/ccan/tdb2/tdb1.h +++ b/ccan/tdb2/tdb1.h @@ -38,11 +38,6 @@ void tdb1_set_max_dead(struct tdb_context *tdb, int max_dead); -int tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key, - int (*parser)(TDB_DATA key, TDB_DATA data, - void *private_data), - void *private_data); - TDB_DATA tdb1_firstkey(struct tdb_context *tdb); TDB_DATA tdb1_nextkey(struct tdb_context *tdb, TDB_DATA key); diff --git a/ccan/tdb2/tdb1_io.c b/ccan/tdb2/tdb1_io.c index 70a660cf..8219e930 100644 --- a/ccan/tdb2/tdb1_io.c +++ b/ccan/tdb2/tdb1_io.c @@ -435,15 +435,15 @@ unsigned char *tdb1_alloc_read(struct tdb_context *tdb, tdb1_off_t offset, tdb1_ } /* Give a piece of tdb data to a parser */ - -int tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key, - tdb1_off_t offset, tdb1_len_t len, - int (*parser)(TDB_DATA key, TDB_DATA data, - void *private_data), - void *private_data) +enum TDB_ERROR tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key, + tdb1_off_t offset, tdb1_len_t len, + enum TDB_ERROR (*parser)(TDB_DATA key, + TDB_DATA data, + void *private_data), + void *private_data) { TDB_DATA data; - int result; + enum TDB_ERROR result; data.dsize = len; @@ -453,14 +453,14 @@ int tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key, * parser directly at the mmap area. */ if (tdb->tdb1.io->tdb1_oob(tdb, offset+len, 0) != 0) { - return -1; + return tdb->last_error; } data.dptr = offset + (unsigned char *)tdb->file->map_ptr; return parser(key, data, private_data); } if (!(data.dptr = tdb1_alloc_read(tdb, offset, len))) { - return -1; + return tdb->last_error; } result = parser(key, data, private_data); diff --git a/ccan/tdb2/tdb1_private.h b/ccan/tdb2/tdb1_private.h index 13c51df9..5d27c785 100644 --- a/ccan/tdb2/tdb1_private.h +++ b/ccan/tdb2/tdb1_private.h @@ -159,11 +159,12 @@ int tdb1_rec_read(struct tdb_context *tdb, tdb1_off_t offset, struct tdb1_record int tdb1_rec_write(struct tdb_context *tdb, tdb1_off_t offset, struct tdb1_record *rec); int tdb1_do_delete(struct tdb_context *tdb, tdb1_off_t rec_ptr, struct tdb1_record *rec); unsigned char *tdb1_alloc_read(struct tdb_context *tdb, tdb1_off_t offset, tdb1_len_t len); -int tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key, - tdb1_off_t offset, tdb1_len_t len, - int (*parser)(TDB_DATA key, TDB_DATA data, - void *private_data), - void *private_data); +enum TDB_ERROR tdb1_parse_data(struct tdb_context *tdb, TDB_DATA key, + tdb1_off_t offset, tdb1_len_t len, + enum TDB_ERROR (*parser)(TDB_DATA key, + TDB_DATA data, + void *private_data), + void *private_data); tdb1_off_t tdb1_find_lock_hash(struct tdb_context *tdb, TDB_DATA key, uint32_t hash, int locktype, struct tdb1_record *rec); void tdb1_io_init(struct tdb_context *tdb); diff --git a/ccan/tdb2/tdb1_tdb.c b/ccan/tdb2/tdb1_tdb.c index 0a4f8b55..a50303c3 100644 --- a/ccan/tdb2/tdb1_tdb.c +++ b/ccan/tdb2/tdb1_tdb.c @@ -209,32 +209,15 @@ enum TDB_ERROR tdb1_fetch(struct tdb_context *tdb, TDB_DATA key, TDB_DATA *data) return TDB_SUCCESS; } -/* - * Find an entry in the database and hand the record's data to a parsing - * function. The parsing function is executed under the chain read lock, so it - * should be fast and should not block on other syscalls. - * - * DON'T CALL OTHER TDB CALLS FROM THE PARSER, THIS MIGHT LEAD TO SEGFAULTS. - * - * For mmapped tdb's that do not have a transaction open it points the parsing - * function directly at the mmap area, it avoids the malloc/memcpy in this - * case. If a transaction is open or no mmap is available, it has to do - * malloc/read/parse/free. - * - * This is interesting for all readers of potentially large data structures in - * the tdb records, ldb indexes being one example. - * - * Return -1 if the record was not found. - */ - -int tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key, - int (*parser)(TDB_DATA key, TDB_DATA data, - void *private_data), - void *private_data) +enum TDB_ERROR tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key, + enum TDB_ERROR (*parser)(TDB_DATA key, + TDB_DATA data, + void *private_data), + void *private_data) { tdb1_off_t rec_ptr; struct tdb1_record rec; - int ret; + enum TDB_ERROR ret; uint32_t hash; /* find which hash bucket it is in */ @@ -242,8 +225,7 @@ int tdb1_parse_record(struct tdb_context *tdb, TDB_DATA key, if (!(rec_ptr = tdb1_find_lock_hash(tdb,key,hash,F_RDLCK,&rec))) { /* record not found */ - tdb->last_error = TDB_ERR_NOEXIST; - return -1; + return TDB_ERR_NOEXIST; } ret = tdb1_parse_data(tdb, key, rec_ptr + sizeof(rec) + rec.key_len, -- 2.39.2