const std::string& dbname, Env* env, const ImmutableCFOptions& ioptions,
const MutableCFOptions& mutable_cf_options, const EnvOptions& env_options,
TableCache* table_cache, InternalIterator* iter,
- ScopedArenaIterator&& range_del_iter, FileMetaData* meta,
+ std::unique_ptr<InternalIterator> range_del_iter, FileMetaData* meta,
const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories,
const std::string& dbname, Env* env, const ImmutableCFOptions& options,
const MutableCFOptions& mutable_cf_options, const EnvOptions& env_options,
TableCache* table_cache, InternalIterator* iter,
- ScopedArenaIterator&& range_del_iter, FileMetaData* meta,
+ std::unique_ptr<InternalIterator> range_del_iter, FileMetaData* meta,
const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories,
s = BuildTable(
dbname_, env_, *cfd->ioptions(), mutable_cf_options, env_options_,
cfd->table_cache(), iter.get(),
- ScopedArenaIterator(mem->NewRangeTombstoneIterator(ro, &arena)),
+ std::unique_ptr<InternalIterator>(mem->NewRangeTombstoneIterator(ro)),
&meta, cfd->internal_comparator(),
cfd->int_tbl_prop_collector_factories(), cfd->GetID(), cfd->GetName(),
snapshot_seqs, earliest_write_conflict_snapshot,
// Collect iterator for mutable mem
merge_iter_builder.AddIterator(
super_version->mem->NewIterator(read_options, arena));
- ScopedArenaIterator range_del_iter;
+ std::unique_ptr<InternalIterator> range_del_iter;
Status s;
if (!read_options.ignore_range_deletions) {
- range_del_iter.set(
- super_version->mem->NewRangeTombstoneIterator(read_options, arena));
+ range_del_iter.reset(
+ super_version->mem->NewRangeTombstoneIterator(read_options));
s = range_del_agg->AddTombstones(std::move(range_del_iter));
}
// Collect all needed child iterators for immutable memtables
"[%s] [JOB %d] Flushing memtable with next log file: %" PRIu64 "\n",
cfd_->GetName().c_str(), job_context_->job_id, m->GetNextLogNumber());
memtables.push_back(m->NewIterator(ro, &arena));
- range_del_iters.push_back(m->NewRangeTombstoneIterator(ro, &arena));
+ range_del_iters.push_back(m->NewRangeTombstoneIterator(ro));
total_num_entries += m->num_entries();
total_num_deletes += m->num_deletes();
total_memory_usage += m->ApproximateMemoryUsage();
ScopedArenaIterator iter(
NewMergingIterator(&cfd_->internal_comparator(), &memtables[0],
static_cast<int>(memtables.size()), &arena));
- ScopedArenaIterator range_del_iter(NewMergingIterator(
+ std::unique_ptr<InternalIterator> range_del_iter(NewMergingIterator(
&cfd_->internal_comparator(), &range_del_iters[0],
- static_cast<int>(range_del_iters.size()), &arena));
+ static_cast<int>(range_del_iters.size())));
Log(InfoLogLevel::INFO_LEVEL, db_options_.info_log,
"[%s] [JOB %d] Level-0 flush table #%" PRIu64 ": started",
cfd_->GetName().c_str(), job_context_->job_id, meta_.fd.GetNumber());
}
InternalIterator* MemTable::NewRangeTombstoneIterator(
- const ReadOptions& read_options, Arena* arena) {
- assert(arena != nullptr);
+ const ReadOptions& read_options) {
if (read_options.ignore_range_deletions) {
- return NewEmptyInternalIterator(arena);
+ return NewEmptyInternalIterator();
}
- auto mem = arena->AllocateAligned(sizeof(MemTableIterator));
- return new (mem) MemTableIterator(*this, read_options, arena,
- true /* use_range_del_table */);
+ return new MemTableIterator(*this, read_options, nullptr /* arena */,
+ true /* use_range_del_table */);
}
port::RWMutex* MemTable::GetLock(const Slice& key) {
if (prefix_bloom_) {
PERF_COUNTER_ADD(bloom_memtable_hit_count, 1);
}
- ScopedArenaIterator range_del_iter(
- NewRangeTombstoneIterator(read_opts, range_del_agg->GetArena()));
+ std::unique_ptr<InternalIterator> range_del_iter(
+ NewRangeTombstoneIterator(read_opts));
Status status = range_del_agg->AddTombstones(std::move(range_del_iter));
if (!status.ok()) {
*s = status;
// those allocated in arena.
InternalIterator* NewIterator(const ReadOptions& read_options, Arena* arena);
- InternalIterator* NewRangeTombstoneIterator(const ReadOptions& read_options,
- Arena* arena);
+ InternalIterator* NewRangeTombstoneIterator(const ReadOptions& read_options);
// Add an entry into memtable that maps key to value at the
// specified sequence number and with the specified type.
RangeDelAggregator* range_del_agg) {
assert(range_del_agg != nullptr);
for (auto& m : memlist_) {
- ScopedArenaIterator range_del_iter(
- m->NewRangeTombstoneIterator(read_opts, arena));
+ std::unique_ptr<InternalIterator> range_del_iter(
+ m->NewRangeTombstoneIterator(read_opts));
Status s = range_del_agg->AddTombstones(std::move(range_del_iter));
if (!s.ok()) {
return s;
return false;
}
-Status RangeDelAggregator::AddTombstones(ScopedArenaIterator input) {
- return AddTombstones(input.release(), true /* arena */);
-}
-
Status RangeDelAggregator::AddTombstones(
std::unique_ptr<InternalIterator> input) {
- return AddTombstones(input.release(), false /* arena */);
-}
-
-Status RangeDelAggregator::AddTombstones(InternalIterator* input, bool arena) {
+ if (input == nullptr) {
+ return Status::OK();
+ }
input->SeekToFirst();
bool first_iter = true;
while (input->Valid()) {
input->Next();
}
if (!first_iter) {
- rep_->pinned_iters_mgr_.PinIterator(input, arena);
- } else if (arena) {
- input->~InternalIterator();
- } else {
- delete input;
+ rep_->pinned_iters_mgr_.PinIterator(input.release(), false /* arena */);
}
return Status::OK();
}
// Adds tombstones to the tombstone aggregation structure maintained by this
// object.
// @return non-OK status if any of the tombstone keys are corrupted.
- Status AddTombstones(ScopedArenaIterator input);
Status AddTombstones(std::unique_ptr<InternalIterator> input);
// Writes tombstones covering a range to a table builder.
void AddToBuilder(TableBuilder* builder, const Slice* lower_bound,
const Slice* upper_bound, FileMetaData* meta,
bool bottommost_level = false);
- Arena* GetArena() { return &arena_; }
bool IsEmpty();
private:
// once the first range deletion is encountered.
void InitRep(const std::vector<SequenceNumber>& snapshots);
- Status AddTombstones(InternalIterator* input, bool arena);
TombstoneMap& GetTombstoneMap(SequenceNumber seq);
SequenceNumber upper_bound_;
- Arena arena_; // must be destroyed after pinned_iters_mgr_ which references
- // memory in this arena
std::unique_ptr<Rep> rep_;
const InternalKeyComparator icmp_;
};
+
} // namespace rocksdb
status = BuildTable(
dbname_, env_, *cfd->ioptions(), *cfd->GetLatestMutableCFOptions(),
env_options_, table_cache_, iter.get(),
- ScopedArenaIterator(mem->NewRangeTombstoneIterator(ro, &arena)),
+ std::unique_ptr<InternalIterator>(mem->NewRangeTombstoneIterator(ro)),
&meta, cfd->internal_comparator(),
cfd->int_tbl_prop_collector_factories(), cfd->GetID(), cfd->GetName(),
{}, kMaxSequenceNumber, kNoCompression, CompressionOptions(), false,
int merge_count = 0;
for (int i = 0; i < 2; ++i) {
Arena arena;
- auto iter =
- i == 0 ? ScopedArenaIterator(mem->NewIterator(ReadOptions(), &arena))
- : ScopedArenaIterator(
- mem->NewRangeTombstoneIterator(ReadOptions(), &arena));
+ ScopedArenaIterator arena_iter_guard;
+ std::unique_ptr<InternalIterator> iter_guard;
+ InternalIterator* iter;
+ if (i == 0) {
+ iter = mem->NewIterator(ReadOptions(), &arena);
+ arena_iter_guard.set(iter);
+ } else {
+ iter = mem->NewRangeTombstoneIterator(ReadOptions());
+ iter_guard.reset(iter);
+ }
for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
ParsedInternalKey ikey;
memset((void*)&ikey, 0, sizeof(ikey));
for (int i = 0; i < 2; ++i) {
Arena arena;
- ScopedArenaIterator iter =
- i == 0
- ? ScopedArenaIterator(memtable->NewIterator(ReadOptions(), &arena))
- : ScopedArenaIterator(
- memtable->NewRangeTombstoneIterator(ReadOptions(), &arena));
+ ScopedArenaIterator arena_iter_guard;
+ std::unique_ptr<InternalIterator> iter_guard;
+ InternalIterator* iter;
+ if (i == 0) {
+ iter = memtable->NewIterator(ReadOptions(), &arena);
+ arena_iter_guard.set(iter);
+ } else {
+ iter = memtable->NewRangeTombstoneIterator(ReadOptions());
+ iter_guard.reset(iter);
+ }
iter->SeekToFirst();
while (iter->Valid()) {
fprintf(stderr, "key: '%s' -> '%s'\n", iter->key().ToString().c_str(),