const string PREFIX_OBJ = "O"; // object name -> onode_t
const string PREFIX_OMAP = "M"; // u64 + keyname -> value
const string PREFIX_PGMETA_OMAP = "P"; // u64 + keyname -> value(for meta coll)
+const string PREFIX_PERPOOL_OMAP = "m"; // s64 + u64 + keyname -> value
const string PREFIX_DEFERRED = "L"; // id -> deferred_transaction_t
const string PREFIX_ALLOC = "B"; // u64 offset -> u64 length (freelist)
const string PREFIX_ALLOC_BITMAP = "b";// (see BitmapFreelistManager)
const string& BlueStore::Onode::get_omap_prefix()
{
- return onode.is_pgmeta_omap() ? PREFIX_PGMETA_OMAP
- : PREFIX_OMAP;
+ if (onode.is_pgmeta_omap()) {
+ return PREFIX_PGMETA_OMAP;
+ }
+ if (onode.is_perpool_omap()) {
+ return PREFIX_PERPOOL_OMAP;
+ }
+ return PREFIX_OMAP;
}
// '-' < '.' < '~'
void BlueStore::Onode::get_omap_header(string *out)
{
+ if (onode.is_perpool_omap()) {
+ _key_encode_u64(oid.hobj.pool, out);
+ }
_key_encode_u64(onode.nid, out);
out->push_back('-');
}
void BlueStore::Onode::get_omap_key(const string& key, string *out)
{
+ if (onode.is_perpool_omap()) {
+ _key_encode_u64(oid.hobj.pool, out);
+ }
_key_encode_u64(onode.nid, out);
out->push_back('.');
out->append(key);
void BlueStore::Onode::rewrite_omap_key(const string& old, string *out)
{
+ if (onode.is_perpool_omap()) {
+ _key_encode_u64(oid.hobj.pool, out);
+ }
_key_encode_u64(onode.nid, out);
out->append(old.c_str() + out->length(), old.size() - out->length());
}
void BlueStore::Onode::get_omap_tail(string *out)
{
+ if (onode.is_perpool_omap()) {
+ _key_encode_u64(oid.hobj.pool, out);
+ }
_key_encode_u64(onode.nid, out);
out->push_back('~');
}
void BlueStore::Onode::decode_omap_key(const string& key, string *user_key)
{
- *user_key = key.substr(sizeof(uint64_t) + 1);
+ if (onode.is_perpool_omap()) {
+ *user_key = key.substr(sizeof(uint64_t)*2 + 1);
+ } else {
+ *user_key = key.substr(sizeof(uint64_t) + 1);
+ }
}
{
buf->reset();
- buf->omap_allocated = db->estimate_prefix_size(PREFIX_OMAP, string());
+ buf->omap_allocated =
+ db->estimate_prefix_size(PREFIX_OMAP, string()) +
+ db->estimate_prefix_size(PREFIX_PERPOOL_OMAP, string());
uint64_t bfree = alloc->get_free();
auto p = bl.cbegin();
__u32 num;
if (!o->onode.has_omap()) {
- o->onode.set_omap_flag();
+ o->onode.set_omap_flags();
if (o->oid.is_pgmeta()) {
o->onode.flags |= bluestore_onode_t::FLAG_PGMETA_OMAP;
}
int r;
string key;
if (!o->onode.has_omap()) {
- o->onode.set_omap_flag();
+ o->onode.set_omap_flags();
if (o->oid.is_pgmeta()) {
o->onode.flags |= bluestore_onode_t::FLAG_PGMETA_OMAP;
}
}
if (oldo->onode.has_omap()) {
dout(20) << __func__ << " copying omap data" << dendl;
- newo->onode.set_omap_flag();
+ newo->onode.set_omap_flags();
if (newo->oid.is_pgmeta()) {
newo->onode.flags |= bluestore_onode_t::FLAG_PGMETA_OMAP;
}
enum {
FLAG_OMAP = 1, ///< object may have omap data
FLAG_PGMETA_OMAP = 2, ///< omap data is in meta omap prefix
+ FLAG_PERPOOL_OMAP = 4, ///< omap data is in per-pool prefix; per-pool keys
};
string get_flags_string() const {
if (flags & FLAG_OMAP) {
s = "omap";
}
+ if (flags & FLAG_PGMETA_OMAP) {
+ s += "+pgmeta_omap";
+ }
+ if (flags & FLAG_PERPOOL_OMAP) {
+ s += "+perpool_omap";
+ }
return s;
}
bool is_pgmeta_omap() const {
return has_flag(FLAG_PGMETA_OMAP);
}
+ bool is_perpool_omap() const {
+ return has_flag(FLAG_PERPOOL_OMAP);
+ }
- void set_omap_flag() {
- set_flag(FLAG_OMAP);
+ void set_omap_flags() {
+ set_flag(FLAG_OMAP | FLAG_PERPOOL_OMAP);
}
void clear_omap_flag() {