@@ -1415,31 +1415,32 @@ Status DBImpl::WriteLevel0TableForRecovery(ColumnFamilyData* cfd, MemTable* mem,
1415
1415
pending_outputs_[meta.fd .GetNumber ()] = 0 ; // path 0 for level 0 file.
1416
1416
ReadOptions ro;
1417
1417
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;
1425
1419
Status s;
1426
1420
{
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 ());
1436
1427
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
+ }
1442
1438
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
+ }
1443
1444
pending_outputs_.erase (meta.fd .GetNumber ());
1444
1445
1445
1446
// Note that if file_size is zero, the file has been deleted and
@@ -1485,24 +1486,27 @@ Status DBImpl::WriteLevel0Table(ColumnFamilyData* cfd,
1485
1486
std::vector<Iterator*> memtables;
1486
1487
ReadOptions ro;
1487
1488
ro.total_order_seek = true ;
1489
+ Arena arena;
1488
1490
for (MemTable* m : mems) {
1489
1491
Log (options_.info_log ,
1490
1492
" [%s] Flushing memtable with next log file: %" PRIu64 " \n " ,
1491
1493
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 );
1493
1509
}
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;
1506
1510
Log (options_.info_log ,
1507
1511
" [%s] Level-0 flush table #%" PRIu64 " : %" PRIu64 " bytes %s" ,
1508
1512
cfd->GetName ().c_str (), meta.fd .GetNumber (), meta.fd .GetFileSize (),
@@ -3349,31 +3353,18 @@ Iterator* DBImpl::NewInternalIterator(const ReadOptions& options,
3349
3353
SuperVersion* super_version,
3350
3354
Arena* arena) {
3351
3355
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 ();
3377
3368
IterState* cleanup = new IterState (this , &mutex_, super_version);
3378
3369
internal_iter->RegisterCleanup (CleanupIteratorState, cleanup, nullptr );
3379
3370
@@ -3790,10 +3781,12 @@ Status DBImpl::NewIterators(
3790
3781
? reinterpret_cast <const SnapshotImpl*>(options.snapshot )->number_
3791
3782
: latest_snapshot;
3792
3783
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);
3797
3790
}
3798
3791
}
3799
3792
0 commit comments