diff options
-rw-r--r-- | lib/tdb/common/freelist.c | 26 | ||||
-rw-r--r-- | lib/tdb/common/tdb.c | 30 |
2 files changed, 13 insertions, 43 deletions
diff --git a/lib/tdb/common/freelist.c b/lib/tdb/common/freelist.c index 6f8f812d41..2aeeb1c383 100644 --- a/lib/tdb/common/freelist.c +++ b/lib/tdb/common/freelist.c @@ -404,22 +404,10 @@ tdb_off_t tdb_allocate(struct tdb_context *tdb, int hash, tdb_len_t length, * hash chains, something which is pretty bad normally) */ - for (i=1; i<tdb->hash_size; i++) { + for (i=0; i<tdb->hash_size; i++) { int list; - if (tdb_lock_nonblock(tdb, -1, F_WRLCK) == 0) { - /* - * Under the freelist lock take the chance to give - * back our dead records. - */ - tdb_purge_dead(tdb, hash); - - ret = tdb_allocate_from_freelist(tdb, length, rec); - tdb_unlock(tdb, -1, F_WRLCK); - return ret; - } - list = BUCKET(hash+i); if (tdb_lock_nonblock(tdb, list, F_WRLCK) == 0) { @@ -432,6 +420,18 @@ tdb_off_t tdb_allocate(struct tdb_context *tdb, int hash, tdb_len_t length, return ret; } } + + if (tdb_lock_nonblock(tdb, -1, F_WRLCK) == 0) { + /* + * Under the freelist lock take the chance to give + * back our dead records. + */ + tdb_purge_dead(tdb, hash); + + ret = tdb_allocate_from_freelist(tdb, length, rec); + tdb_unlock(tdb, -1, F_WRLCK); + return ret; + } } blocking_freelist_allocate: diff --git a/lib/tdb/common/tdb.c b/lib/tdb/common/tdb.c index ba1c98edbe..ebd4ffe3e0 100644 --- a/lib/tdb/common/tdb.c +++ b/lib/tdb/common/tdb.c @@ -520,36 +520,6 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA key, if (flag != TDB_INSERT) tdb_delete_hash(tdb, key, hash); - if (tdb->max_dead_records != 0) { - tdb_off_t last_ptr; - /* - * Allow for some dead records per hash chain, look if we can - * find one that can hold the new record. We need enough space - * for key, data and tailer. If we find one, we don't have to - * consult the central freelist. - */ - rec_ptr = tdb_find_dead(tdb, hash, &rec, - key.dsize + dbuf.dsize, - &last_ptr); - - if (rec_ptr != 0) { - rec.key_len = key.dsize; - rec.data_len = dbuf.dsize; - rec.full_hash = hash; - rec.magic = TDB_MAGIC; - if (tdb_rec_write(tdb, rec_ptr, &rec) == -1 - || tdb->methods->tdb_write( - tdb, rec_ptr + sizeof(rec), - key.dptr, key.dsize) == -1 - || tdb->methods->tdb_write( - tdb, rec_ptr + sizeof(rec) + key.dsize, - dbuf.dptr, dbuf.dsize) == -1) { - goto fail; - } - goto done; - } - } - /* we have to allocate some space */ rec_ptr = tdb_allocate(tdb, hash, key.dsize + dbuf.dsize, &rec); |