From: Samuel Just Date: Fri, 10 Feb 2017 23:50:57 +0000 (-0800) Subject: DBObjectMap: strengthen in_complete_region post condition X-Git-Tag: v10.2.8~52^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1fe4b856a37b29c85a9317e514c7f15f8e4905d5;p=ceph.git DBObjectMap: strengthen in_complete_region post condition Previously, in_complete_region didn't guarantee anything about where it left complete_iter pointing. It will be handy for complete_iter to be pointing at the lowest interval which ends after to_test. Make it so. Signed-off-by: Samuel Just (cherry picked from commit 97b35f4d7d4862da4b6f50ecaef0d292a671fd04) --- diff --git a/src/os/filestore/DBObjectMap.cc b/src/os/filestore/DBObjectMap.cc index 079019c57d61..45f48a9f1d9e 100644 --- a/src/os/filestore/DBObjectMap.cc +++ b/src/os/filestore/DBObjectMap.cc @@ -395,22 +395,37 @@ int DBObjectMap::DBObjectMapIteratorImpl::in_complete_region(const string &to_te string *begin, string *end) { + /* This is clumsy because one cannot call prev() on end(), nor can one + * test for == begin(). + */ complete_iter->upper_bound(to_test); - if (complete_iter->valid()) + if (complete_iter->valid()) { complete_iter->prev(); - else + if (!complete_iter->valid()) { + complete_iter->upper_bound(to_test); + return false; + } + } else { complete_iter->seek_to_last(); + if (!complete_iter->valid()) + return false; + } - if (!complete_iter->valid()) + assert(complete_iter->key() <= to_test); + assert(complete_iter->value().length() >= 1); + string _end(complete_iter->value().c_str(), + complete_iter->value().length() - 1); + if (_end.empty() || _end > to_test) { + if (begin) + *begin = complete_iter->key(); + if (end) + *end = _end; + return true; + } else { + complete_iter->next(); + assert(!complete_iter->valid() || complete_iter->key() > to_test); return false; - - string _end; - if (begin) - *begin = complete_iter->key(); - _end = string(complete_iter->value().c_str()); - if (end) - *end = _end; - return (to_test >= complete_iter->key()) && (!_end.size() || _end > to_test); + } } /** diff --git a/src/os/filestore/DBObjectMap.h b/src/os/filestore/DBObjectMap.h index a05d23019b9e..41616ab0dd09 100644 --- a/src/os/filestore/DBObjectMap.h +++ b/src/os/filestore/DBObjectMap.h @@ -405,6 +405,11 @@ private: int next_parent(); /// Tests whether to_test is in complete region + /** + * Tests whether to_test is in complete region + * + * postcondition: complete_iter will be max s.t. complete_iter->value > to_test + */ int in_complete_region(const string &to_test, ///< [in] key to test string *begin, ///< [out] beginning of region string *end ///< [out] end of region