Fix for bug where GeoDB accesses key after next modification of iterator
Summary: While running cross-functional tests for weak iterators, I encountered a bug in GeoDB. GeoDB reads a key from the database and tries to use it after doing a Seek. Fixing it by storing the key locally so that it is still visible after the Seek. Test Plan: Run geodb_test Reviewers: sdong, igor Reviewed By: igor Subscribers: dhruba, leveldb Differential Revision: https://reviews.facebook.net/D31599
This commit is contained in:
parent
d10f1de2b4
commit
f2ddb8b452
@ -84,7 +84,7 @@ Status GeoDBImpl::GetByPosition(const GeoPosition& pos,
|
|||||||
|
|
||||||
Status GeoDBImpl::GetById(const Slice& id, GeoObject* object) {
|
Status GeoDBImpl::GetById(const Slice& id, GeoObject* object) {
|
||||||
Status status;
|
Status status;
|
||||||
Slice quadkey;
|
std::string quadkey;
|
||||||
|
|
||||||
// create an iterator so that we can get a consistent picture
|
// create an iterator so that we can get a consistent picture
|
||||||
// of the database.
|
// of the database.
|
||||||
@ -97,7 +97,7 @@ Status GeoDBImpl::GetById(const Slice& id, GeoObject* object) {
|
|||||||
iter->Seek(key2);
|
iter->Seek(key2);
|
||||||
if (iter->Valid() && iter->status().ok()) {
|
if (iter->Valid() && iter->status().ok()) {
|
||||||
if (iter->key().compare(key2) == 0) {
|
if (iter->key().compare(key2) == 0) {
|
||||||
quadkey = iter->value();
|
quadkey = iter->value().ToString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (quadkey.size() == 0) {
|
if (quadkey.size() == 0) {
|
||||||
@ -108,7 +108,7 @@ Status GeoDBImpl::GetById(const Slice& id, GeoObject* object) {
|
|||||||
//
|
//
|
||||||
// Seek to the quadkey + id prefix
|
// Seek to the quadkey + id prefix
|
||||||
//
|
//
|
||||||
std::string prefix = MakeKey1Prefix(quadkey.ToString(), id);
|
std::string prefix = MakeKey1Prefix(quadkey, id);
|
||||||
iter->Seek(Slice(prefix));
|
iter->Seek(Slice(prefix));
|
||||||
assert(iter->Valid());
|
assert(iter->Valid());
|
||||||
if (!iter->Valid() || !iter->status().ok()) {
|
if (!iter->Valid() || !iter->status().ok()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user