]> git.ozlabs.org Git - ccan/commitdiff
tdb2: use direct access for tdb_read_off/tdb_write_off
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 1 Dec 2010 12:36:12 +0000 (23:06 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 1 Dec 2010 12:36:12 +0000 (23:06 +1030)
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)

ccan/tdb2/io.c

index 91d6eb692749537812b853226e67c4df591d354e..56ccfcba67b7ab2dac531f5d3cf9a08d22644ca4 100644 (file)
@@ -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);