From: Rusty Russell Date: Wed, 1 Dec 2010 12:36:12 +0000 (+1030) Subject: tdb2: use direct access for tdb_read_off/tdb_write_off X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=b44978e1499a61c3d91d93dbd7c45b6fc45b1778 tdb2: use direct access for tdb_read_off/tdb_write_off This is one case where getting rid of tdb_get() cost us. Also, we add more read-only checks. Before we removed tdb_get: Adding 1000000 records: 6480 ns (59900296 bytes) Finding 1000000 records: 2839 ns (59900296 bytes) Missing 1000000 records: 2485 ns (59900296 bytes) Traversing 1000000 records: 2598 ns (59900296 bytes) Deleting 1000000 records: 5342 ns (59900296 bytes) Re-adding 1000000 records: 5613 ns (59900296 bytes) Appending 1000000 records: 12194 ns (93594224 bytes) Churning 1000000 records: 14549 ns (93594224 bytes) Now: Adding 1000000 records: 6307 ns (59900296 bytes) Finding 1000000 records: 2801 ns (59900296 bytes) Missing 1000000 records: 2515 ns (59900296 bytes) Traversing 1000000 records: 2579 ns (59900296 bytes) Deleting 1000000 records: 5225 ns (59900296 bytes) Re-adding 1000000 records: 5878 ns (59900296 bytes) Appending 1000000 records: 12665 ns (93594224 bytes) Churning 1000000 records: 16090 ns (93594224 bytes) --- diff --git a/ccan/tdb2/io.c b/ccan/tdb2/io.c index 91d6eb69..56ccfcba 100644 --- a/ccan/tdb2/io.c +++ b/ccan/tdb2/io.c @@ -179,6 +179,12 @@ int zero_out(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len) { char buf[8192] = { 0 }; void *p = tdb->methods->direct(tdb, off, len); + + if (tdb->read_only) { + tdb->ecode = TDB_ERR_RDONLY; + return -1; + } + if (p) { memset(p, 0, len); return 0; @@ -197,6 +203,12 @@ tdb_off_t tdb_read_off(struct tdb_context *tdb, tdb_off_t off) { tdb_off_t ret; + if (likely(!(tdb->flags & TDB_CONVERT))) { + tdb_off_t *p = tdb->methods->direct(tdb, off, sizeof(*p)); + if (p) + return *p; + } + if (tdb_read_convert(tdb, off, &ret, sizeof(ret)) == -1) return TDB_OFF_ERR; return ret; @@ -349,6 +361,18 @@ int tdb_read_convert(struct tdb_context *tdb, tdb_off_t off, int tdb_write_off(struct tdb_context *tdb, tdb_off_t off, tdb_off_t val) { + if (tdb->read_only) { + tdb->ecode = TDB_ERR_RDONLY; + return -1; + } + + if (likely(!(tdb->flags & TDB_CONVERT))) { + tdb_off_t *p = tdb->methods->direct(tdb, off, sizeof(*p)); + if (p) { + *p = val; + return 0; + } + } return tdb_write_convert(tdb, off, &val, sizeof(val)); } @@ -470,6 +494,11 @@ void *tdb_access_write(struct tdb_context *tdb, { void *ret = NULL; + if (tdb->read_only) { + tdb->ecode = TDB_ERR_RDONLY; + return NULL; + } + if (likely(!(tdb->flags & TDB_CONVERT))) ret = tdb->methods->direct(tdb, off, len);