From 8c60b55d7d49bc6fa1d8d076c025fc83283c0776 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Fri, 23 Jun 2017 09:36:20 +0800 Subject: [PATCH] kv/RocksDBStore: abort if rocksdb EIO, don't return incorrect result If the underlying disk is missing, the current logic won't check the actual reason why Get/Set failed, it will result to client get a empty key/value pair which is not expected. The correct logic should be abort right now. Otherwise, it will leads to undefined behavior. Signed-off-by: Haomai Wang --- src/kv/RocksDBStore.cc | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/kv/RocksDBStore.cc b/src/kv/RocksDBStore.cc index 0ea96ca12381d..2567e65212793 100644 --- a/src/kv/RocksDBStore.cc +++ b/src/kv/RocksDBStore.cc @@ -716,8 +716,12 @@ int RocksDBStore::get( std::string value; std::string bound = combine_strings(prefix, *i); auto status = db->Get(rocksdb::ReadOptions(), rocksdb::Slice(bound), &value); - if (status.ok()) + if (status.ok()) { (*out)[*i].append(value); + } else if (status.IsIOError()) { + ceph_abort_msg(cct, status.ToString()); + } + } utime_t lat = ceph_clock_now() - start; logger->inc(l_rocksdb_gets); @@ -739,8 +743,10 @@ int RocksDBStore::get( s = db->Get(rocksdb::ReadOptions(), rocksdb::Slice(k), &value); if (s.ok()) { out->append(value); - } else { + } else if (s.IsNotFound()) { r = -ENOENT; + } else { + ceph_abort_msg(cct, s.ToString()); } utime_t lat = ceph_clock_now() - start; logger->inc(l_rocksdb_gets); @@ -763,8 +769,10 @@ int RocksDBStore::get( s = db->Get(rocksdb::ReadOptions(), rocksdb::Slice(k), &value); if (s.ok()) { out->append(value); - } else { + } else if (s.IsNotFound()) { r = -ENOENT; + } else { + ceph_abort_msg(cct, s.ToString()); } utime_t lat = ceph_clock_now() - start; logger->inc(l_rocksdb_gets); @@ -882,17 +890,20 @@ RocksDBStore::RocksDBWholeSpaceIteratorImpl::~RocksDBWholeSpaceIteratorImpl() int RocksDBStore::RocksDBWholeSpaceIteratorImpl::seek_to_first() { dbiter->SeekToFirst(); + assert(!dbiter->status().IsIOError()); return dbiter->status().ok() ? 0 : -1; } int RocksDBStore::RocksDBWholeSpaceIteratorImpl::seek_to_first(const string &prefix) { rocksdb::Slice slice_prefix(prefix); dbiter->Seek(slice_prefix); + assert(!dbiter->status().IsIOError()); return dbiter->status().ok() ? 0 : -1; } int RocksDBStore::RocksDBWholeSpaceIteratorImpl::seek_to_last() { dbiter->SeekToLast(); + assert(!dbiter->status().IsIOError()); return dbiter->status().ok() ? 0 : -1; } int RocksDBStore::RocksDBWholeSpaceIteratorImpl::seek_to_last(const string &prefix) @@ -934,6 +945,7 @@ int RocksDBStore::RocksDBWholeSpaceIteratorImpl::next() if (valid()) { dbiter->Next(); } + assert(!dbiter->status().IsIOError()); return dbiter->status().ok() ? 0 : -1; } int RocksDBStore::RocksDBWholeSpaceIteratorImpl::prev() @@ -941,6 +953,7 @@ int RocksDBStore::RocksDBWholeSpaceIteratorImpl::prev() if (valid()) { dbiter->Prev(); } + assert(!dbiter->status().IsIOError()); return dbiter->status().ok() ? 0 : -1; } string RocksDBStore::RocksDBWholeSpaceIteratorImpl::key() -- 2.39.5