return out;
}
-void MemDB::_encode(btree::btree_map<string,
- bufferptr>:: iterator iter, bufferlist &bl)
+void MemDB::_encode(mdb_iter_t iter, bufferlist &bl)
{
::encode(iter->first, bl);
::encode(iter->second, bl);
return;
}
bufferlist bl;
- btree::btree_map<string, bufferptr>::iterator iter = m_btree.begin();
- while (iter != m_btree.end()) {
+ mdb_iter_t iter = m_map.begin();
+ while (iter != m_map.end()) {
dout(10) << __func__ << " Key:"<< iter->first << dendl;
_encode(iter, bl);
iter++;
bytes_done += ::decode_file(fd, datap);
dout(10) << __func__ << " Key:"<< key << dendl;
- m_btree[key] = datap;
+ m_map[key] = datap;
m_total_bytes += datap.length();
}
VOID_TEMP_FAILURE_RETRY(::close(fd));
*/
assert(m_total_bytes >= bl_old.length());
m_total_bytes -= bl_old.length();
- m_btree.erase(key);
+ m_map.erase(key);
}
- m_btree[key] = bufferptr((char *) bl.c_str(), bl.length());
+ m_map[key] = bufferptr((char *) bl.c_str(), bl.length());
iterator_seq_no++;
return 0;
}
/*
* Erase will call the destructor for bufferptr.
*/
- return m_btree.erase(key);
+ return m_map.erase(key);
}
std::shared_ptr<KeyValueDB::MergeOperator> MemDB::_find_merge_op(std::string prefix)
* Merge non existent.
*/
mop->merge_nonexistent(bl.c_str(), bl.length(), &new_val);
- m_btree[key] = bufferptr(new_val.c_str(), new_val.length());
+ m_map[key] = bufferptr(new_val.c_str(), new_val.length());
} else {
/*
* Merge existing.
*/
std::string new_val;
mop->merge(bl_old.c_str(), bl_old.length(), bl.c_str(), bl.length(), &new_val);
- m_btree[key] = bufferptr(new_val.c_str(), new_val.length());
+ m_map[key] = bufferptr(new_val.c_str(), new_val.length());
bytes_adjusted -= bl_old.length();
bl_old.clear();
}
{
string key = make_key(prefix, k);
- btree::btree_map<string, bufferptr>::iterator iter = m_btree.find(key);
- if (iter == m_btree.end()) {
+ mdb_iter_t iter = m_map.find(key);
+ if (iter == m_map.end()) {
return false;
}
- out->push_back((m_btree[key].clone()));
+ out->push_back((m_map[key].clone()));
return true;
}
}
bool MemDB::MDBWholeSpaceIteratorImpl::iterator_validate() {
+
if (this_seq_no != *global_seq_no) {
auto key = m_key_value.first;
assert(!key.empty());
- m_iter = m_btree_p->lower_bound(key);
- if (m_iter == m_btree_p->end()) {
- return false;
+
+ bool restart_iter = false;
+ if (!m_using_btree) {
+ /*
+ * Map is modified and marker key does not exists,
+ * restart the iterator from next key.
+ */
+ if (m_map_p->find(key) == m_map_p->end()) {
+ restart_iter = true;
+ }
+ } else {
+ restart_iter = true;
}
+
+ if (restart_iter) {
+ m_iter = m_map_p->lower_bound(key);
+ if (m_iter == m_map_p->end()) {
+ return false;
+ }
+ }
+
+ /*
+ * This iter is valid now.
+ */
+ this_seq_no = *global_seq_no;
}
+
return true;
}
int MemDB::MDBWholeSpaceIteratorImpl::next()
{
- std::lock_guard<std::mutex> l(*m_btree_lock_p);
+ std::lock_guard<std::mutex> l(*m_map_lock_p);
if (!iterator_validate()) {
free_last();
return -1;
}
free_last();
m_iter++;
- if (m_iter != m_btree_p->end()) {
+ if (m_iter != m_map_p->end()) {
fill_current();
return 0;
} else {
int MemDB::MDBWholeSpaceIteratorImpl:: prev()
{
- std::lock_guard<std::mutex> l(*m_btree_lock_p);
+ std::lock_guard<std::mutex> l(*m_map_lock_p);
if (!iterator_validate()) {
free_last();
return -1;
}
free_last();
- if (m_iter != m_btree_p->begin()) {
+ if (m_iter != m_map_p->begin()) {
m_iter--;
fill_current();
return 0;
*/
int MemDB::MDBWholeSpaceIteratorImpl::seek_to_first(const std::string &k)
{
- std::lock_guard<std::mutex> l(*m_btree_lock_p);
+ std::lock_guard<std::mutex> l(*m_map_lock_p);
free_last();
if (k.empty()) {
- m_iter = m_btree_p->begin();
+ m_iter = m_map_p->begin();
} else {
- m_iter = m_btree_p->lower_bound(k);
+ m_iter = m_map_p->lower_bound(k);
}
- if (m_iter == m_btree_p->end()) {
+ if (m_iter == m_map_p->end()) {
return -1;
}
fill_current();
int MemDB::MDBWholeSpaceIteratorImpl::seek_to_last(const std::string &k)
{
- std::lock_guard<std::mutex> l(*m_btree_lock_p);
+ std::lock_guard<std::mutex> l(*m_map_lock_p);
free_last();
if (k.empty()) {
- m_iter = m_btree_p->end();
+ m_iter = m_map_p->end();
m_iter--;
} else {
- m_iter = m_btree_p->lower_bound(k);
+ m_iter = m_map_p->lower_bound(k);
}
- if (m_iter == m_btree_p->end()) {
+ if (m_iter == m_map_p->end()) {
return -1;
}
fill_current();
int MemDB::MDBWholeSpaceIteratorImpl::upper_bound(const std::string &prefix,
const std::string &after) {
- std::lock_guard<std::mutex> l(*m_btree_lock_p);
+ std::lock_guard<std::mutex> l(*m_map_lock_p);
dtrace << "upper_bound " << prefix.c_str() << after.c_str() << dendl;
string k = make_key(prefix, after);
- m_iter = m_btree_p->upper_bound(k);
- if (m_iter != m_btree_p->end()) {
+ m_iter = m_map_p->upper_bound(k);
+ if (m_iter != m_map_p->end()) {
fill_current();
return 0;
}
int MemDB::MDBWholeSpaceIteratorImpl::lower_bound(const std::string &prefix,
const std::string &to) {
- std::lock_guard<std::mutex> l(*m_btree_lock_p);
+ std::lock_guard<std::mutex> l(*m_map_lock_p);
dtrace << "lower_bound " << prefix.c_str() << to.c_str() << dendl;
string k = make_key(prefix, to);
- m_iter = m_btree_p->lower_bound(k);
- if (m_iter != m_btree_p->end()) {
+ m_iter = m_map_p->lower_bound(k);
+ if (m_iter != m_map_p->end()) {
fill_current();
return 0;
}
uint64_t m_total_bytes;
uint64_t m_allocated_bytes;
- btree::btree_map<std::string, bufferptr> m_btree;
+ typedef std::map<std::string, bufferptr> mdb_map_t;
+ typedef mdb_map_t::iterator mdb_iter_t;
+ bool m_using_btree;
+
+ mdb_map_t m_map;
+
CephContext *m_cct;
void* m_priv;
string m_options;
bool _get(const string &prefix, const string &k, bufferlist *out);
bool _get_locked(const string &prefix, const string &k, bufferlist *out);
std::string _get_data_fn();
- void _encode(btree::btree_map<string, bufferptr>:: iterator iter, bufferlist &bl);
+ void _encode(mdb_iter_t iter, bufferlist &bl);
void _save();
int _load();
uint64_t iterator_seq_no;
public:
MemDB(CephContext *c, const string &path, void *p) :
- m_cct(c), m_priv(p), m_db_path(path), iterator_seq_no(1)
+ m_using_btree(false), m_cct(c), m_priv(p), m_db_path(path), iterator_seq_no(1)
{
//Nothing as of now
}
class MDBWholeSpaceIteratorImpl : public KeyValueDB::WholeSpaceIteratorImpl {
- btree::btree_map<string, bufferptr>::iterator m_iter;
+ mdb_iter_t m_iter;
std::pair<string, bufferlist> m_key_value;
- btree::btree_map<std::string, bufferptr> *m_btree_p;
- std::mutex *m_btree_lock_p;
+ mdb_map_t *m_map_p;
+ std::mutex *m_map_lock_p;
uint64_t *global_seq_no;
uint64_t this_seq_no;
+ bool m_using_btree;
public:
- MDBWholeSpaceIteratorImpl(btree::btree_map<std::string, bufferptr> *btree_p,
- std::mutex *btree_lock_p, uint64_t *iterator_seq_no) {
- m_btree_p = btree_p;
- m_btree_lock_p = btree_lock_p;
- std::lock_guard<std::mutex> l(*m_btree_lock_p);
- global_seq_no = iterator_seq_no;
- this_seq_no = *iterator_seq_no;
+ MDBWholeSpaceIteratorImpl(mdb_map_t *btree_p, std::mutex *btree_lock_p,
+ uint64_t *iterator_seq_no, bool using_btree) {
+ m_map_p = btree_p;
+ m_map_lock_p = btree_lock_p;
+ std::lock_guard<std::mutex> l(*m_map_lock_p);
+ global_seq_no = iterator_seq_no;
+ this_seq_no = *iterator_seq_no;
+ m_using_btree = using_btree;
}
void fill_current();
WholeSpaceIterator _get_iterator() {
return std::shared_ptr<KeyValueDB::WholeSpaceIteratorImpl>(
- new MDBWholeSpaceIteratorImpl(&m_btree, &m_lock, &iterator_seq_no));
+ new MDBWholeSpaceIteratorImpl(&m_map, &m_lock, &iterator_seq_no, m_using_btree));
}
WholeSpaceIterator _get_snapshot_iterator();