forked from facebook/rocksdb
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refactor ArenaWrappedDBIter into separate files (facebook#5801)
Summary: Move definition and implementation for ArenaWrappedDBIter into its own .h/.cc files. Also, change inlining of functions to better comply with the Google C++ style guide. Pull Request resolved: facebook#5801 Test Plan: make check Differential Revision: D17371012 Pulled By: anand1976 fbshipit-source-id: c1361abc2851575111e357a63d88be3b3d6cb341
- Loading branch information
1 parent
2fdc326
commit 855f2d3
Showing
15 changed files
with
551 additions
and
499 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. | ||
// This source code is licensed under both the GPLv2 (found in the | ||
// COPYING file in the root directory) and Apache 2.0 License | ||
// (found in the LICENSE.Apache file in the root directory). | ||
// | ||
// Copyright (c) 2011 The LevelDB Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. See the AUTHORS file for names of contributors. | ||
|
||
#include "db/arena_wrapped_db_iter.h" | ||
#include "memory/arena.h" | ||
#include "rocksdb/env.h" | ||
#include "rocksdb/iterator.h" | ||
#include "rocksdb/options.h" | ||
#include "table/internal_iterator.h" | ||
#include "table/iterator_wrapper.h" | ||
#include "util/user_comparator_wrapper.h" | ||
|
||
namespace rocksdb { | ||
|
||
Status ArenaWrappedDBIter::GetProperty(std::string prop_name, | ||
std::string* prop) { | ||
if (prop_name == "rocksdb.iterator.super-version-number") { | ||
// First try to pass the value returned from inner iterator. | ||
if (!db_iter_->GetProperty(prop_name, prop).ok()) { | ||
*prop = ToString(sv_number_); | ||
} | ||
return Status::OK(); | ||
} | ||
return db_iter_->GetProperty(prop_name, prop); | ||
} | ||
|
||
void ArenaWrappedDBIter::Init(Env* env, const ReadOptions& read_options, | ||
const ImmutableCFOptions& cf_options, | ||
const MutableCFOptions& mutable_cf_options, | ||
const SequenceNumber& sequence, | ||
uint64_t max_sequential_skip_in_iteration, | ||
uint64_t version_number, | ||
ReadCallback* read_callback, DBImpl* db_impl, | ||
ColumnFamilyData* cfd, bool allow_blob, | ||
bool allow_refresh) { | ||
auto mem = arena_.AllocateAligned(sizeof(DBIter)); | ||
db_iter_ = new (mem) DBIter(env, read_options, cf_options, mutable_cf_options, | ||
cf_options.user_comparator, nullptr, sequence, | ||
true, max_sequential_skip_in_iteration, | ||
read_callback, db_impl, cfd, allow_blob); | ||
sv_number_ = version_number; | ||
allow_refresh_ = allow_refresh; | ||
} | ||
|
||
Status ArenaWrappedDBIter::Refresh() { | ||
if (cfd_ == nullptr || db_impl_ == nullptr || !allow_refresh_) { | ||
return Status::NotSupported("Creating renew iterator is not allowed."); | ||
} | ||
assert(db_iter_ != nullptr); | ||
// TODO(yiwu): For last_seq_same_as_publish_seq_==false, this is not the | ||
// correct behavior. Will be corrected automatically when we take a snapshot | ||
// here for the case of WritePreparedTxnDB. | ||
SequenceNumber latest_seq = db_impl_->GetLatestSequenceNumber(); | ||
uint64_t cur_sv_number = cfd_->GetSuperVersionNumber(); | ||
if (sv_number_ != cur_sv_number) { | ||
Env* env = db_iter_->env(); | ||
db_iter_->~DBIter(); | ||
arena_.~Arena(); | ||
new (&arena_) Arena(); | ||
|
||
SuperVersion* sv = cfd_->GetReferencedSuperVersion(db_impl_->mutex()); | ||
if (read_callback_) { | ||
read_callback_->Refresh(latest_seq); | ||
} | ||
Init(env, read_options_, *(cfd_->ioptions()), sv->mutable_cf_options, | ||
latest_seq, sv->mutable_cf_options.max_sequential_skip_in_iterations, | ||
cur_sv_number, read_callback_, db_impl_, cfd_, allow_blob_, | ||
allow_refresh_); | ||
|
||
InternalIterator* internal_iter = db_impl_->NewInternalIterator( | ||
read_options_, cfd_, sv, &arena_, db_iter_->GetRangeDelAggregator(), | ||
latest_seq); | ||
SetIterUnderDBIter(internal_iter); | ||
} else { | ||
db_iter_->set_sequence(latest_seq); | ||
db_iter_->set_valid(false); | ||
} | ||
return Status::OK(); | ||
} | ||
|
||
ArenaWrappedDBIter* NewArenaWrappedDbIterator( | ||
Env* env, const ReadOptions& read_options, | ||
const ImmutableCFOptions& cf_options, | ||
const MutableCFOptions& mutable_cf_options, const SequenceNumber& sequence, | ||
uint64_t max_sequential_skip_in_iterations, uint64_t version_number, | ||
ReadCallback* read_callback, DBImpl* db_impl, ColumnFamilyData* cfd, | ||
bool allow_blob, bool allow_refresh) { | ||
ArenaWrappedDBIter* iter = new ArenaWrappedDBIter(); | ||
iter->Init(env, read_options, cf_options, mutable_cf_options, sequence, | ||
max_sequential_skip_in_iterations, version_number, read_callback, | ||
db_impl, cfd, allow_blob, allow_refresh); | ||
if (db_impl != nullptr && cfd != nullptr && allow_refresh) { | ||
iter->StoreRefreshInfo(read_options, db_impl, cfd, read_callback, | ||
allow_blob); | ||
} | ||
|
||
return iter; | ||
} | ||
|
||
} // namespace rocksdb |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. | ||
// This source code is licensed under both the GPLv2 (found in the | ||
// COPYING file in the root directory) and Apache 2.0 License | ||
// (found in the LICENSE.Apache file in the root directory). | ||
// | ||
// Copyright (c) 2011 The LevelDB Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. See the AUTHORS file for names of contributors. | ||
|
||
#pragma once | ||
#include <stdint.h> | ||
#include <string> | ||
#include "db/db_impl/db_impl.h" | ||
#include "db/db_iter.h" | ||
#include "db/dbformat.h" | ||
#include "db/range_del_aggregator.h" | ||
#include "memory/arena.h" | ||
#include "options/cf_options.h" | ||
#include "rocksdb/db.h" | ||
#include "rocksdb/iterator.h" | ||
#include "util/autovector.h" | ||
|
||
namespace rocksdb { | ||
|
||
class Arena; | ||
|
||
// A wrapper iterator which wraps DB Iterator and the arena, with which the DB | ||
// iterator is supposed to be allocated. This class is used as an entry point of | ||
// a iterator hierarchy whose memory can be allocated inline. In that way, | ||
// accessing the iterator tree can be more cache friendly. It is also faster | ||
// to allocate. | ||
// When using the class's Iterator interface, the behavior is exactly | ||
// the same as the inner DBIter. | ||
class ArenaWrappedDBIter : public Iterator { | ||
public: | ||
virtual ~ArenaWrappedDBIter() { db_iter_->~DBIter(); } | ||
|
||
// Get the arena to be used to allocate memory for DBIter to be wrapped, | ||
// as well as child iterators in it. | ||
virtual Arena* GetArena() { return &arena_; } | ||
virtual ReadRangeDelAggregator* GetRangeDelAggregator() { | ||
return db_iter_->GetRangeDelAggregator(); | ||
} | ||
|
||
// Set the internal iterator wrapped inside the DB Iterator. Usually it is | ||
// a merging iterator. | ||
virtual void SetIterUnderDBIter(InternalIterator* iter) { | ||
static_cast<DBIter*>(db_iter_)->SetIter(iter); | ||
} | ||
|
||
virtual bool Valid() const override { return db_iter_->Valid(); } | ||
virtual void SeekToFirst() override { db_iter_->SeekToFirst(); } | ||
virtual void SeekToLast() override { db_iter_->SeekToLast(); } | ||
virtual void Seek(const Slice& target) override { db_iter_->Seek(target); } | ||
virtual void SeekForPrev(const Slice& target) override { | ||
db_iter_->SeekForPrev(target); | ||
} | ||
virtual void Next() override { db_iter_->Next(); } | ||
virtual void Prev() override { db_iter_->Prev(); } | ||
virtual Slice key() const override { return db_iter_->key(); } | ||
virtual Slice value() const override { return db_iter_->value(); } | ||
virtual Status status() const override { return db_iter_->status(); } | ||
bool IsBlob() const { return db_iter_->IsBlob(); } | ||
|
||
virtual Status GetProperty(std::string prop_name, std::string* prop) override; | ||
|
||
virtual Status Refresh() override; | ||
|
||
void Init(Env* env, const ReadOptions& read_options, | ||
const ImmutableCFOptions& cf_options, | ||
const MutableCFOptions& mutable_cf_options, | ||
const SequenceNumber& sequence, | ||
uint64_t max_sequential_skip_in_iterations, uint64_t version_number, | ||
ReadCallback* read_callback, DBImpl* db_impl, ColumnFamilyData* cfd, | ||
bool allow_blob, bool allow_refresh); | ||
|
||
// Store some parameters so we can refresh the iterator at a later point | ||
// with these same params | ||
void StoreRefreshInfo(const ReadOptions& read_options, DBImpl* db_impl, | ||
ColumnFamilyData* cfd, ReadCallback* read_callback, | ||
bool allow_blob) { | ||
read_options_ = read_options; | ||
db_impl_ = db_impl; | ||
cfd_ = cfd; | ||
read_callback_ = read_callback; | ||
allow_blob_ = allow_blob; | ||
} | ||
|
||
private: | ||
DBIter* db_iter_; | ||
Arena arena_; | ||
uint64_t sv_number_; | ||
ColumnFamilyData* cfd_ = nullptr; | ||
DBImpl* db_impl_ = nullptr; | ||
ReadOptions read_options_; | ||
ReadCallback* read_callback_; | ||
bool allow_blob_ = false; | ||
bool allow_refresh_ = true; | ||
}; | ||
|
||
// Generate the arena wrapped iterator class. | ||
// `db_impl` and `cfd` are used for reneweal. If left null, renewal will not | ||
// be supported. | ||
extern ArenaWrappedDBIter* NewArenaWrappedDbIterator( | ||
Env* env, const ReadOptions& read_options, | ||
const ImmutableCFOptions& cf_options, | ||
const MutableCFOptions& mutable_cf_options, const SequenceNumber& sequence, | ||
uint64_t max_sequential_skip_in_iterations, uint64_t version_number, | ||
ReadCallback* read_callback, DBImpl* db_impl = nullptr, | ||
ColumnFamilyData* cfd = nullptr, bool allow_blob = false, | ||
bool allow_refresh = true); | ||
} // namespace rocksdb |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.