Skip to content

Commit

Permalink
kv: fix iterator invalidation in memdb
Browse files Browse the repository at this point in the history
Signed-off-by: Haodong Tang <haodong.tang@intel.com>
  • Loading branch information
haodong committed Aug 10, 2016
1 parent eca56cb commit db00156
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
18 changes: 14 additions & 4 deletions src/kv/MemDB.cc
Expand Up @@ -125,6 +125,7 @@ void MemDB::_load()
dout(10) << __func__ << " Key:"<< key << dendl;
m_btree[key] = datap;
}
m_total_bytes += bytes_done;
VOID_TEMP_FAILURE_RETRY(::close(fd));
}

Expand Down Expand Up @@ -266,7 +267,7 @@ int MemDB::_setkey(ms_op_t &op)
}

m_btree[key] = bufferptr((char *) bl.c_str(), bl.length());

iterator_valid = false;
return 0;
}

Expand All @@ -276,10 +277,13 @@ int MemDB::_rmkey(ms_op_t &op)
std::string key = make_key(op.first.first, op.first.second);

bufferlist bl_old;
dtrace << "m_total_bytes is: " << m_total_bytes << dendl;
if (_get(op.first.first, op.first.second, &bl_old)) {
dtrace << "bl_old length is: " << bl_old.length() << dendl;
assert(m_total_bytes >= bl_old.length());
m_total_bytes -= bl_old.length();
}
iterator_valid = false;
/*
* Erase will call the destructor for bufferptr.
*/
Expand Down Expand Up @@ -337,6 +341,7 @@ int MemDB::_merge(ms_op_t &op)

assert((int64_t)m_total_bytes + bytes_adjusted >= 0);
m_total_bytes += bytes_adjusted;
iterator_valid = false;
return 0;
}

Expand Down Expand Up @@ -393,7 +398,7 @@ void MemDB::MDBWholeSpaceIteratorImpl::fill_current()

bool MemDB::MDBWholeSpaceIteratorImpl::valid()
{
if (m_key_value.first.empty()) {
if (!(*is_valid) || m_key_value.first.empty()) {
return false;
}
return true;
Expand Down Expand Up @@ -442,6 +447,7 @@ bufferlist MemDB::MDBWholeSpaceIteratorImpl::value()
int MemDB::MDBWholeSpaceIteratorImpl::next()
{
std::lock_guard<std::mutex> l(*m_btree_lock_p);
if (!(*is_valid)) return -1;
free_last();
m_iter++;
if (m_iter != m_btree_p->end()) {
Expand All @@ -455,6 +461,7 @@ int MemDB::MDBWholeSpaceIteratorImpl::next()
int MemDB::MDBWholeSpaceIteratorImpl:: prev()
{
std::lock_guard<std::mutex> l(*m_btree_lock_p);
if (!(*is_valid)) return -1;
free_last();
m_iter--;
if (m_iter != m_btree_p->end()) {
Expand All @@ -471,23 +478,25 @@ int MemDB::MDBWholeSpaceIteratorImpl:: prev()
int MemDB::MDBWholeSpaceIteratorImpl::seek_to_first(const std::string &k)
{
std::lock_guard<std::mutex> l(*m_btree_lock_p);
if (!(*is_valid)) return -1;
free_last();
if (k.empty()) {
m_iter = m_btree_p->begin();
} else {
m_iter = m_btree_p->lower_bound(k);
}

if (m_iter == m_btree_p->end()) {
return -1;
}
fill_current();
return 0;
}

int MemDB::MDBWholeSpaceIteratorImpl::seek_to_last(const std::string &k)
{
std::lock_guard<std::mutex> l(*m_btree_lock_p);

if (!(*is_valid)) return -1;
free_last();
if (k.empty()) {
m_iter = m_btree_p->end();
Expand All @@ -499,6 +508,7 @@ int MemDB::MDBWholeSpaceIteratorImpl::seek_to_last(const std::string &k)
if (m_iter == m_btree_p->end()) {
return -1;
}
fill_current();
return 0;
}

Expand Down
10 changes: 7 additions & 3 deletions src/kv/MemDB.h
Expand Up @@ -48,10 +48,11 @@ class MemDB : public KeyValueDB
void _encode(btree::btree_map<string, bufferptr>:: iterator iter, bufferlist &bl);
void _save();
void _load();
bool iterator_valid;

public:
MemDB(CephContext *c, const string &path, void *p) :
m_cct(c), m_priv(p), m_db_path(path)
m_cct(c), m_priv(p), m_db_path(path), iterator_valid(true)
{
//Nothing as of now
}
Expand Down Expand Up @@ -132,12 +133,15 @@ class MemDB : public KeyValueDB
std::pair<string, bufferlist> m_key_value;
btree::btree_map<std::string, bufferptr> *m_btree_p;
std::mutex *m_btree_lock_p;
bool *is_valid;

public:
MDBWholeSpaceIteratorImpl(btree::btree_map<std::string, bufferptr> *btree_p,
std::mutex *btree_lock_p) {
std::mutex *btree_lock_p, bool *is_valid_) {
m_btree_p = btree_p;
m_btree_lock_p = btree_lock_p;
is_valid = is_valid_;
*is_valid = true;
}

void fill_current();
Expand Down Expand Up @@ -183,7 +187,7 @@ class MemDB : public KeyValueDB

WholeSpaceIterator _get_iterator() {
return std::shared_ptr<KeyValueDB::WholeSpaceIteratorImpl>(
new MDBWholeSpaceIteratorImpl(&m_btree, &m_lock));
new MDBWholeSpaceIteratorImpl(&m_btree, &m_lock, &iterator_valid));
}

WholeSpaceIterator _get_snapshot_iterator();
Expand Down

0 comments on commit db00156

Please sign in to comment.