void tdb_htrie_test_fixsz(const char *fname) { int r __attribute__((unused)); int t, fd; char *addr; TdbHdr *dbh; struct timeval tv0, tv1; pthread_t thr[THR_N]; printf("\n----------- Fixed size records test -------------\n"); addr = tdb_htrie_open(TDB_MAP_ADDR1, fname, TDB_FSF_SZ, &fd); dbh = tdb_htrie_init(addr, TDB_FSF_SZ, sizeof(ints[0])); if (!dbh) TDB_ERR("cannot initialize htrie for ints"); r = gettimeofday(&tv0, NULL); assert(!r); for (t = 0; t < THR_N; ++t) if (spawn_thread(thr + t, fixsz_thr_f, dbh)) perror("cannot spawn fixsz thread"); for (t = 0; t < THR_N; ++t) pthread_join(thr[t], NULL); r = gettimeofday(&tv1, NULL); assert(!r); printf("tdb htrie ints test: time=%lums\n", tv_to_ms(&tv1) - tv_to_ms(&tv0)); tdb_htrie_exit(dbh); tdb_htrie_pure_close(addr, TDB_FSF_SZ, fd); printf("\n **** Fixed size records test reopen ****\n"); addr = tdb_htrie_open(TDB_MAP_ADDR2, fname, TDB_FSF_SZ, &fd); dbh = tdb_htrie_init(addr, TDB_FSF_SZ, sizeof(ints[0])); if (!dbh) TDB_ERR("cannot initialize htrie for ints"); lookup_fixsz_records(dbh); tdb_htrie_exit(dbh); tdb_htrie_pure_close(addr, TDB_FSF_SZ, fd); }
/** * Work queue wrapper for tdb_file_open() (real file open). */ static void tdb_open_db(struct work_struct *work) { TdbWork *tw = (TdbWork *)work; TDB *db = tw->db; if (tdb_file_open(db, tw->fsize)) TDB_ERR("Cannot open db\n"); db->hdr = tdb_htrie_init(db->hdr, db->filp->f_inode->i_size, tw->rsize); if (!db->hdr) TDB_ERR("Cannot initialize db header\n"); kmem_cache_free(tw_cache, tw); }
/** * Open database file and @return its descriptor. * If the database is already opened, then returns the handler. * * The function must not be called from softirq! */ TDB * tdb_open(const char *path, size_t fsize, unsigned int rec_size, int node) { TDB *db; if ((fsize & ~TDB_EXT_MASK) || fsize < TDB_EXT_SZ) { TDB_ERR("Bad table size: %lu\n", fsize); return NULL; } db = tdb_get_db(path, node); if (!db) return NULL; db->node = node; if (tdb_file_open(db, fsize)) { TDB_ERR("Cannot open db\n"); goto err; } db->hdr = tdb_htrie_init(db->hdr, db->filp->f_inode->i_size, rec_size); if (!db->hdr) { TDB_ERR("Cannot initialize db header\n"); goto err_init; } tdb_tbl_enumerate(db); TDB_LOG("Opened table %s: size=%lu rec_size=%u base=%p\n", path, fsize, rec_size, db->hdr); return db; err_init: tdb_file_close(db); err: tdb_put(db); return NULL; }