Commit 19cac686 authored by Connor1996's avatar Connor1996

skip missing blob file when itering

Signed-off-by: 's avatarConnor1996 <zbk602423539@gmail.com>
parent c673677c
...@@ -363,7 +363,7 @@ Status TitanDBImpl::GetImpl(const ReadOptions& options, ...@@ -363,7 +363,7 @@ Status TitanDBImpl::GetImpl(const ReadOptions& options,
s = storage->Get(options, index, &record, &buffer); s = storage->Get(options, index, &record, &buffer);
if (s.IsCorruption()) { if (s.IsCorruption()) {
ROCKS_LOG_DEBUG(db_options_.info_log, "Key:%s Snapshot:%" PRIu64 " GetBlobFile err:%s\n", ROCKS_LOG_ERROR(db_options_.info_log, "Key:%s Snapshot:%" PRIu64 " GetBlobFile err:%s\n",
key.ToString(true).c_str(), key.ToString(true).c_str(),
options.snapshot->GetSequenceNumber(), options.snapshot->GetSequenceNumber(),
s.ToString().c_str()); s.ToString().c_str());
......
...@@ -34,34 +34,46 @@ class TitanDBIterator : public Iterator { ...@@ -34,34 +34,46 @@ class TitanDBIterator : public Iterator {
void SeekToFirst() override { void SeekToFirst() override {
iter_->SeekToFirst(); iter_->SeekToFirst();
GetBlobValue(); while (!GetBlobValue()) {
iter_->Next();
}
} }
void SeekToLast() override { void SeekToLast() override {
iter_->SeekToLast(); iter_->SeekToLast();
GetBlobValue(); while (!GetBlobValue()) {
iter_->Prev();
}
} }
void Seek(const Slice& target) override { void Seek(const Slice& target) override {
iter_->Seek(target); iter_->Seek(target);
GetBlobValue(); while (!GetBlobValue()) {
iter_->Next();
}
} }
void SeekForPrev(const Slice& target) override { void SeekForPrev(const Slice& target) override {
iter_->SeekForPrev(target); iter_->SeekForPrev(target);
GetBlobValue(); while (!GetBlobValue()) {
iter_->Prev();
}
} }
void Next() override { void Next() override {
assert(Valid()); assert(Valid());
iter_->Next(); iter_->Next();
GetBlobValue(); while (!GetBlobValue()) {
iter_->Next();
}
} }
void Prev() override { void Prev() override {
assert(Valid()); assert(Valid());
iter_->Prev(); iter_->Prev();
GetBlobValue(); while (!GetBlobValue()) {
iter_->Prev();
}
} }
Slice key() const override { Slice key() const override {
...@@ -76,10 +88,11 @@ class TitanDBIterator : public Iterator { ...@@ -76,10 +88,11 @@ class TitanDBIterator : public Iterator {
} }
private: private:
void GetBlobValue() { // return value: false means key has been deleted, we need to skipped it.
bool GetBlobValue() {
if (!iter_->Valid() || !iter_->IsBlob()) { if (!iter_->Valid() || !iter_->IsBlob()) {
status_ = iter_->status(); status_ = iter_->status();
return; return true;
} }
assert(iter_->status().ok()); assert(iter_->status().ok());
...@@ -96,17 +109,23 @@ class TitanDBIterator : public Iterator { ...@@ -96,17 +109,23 @@ class TitanDBIterator : public Iterator {
std::unique_ptr<BlobFilePrefetcher> prefetcher; std::unique_ptr<BlobFilePrefetcher> prefetcher;
status_ = storage_->NewPrefetcher(index.file_number, &prefetcher); status_ = storage_->NewPrefetcher(index.file_number, &prefetcher);
if (status_.IsCorruption()) { if (status_.IsCorruption()) {
// If use `DeleteFilesInRanges`, we may encounter this failure,
// because `DeleteFilesInRanges` may expose an old key which
// corresponding blob file has already been GCed out, so we
// cannot abort here.
fprintf(stderr, fprintf(stderr,
"key:%s GetBlobValue err:%s with sequence number:%" PRIu64 "\n", "key:%s GetBlobValue err:%s with sequence number:%" PRIu64 "\n",
iter_->key().ToString(true).c_str(), status_.ToString().c_str(), iter_->key().ToString(true).c_str(), status_.ToString().c_str(),
options_.snapshot->GetSequenceNumber()); options_.snapshot->GetSequenceNumber());
return false;
} }
if (!status_.ok()) return; if (!status_.ok()) return true;
it = files_.emplace(index.file_number, std::move(prefetcher)).first; it = files_.emplace(index.file_number, std::move(prefetcher)).first;
} }
buffer_.Reset(); buffer_.Reset();
status_ = it->second->Get(options_, index.blob_handle, &record_, &buffer_); status_ = it->second->Get(options_, index.blob_handle, &record_, &buffer_);
return true;
} }
Status status_; Status status_;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment