int main(int argc, char *argv[]) { struct tdb_context *tdb; union tdb_attribute hsize, h2; hsize.base.attr = TDB_ATTRIBUTE_TDB1_HASHSIZE; hsize.base.next = &tap_log_attr; hsize.tdb1_hashsize.hsize = 1024; plan_tests(14); tdb = tdb_open("run-tdb1-hashsize.tdb1", TDB_VERSION1, O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize); ok1(tdb); h2.base.attr = TDB_ATTRIBUTE_TDB1_HASHSIZE; ok1(tdb_get_attribute(tdb, &h2) == TDB_SUCCESS); ok1(h2.tdb1_hashsize.hsize == hsize.tdb1_hashsize.hsize); tdb_close(tdb); /* Can't specify TDB_ATTRIBUTE_TDB1_HASHSIZE without O_CREAT */ tdb = tdb_open("run-tdb1-hashsize.tdb1", TDB_VERSION1, O_RDWR, 0600, &hsize); ok1(!tdb); ok1(tap_log_messages == 1); /* Can't specify TDB_ATTRIBUTE_TDB1_HASHSIZE for version2. */ tdb = tdb_open("run-tdb1-hashsize.tdb", TDB_DEFAULT, O_CREAT|O_TRUNC|O_RDWR, 0600, &hsize); ok1(!tdb); ok1(tap_log_messages == 2); /* We can get attribute even if we didn't set it though. */ tdb = tdb_open("run-tdb1-hashsize.tdb1", TDB_DEFAULT, O_RDWR, 0600, &tap_log_attr); ok1(tdb); memset(&h2, 0, sizeof(h2)); h2.base.attr = TDB_ATTRIBUTE_TDB1_HASHSIZE; ok1(tdb_get_attribute(tdb, &h2) == TDB_SUCCESS); ok1(h2.tdb1_hashsize.hsize == hsize.tdb1_hashsize.hsize); tdb_close(tdb); /* Check for default hash size. */ tdb = tdb_open("run-tdb1-hashsize.tdb1", TDB_VERSION1, O_CREAT|O_TRUNC|O_RDWR, 0600, &tap_log_attr); ok1(tdb); memset(&h2, 0, sizeof(h2)); h2.base.attr = TDB_ATTRIBUTE_TDB1_HASHSIZE; ok1(tdb_get_attribute(tdb, &h2) == TDB_SUCCESS); ok1(h2.tdb1_hashsize.hsize == TDB1_DEFAULT_HASH_SIZE); tdb_close(tdb); ok1(tap_log_messages == 2); return exit_status(); }
enum TDB_ERROR tdb_transaction_start_nonblock(struct tdb_context *tdb) { union tdb_attribute locking, orig; enum TDB_ERROR ecode; orig.base.attr = TDB_ATTRIBUTE_FLOCK; ecode = tdb_get_attribute(tdb, &orig); if (ecode != TDB_SUCCESS) return ecode; /* Replace locking function with our own. */ locking = orig; locking.flock.data = &orig; locking.flock.lock = lock_nonblock; ecode = tdb_set_attribute(tdb, &locking); if (ecode != TDB_SUCCESS) return ecode; ecode = tdb_transaction_start(tdb); tdb_unset_attribute(tdb, TDB_ATTRIBUTE_FLOCK); return ecode; }
static void dump_and_clear_stats(struct tdb_context **tdb, int flags, union tdb_attribute *attr) { union tdb_attribute stats; enum TDB_ERROR ecode; stats.base.attr = TDB_ATTRIBUTE_STATS; stats.stats.size = sizeof(stats.stats); ecode = tdb_get_attribute(*tdb, &stats); if (ecode != TDB_SUCCESS) errx(1, "Getting stats: %s", tdb_errorstr(ecode)); printf("allocs = %llu\n", (unsigned long long)stats.stats.allocs); printf(" alloc_subhash = %llu\n", (unsigned long long)stats.stats.alloc_subhash); printf(" alloc_chain = %llu\n", (unsigned long long)stats.stats.alloc_chain); printf(" alloc_bucket_exact = %llu\n", (unsigned long long)stats.stats.alloc_bucket_exact); printf(" alloc_bucket_max = %llu\n", (unsigned long long)stats.stats.alloc_bucket_max); printf(" alloc_leftover = %llu\n", (unsigned long long)stats.stats.alloc_leftover); printf(" alloc_coalesce_tried = %llu\n", (unsigned long long)stats.stats.alloc_coalesce_tried); printf(" alloc_coalesce_iterate_clash = %llu\n", (unsigned long long)stats.stats.alloc_coalesce_iterate_clash); printf(" alloc_coalesce_lockfail = %llu\n", (unsigned long long)stats.stats.alloc_coalesce_lockfail); printf(" alloc_coalesce_race = %llu\n", (unsigned long long)stats.stats.alloc_coalesce_race); printf(" alloc_coalesce_succeeded = %llu\n", (unsigned long long)stats.stats.alloc_coalesce_succeeded); printf(" alloc_coalesce_num_merged = %llu\n", (unsigned long long)stats.stats.alloc_coalesce_num_merged); printf("compares = %llu\n", (unsigned long long)stats.stats.compares); printf(" compare_wrong_bucket = %llu\n", (unsigned long long)stats.stats.compare_wrong_bucket); printf(" compare_wrong_offsetbits = %llu\n", (unsigned long long)stats.stats.compare_wrong_offsetbits); printf(" compare_wrong_keylen = %llu\n", (unsigned long long)stats.stats.compare_wrong_keylen); printf(" compare_wrong_rechash = %llu\n", (unsigned long long)stats.stats.compare_wrong_rechash); printf(" compare_wrong_keycmp = %llu\n", (unsigned long long)stats.stats.compare_wrong_keycmp); printf("transactions = %llu\n", (unsigned long long)stats.stats.transactions); printf(" transaction_cancel = %llu\n", (unsigned long long)stats.stats.transaction_cancel); printf(" transaction_nest = %llu\n", (unsigned long long)stats.stats.transaction_nest); printf(" transaction_expand_file = %llu\n", (unsigned long long)stats.stats.transaction_expand_file); printf(" transaction_read_direct = %llu\n", (unsigned long long)stats.stats.transaction_read_direct); printf(" transaction_read_direct_fail = %llu\n", (unsigned long long)stats.stats.transaction_read_direct_fail); printf(" transaction_write_direct = %llu\n", (unsigned long long)stats.stats.transaction_write_direct); printf(" transaction_write_direct_fail = %llu\n", (unsigned long long)stats.stats.transaction_write_direct_fail); printf("expands = %llu\n", (unsigned long long)stats.stats.expands); printf("frees = %llu\n", (unsigned long long)stats.stats.frees); printf("locks = %llu\n", (unsigned long long)stats.stats.locks); printf(" lock_lowlevel = %llu\n", (unsigned long long)stats.stats.lock_lowlevel); printf(" lock_nonblock = %llu\n", (unsigned long long)stats.stats.lock_nonblock); printf(" lock_nonblock_fail = %llu\n", (unsigned long long)stats.stats.lock_nonblock_fail); /* Now clear. */ tdb_close(*tdb); *tdb = tdb_open("/tmp/speed.tdb", flags, O_RDWR, 0, attr); }