db->set_merge_operator(prefix, merge_op);
}
-BitmapFreelistManager::BitmapFreelistManager(KeyValueDB *db, string prefix)
- : prefix(prefix), kvdb(db)
+BitmapFreelistManager::BitmapFreelistManager(KeyValueDB *db,
+ string meta_prefix,
+ string bitmap_prefix)
+ : meta_prefix(meta_prefix),
+ bitmap_prefix(bitmap_prefix),
+ kvdb(db)
{
}
{
bufferlist bl;
::encode(bytes_per_block, bl);
- txn->set(prefix, "bytes_per_block", bl);
+ txn->set(meta_prefix, "bytes_per_block", bl);
}
{
bufferlist bl;
::encode(blocks_per_key, bl);
- txn->set(prefix, "blocks_per_key", bl);
+ txn->set(meta_prefix, "blocks_per_key", bl);
}
{
bufferlist bl;
::encode(blocks, bl);
- txn->set(prefix, "blocks", bl);
+ txn->set(meta_prefix, "blocks", bl);
}
{
bufferlist bl;
::encode(size, bl);
- txn->set(prefix, "size", bl);
+ txn->set(meta_prefix, "size", bl);
}
return 0;
}
{
dout(1) << __func__ << dendl;
- KeyValueDB::Iterator it = kvdb->get_iterator(prefix);
+ KeyValueDB::Iterator it = kvdb->get_iterator(meta_prefix);
it->lower_bound(string());
// load meta
// initial base case is a bit awkward
if (enumerate_offset == 0) {
dout(10) << __func__ << " start" << dendl;
- enumerate_p = kvdb->get_iterator(prefix);
+ enumerate_p = kvdb->get_iterator(bitmap_prefix);
enumerate_p->lower_bound(string());
// we assert that the first block is always allocated; it's true,
// and it simplifies our lives a bit.
dout(30) << __func__ << " " << first_key << ": ";
bl.hexdump(*_dout);
*_dout << dendl;
- txn->merge(prefix, k, bl);
+ txn->merge(bitmap_prefix, k, bl);
} else {
// first key
{
dout(30) << __func__ << " " << first_key << ": ";
bl.hexdump(*_dout);
*_dout << dendl;
- txn->merge(prefix, k, bl);
+ txn->merge(bitmap_prefix, k, bl);
first_key += bytes_per_block * blocks_per_key;
}
// middle keys
dout(30) << __func__ << " " << first_key << ": ";
all_set_bl.hexdump(*_dout);
*_dout << dendl;
- txn->merge(prefix, k, all_set_bl);
+ txn->merge(bitmap_prefix, k, all_set_bl);
first_key += bytes_per_block * blocks_per_key;
}
}
dout(30) << __func__ << " " << first_key << ": ";
bl.hexdump(*_dout);
*_dout << dendl;
- txn->merge(prefix, k, bl);
+ txn->merge(bitmap_prefix, k, bl);
}
}
}
KeyValueDB *kvdb,
string prefix)
{
+ // a bit of a hack... we hard-code the prefixes here. we need to
+ // put the freelistmanagers in different prefixes because the merge
+ // op is per prefix, has to done pre-db-open, and we don't know the
+ // freelist type until after we open the db.
+ assert(prefix == "B");
if (type == "extent")
- return new ExtentFreelistManager(kvdb, prefix);
+ return new ExtentFreelistManager(kvdb, "B");
if (type == "bitmap")
- return new BitmapFreelistManager(kvdb, prefix);
+ return new BitmapFreelistManager(kvdb, "B", "b");
return NULL;
}