Skip to content

Commit 45a5e3e

Browse files
Remove path with arena==nullptr from NewInternalIterator
Summary: Simply code by removing code path which does not use Arena from NewInternalIterator Test Plan: make all check make valgrind_check Reviewers: sdong Reviewed By: sdong Subscribers: leveldb Differential Revision: https://reviews.facebook.net/D22395
1 parent 5665e5e commit 45a5e3e

18 files changed

+240
-192
lines changed

db/db_impl.cc

+56-63
Original file line numberDiff line numberDiff line change
@@ -1415,31 +1415,32 @@ Status DBImpl::WriteLevel0TableForRecovery(ColumnFamilyData* cfd, MemTable* mem,
14151415
pending_outputs_[meta.fd.GetNumber()] = 0; // path 0 for level 0 file.
14161416
ReadOptions ro;
14171417
ro.total_order_seek = true;
1418-
Iterator* iter = mem->NewIterator(ro);
1419-
const SequenceNumber newest_snapshot = snapshots_.GetNewest();
1420-
const SequenceNumber earliest_seqno_in_memtable =
1421-
mem->GetFirstSequenceNumber();
1422-
Log(options_.info_log, "[%s] Level-0 table #%" PRIu64 ": started",
1423-
cfd->GetName().c_str(), meta.fd.GetNumber());
1424-
1418+
Arena arena;
14251419
Status s;
14261420
{
1427-
mutex_.Unlock();
1428-
s = BuildTable(dbname_, env_, *cfd->ioptions(), env_options_,
1429-
cfd->table_cache(), iter, &meta, cfd->internal_comparator(),
1430-
newest_snapshot, earliest_seqno_in_memtable,
1431-
GetCompressionFlush(*cfd->options()),
1432-
cfd->options()->compression_opts, Env::IO_HIGH);
1433-
LogFlush(options_.info_log);
1434-
mutex_.Lock();
1435-
}
1421+
ScopedArenaIterator iter(mem->NewIterator(ro, &arena));
1422+
const SequenceNumber newest_snapshot = snapshots_.GetNewest();
1423+
const SequenceNumber earliest_seqno_in_memtable =
1424+
mem->GetFirstSequenceNumber();
1425+
Log(options_.info_log, "[%s] Level-0 table #%" PRIu64 ": started",
1426+
cfd->GetName().c_str(), meta.fd.GetNumber());
14361427

1437-
Log(options_.info_log,
1438-
"[%s] Level-0 table #%" PRIu64 ": %" PRIu64 " bytes %s",
1439-
cfd->GetName().c_str(), meta.fd.GetNumber(), meta.fd.GetFileSize(),
1440-
s.ToString().c_str());
1441-
delete iter;
1428+
{
1429+
mutex_.Unlock();
1430+
s = BuildTable(
1431+
dbname_, env_, *cfd->ioptions(), env_options_, cfd->table_cache(),
1432+
iter.get(), &meta, cfd->internal_comparator(), newest_snapshot,
1433+
earliest_seqno_in_memtable, GetCompressionFlush(*cfd->options()),
1434+
cfd->options()->compression_opts, Env::IO_HIGH);
1435+
LogFlush(options_.info_log);
1436+
mutex_.Lock();
1437+
}
14421438

1439+
Log(options_.info_log,
1440+
"[%s] Level-0 table #%" PRIu64 ": %" PRIu64 " bytes %s",
1441+
cfd->GetName().c_str(), meta.fd.GetNumber(), meta.fd.GetFileSize(),
1442+
s.ToString().c_str());
1443+
}
14431444
pending_outputs_.erase(meta.fd.GetNumber());
14441445

14451446
// Note that if file_size is zero, the file has been deleted and
@@ -1485,24 +1486,27 @@ Status DBImpl::WriteLevel0Table(ColumnFamilyData* cfd,
14851486
std::vector<Iterator*> memtables;
14861487
ReadOptions ro;
14871488
ro.total_order_seek = true;
1489+
Arena arena;
14881490
for (MemTable* m : mems) {
14891491
Log(options_.info_log,
14901492
"[%s] Flushing memtable with next log file: %" PRIu64 "\n",
14911493
cfd->GetName().c_str(), m->GetNextLogNumber());
1492-
memtables.push_back(m->NewIterator(ro));
1494+
memtables.push_back(m->NewIterator(ro, &arena));
1495+
}
1496+
{
1497+
ScopedArenaIterator iter(NewMergingIterator(&cfd->internal_comparator(),
1498+
&memtables[0],
1499+
memtables.size(), &arena));
1500+
Log(options_.info_log, "[%s] Level-0 flush table #%" PRIu64 ": started",
1501+
cfd->GetName().c_str(), meta.fd.GetNumber());
1502+
1503+
s = BuildTable(
1504+
dbname_, env_, *cfd->ioptions(), env_options_, cfd->table_cache(),
1505+
iter.get(), &meta, cfd->internal_comparator(), newest_snapshot,
1506+
earliest_seqno_in_memtable, GetCompressionFlush(*cfd->options()),
1507+
cfd->options()->compression_opts, Env::IO_HIGH);
1508+
LogFlush(options_.info_log);
14931509
}
1494-
Iterator* iter = NewMergingIterator(&cfd->internal_comparator(),
1495-
&memtables[0], memtables.size());
1496-
Log(options_.info_log, "[%s] Level-0 flush table #%" PRIu64 ": started",
1497-
cfd->GetName().c_str(), meta.fd.GetNumber());
1498-
1499-
s = BuildTable(dbname_, env_, *cfd->ioptions(), env_options_,
1500-
cfd->table_cache(), iter, &meta, cfd->internal_comparator(),
1501-
newest_snapshot, earliest_seqno_in_memtable,
1502-
GetCompressionFlush(*cfd->options()),
1503-
cfd->options()->compression_opts, Env::IO_HIGH);
1504-
LogFlush(options_.info_log);
1505-
delete iter;
15061510
Log(options_.info_log,
15071511
"[%s] Level-0 flush table #%" PRIu64 ": %" PRIu64 " bytes %s",
15081512
cfd->GetName().c_str(), meta.fd.GetNumber(), meta.fd.GetFileSize(),
@@ -3349,31 +3353,18 @@ Iterator* DBImpl::NewInternalIterator(const ReadOptions& options,
33493353
SuperVersion* super_version,
33503354
Arena* arena) {
33513355
Iterator* internal_iter;
3352-
if (arena != nullptr) {
3353-
// Need to create internal iterator from the arena.
3354-
MergeIteratorBuilder merge_iter_builder(&cfd->internal_comparator(), arena);
3355-
// Collect iterator for mutable mem
3356-
merge_iter_builder.AddIterator(
3357-
super_version->mem->NewIterator(options, arena));
3358-
// Collect all needed child iterators for immutable memtables
3359-
super_version->imm->AddIterators(options, &merge_iter_builder);
3360-
// Collect iterators for files in L0 - Ln
3361-
super_version->current->AddIterators(options, env_options_,
3362-
&merge_iter_builder);
3363-
internal_iter = merge_iter_builder.Finish();
3364-
} else {
3365-
// Need to create internal iterator using malloc.
3366-
std::vector<Iterator*> iterator_list;
3367-
// Collect iterator for mutable mem
3368-
iterator_list.push_back(super_version->mem->NewIterator(options));
3369-
// Collect all needed child iterators for immutable memtables
3370-
super_version->imm->AddIterators(options, &iterator_list);
3371-
// Collect iterators for files in L0 - Ln
3372-
super_version->current->AddIterators(options, env_options_,
3373-
&iterator_list);
3374-
internal_iter = NewMergingIterator(&cfd->internal_comparator(),
3375-
&iterator_list[0], iterator_list.size());
3376-
}
3356+
assert(arena != nullptr);
3357+
// Need to create internal iterator from the arena.
3358+
MergeIteratorBuilder merge_iter_builder(&cfd->internal_comparator(), arena);
3359+
// Collect iterator for mutable mem
3360+
merge_iter_builder.AddIterator(
3361+
super_version->mem->NewIterator(options, arena));
3362+
// Collect all needed child iterators for immutable memtables
3363+
super_version->imm->AddIterators(options, &merge_iter_builder);
3364+
// Collect iterators for files in L0 - Ln
3365+
super_version->current->AddIterators(options, env_options_,
3366+
&merge_iter_builder);
3367+
internal_iter = merge_iter_builder.Finish();
33773368
IterState* cleanup = new IterState(this, &mutex_, super_version);
33783369
internal_iter->RegisterCleanup(CleanupIteratorState, cleanup, nullptr);
33793370

@@ -3790,10 +3781,12 @@ Status DBImpl::NewIterators(
37903781
? reinterpret_cast<const SnapshotImpl*>(options.snapshot)->number_
37913782
: latest_snapshot;
37923783

3793-
auto iter = NewInternalIterator(options, cfd, super_versions[i]);
3794-
iter = NewDBIterator(env_, *cfd->options(),
3795-
cfd->user_comparator(), iter, snapshot);
3796-
iterators->push_back(iter);
3784+
ArenaWrappedDBIter* db_iter = NewArenaWrappedDbIterator(
3785+
env_, *cfd->options(), cfd->user_comparator(), snapshot);
3786+
Iterator* internal_iter = NewInternalIterator(
3787+
options, cfd, super_versions[i], db_iter->GetArena());
3788+
db_iter->SetIterUnderDBIter(internal_iter);
3789+
iterators->push_back(db_iter);
37973790
}
37983791
}
37993792

db/db_impl.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "util/autovector.h"
3131
#include "util/stop_watch.h"
3232
#include "util/thread_local.h"
33+
#include "util/scoped_arena_iterator.h"
3334
#include "db/internal_stats.h"
3435

3536
namespace rocksdb {
@@ -173,8 +174,8 @@ class DBImpl : public DB {
173174
// Return an internal iterator over the current state of the database.
174175
// The keys of this iterator are internal keys (see format.h).
175176
// The returned iterator should be deleted when no longer needed.
176-
Iterator* TEST_NewInternalIterator(ColumnFamilyHandle* column_family =
177-
nullptr);
177+
Iterator* TEST_NewInternalIterator(
178+
Arena* arena, ColumnFamilyHandle* column_family = nullptr);
178179

179180
// Return the maximum overlapping data (in bytes) at next level for any
180181
// file at a level >= 1.
@@ -297,8 +298,7 @@ class DBImpl : public DB {
297298
Statistics* stats_;
298299

299300
Iterator* NewInternalIterator(const ReadOptions&, ColumnFamilyData* cfd,
300-
SuperVersion* super_version,
301-
Arena* arena = nullptr);
301+
SuperVersion* super_version, Arena* arena);
302302

303303
private:
304304
friend class DB;

db/db_impl_debug.cc

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ uint64_t DBImpl::TEST_GetLevel0TotalSize() {
2020
return default_cf_handle_->cfd()->current()->NumLevelBytes(0);
2121
}
2222

23-
Iterator* DBImpl::TEST_NewInternalIterator(ColumnFamilyHandle* column_family) {
23+
Iterator* DBImpl::TEST_NewInternalIterator(Arena* arena,
24+
ColumnFamilyHandle* column_family) {
2425
ColumnFamilyData* cfd;
2526
if (column_family == nullptr) {
2627
cfd = default_cf_handle_->cfd();
@@ -33,7 +34,7 @@ Iterator* DBImpl::TEST_NewInternalIterator(ColumnFamilyHandle* column_family) {
3334
SuperVersion* super_version = cfd->GetSuperVersion()->Ref();
3435
mutex_.Unlock();
3536
ReadOptions roptions;
36-
return NewInternalIterator(roptions, cfd, super_version);
37+
return NewInternalIterator(roptions, cfd, super_version, arena);
3738
}
3839

3940
int64_t DBImpl::TEST_MaxNextLevelOverlappingBytes(

0 commit comments

Comments
 (0)