diff options
author | jorlow@chromium.org <jorlow@chromium.org@62dab493-f737-651d-591e-8d6aee1b9529> | 2011-03-28 20:43:44 +0000 |
---|---|---|
committer | jorlow@chromium.org <jorlow@chromium.org@62dab493-f737-651d-591e-8d6aee1b9529> | 2011-03-28 20:43:44 +0000 |
commit | e2da744e1241fec301351ca34730877e6cff722a (patch) | |
tree | 7e8e474bb5a8f038cf9e69e591529ee614d939d9 /db/version_set.cc | |
parent | e11bdf1935bc5a46db790ef414110149009f8c6a (diff) | |
download | leveldb-e2da744e1241fec301351ca34730877e6cff722a.tar.gz |
Upstream changes.
git-svn-id: https://leveldb.googlecode.com/svn/trunk@16 62dab493-f737-651d-591e-8d6aee1b9529
Diffstat (limited to 'db/version_set.cc')
-rw-r--r-- | db/version_set.cc | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/db/version_set.cc b/db/version_set.cc index caf0b2d..b826e5b 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -75,8 +75,8 @@ Version::~Version() { // An internal iterator. For a given version/level pair, yields // information about the files in the level. For a given entry, key() // is the largest key that occurs in the file, and value() is an -// 8-byte value containing the file number of the file, encoding using -// EncodeFixed64. +// 16-byte value containing the file number and file size, both +// encoded using EncodeFixed64. class Version::LevelFileNumIterator : public Iterator { public: LevelFileNumIterator(const Version* version, @@ -129,6 +129,7 @@ class Version::LevelFileNumIterator : public Iterator { Slice value() const { assert(Valid()); EncodeFixed64(value_buf_, (*flist_)[index_]->number); + EncodeFixed64(value_buf_+8, (*flist_)[index_]->file_size); return Slice(value_buf_, sizeof(value_buf_)); } virtual Status status() const { return Status::OK(); } @@ -137,18 +138,21 @@ class Version::LevelFileNumIterator : public Iterator { const std::vector<FileMetaData*>* const flist_; int index_; - mutable char value_buf_[8]; // Used for encoding the file number for value() + // Backing store for value(). Holds the file number and size. + mutable char value_buf_[16]; }; static Iterator* GetFileIterator(void* arg, const ReadOptions& options, const Slice& file_value) { TableCache* cache = reinterpret_cast<TableCache*>(arg); - if (file_value.size() != 8) { + if (file_value.size() != 16) { return NewErrorIterator( Status::Corruption("FileReader invoked with unexpected value")); } else { - return cache->NewIterator(options, DecodeFixed64(file_value.data())); + return cache->NewIterator(options, + DecodeFixed64(file_value.data()), + DecodeFixed64(file_value.data() + 8)); } } @@ -164,7 +168,8 @@ void Version::AddIterators(const ReadOptions& options, // Merge all level zero files together since they may overlap for (int i = 0; i < files_[0].size(); i++) { iters->push_back( - vset_->table_cache_->NewIterator(options, files_[0][i]->number)); + vset_->table_cache_->NewIterator( + options, files_[0][i]->number, files_[0][i]->file_size)); } // For levels > 0, we can use a concatenating iterator that sequentially @@ -650,7 +655,7 @@ uint64_t VersionSet::ApproximateOffsetOf(Version* v, const InternalKey& ikey) { // approximate offset of "ikey" within the table. Table* tableptr; Iterator* iter = table_cache_->NewIterator( - ReadOptions(), files[i]->number, &tableptr); + ReadOptions(), files[i]->number, files[i]->file_size, &tableptr); if (tableptr != NULL) { result += tableptr->ApproximateOffsetOf(ikey.Encode()); } @@ -855,7 +860,8 @@ Iterator* VersionSet::MakeInputIterator(Compaction* c) { if (c->level() + which == 0) { const std::vector<FileMetaData*>& files = c->inputs_[which]; for (int i = 0; i < files.size(); i++) { - list[num++] = table_cache_->NewIterator(options, files[i]->number); + list[num++] = table_cache_->NewIterator( + options, files[i]->number, files[i]->file_size); } } else { // Create concatenating iterator for the files from this level |