| 1477 | DB::~DB() = default; |
| 1478 | |
| 1479 | Status DB::Open(const Options& options, const std::string& dbname, DB** dbptr) { |
| 1480 | *dbptr = nullptr; |
| 1481 | |
| 1482 | DBImpl* impl = new DBImpl(options, dbname); |
| 1483 | impl->mutex_.Lock(); |
| 1484 | VersionEdit edit; |
| 1485 | // Recover handles create_if_missing, error_if_exists |
| 1486 | bool save_manifest = false; |
| 1487 | Status s = impl->Recover(&edit, &save_manifest); |
| 1488 | if (s.ok() && impl->mem_ == nullptr) { |
| 1489 | // Create new log and a corresponding memtable. |
| 1490 | uint64_t new_log_number = impl->versions_->NewFileNumber(); |
| 1491 | WritableFile* lfile; |
| 1492 | s = options.env->NewWritableFile(LogFileName(dbname, new_log_number), |
| 1493 | &lfile); |
| 1494 | if (s.ok()) { |
| 1495 | edit.SetLogNumber(new_log_number); |
| 1496 | impl->logfile_ = lfile; |
| 1497 | impl->logfile_number_ = new_log_number; |
| 1498 | impl->log_ = new log::Writer(lfile); |
| 1499 | impl->mem_ = new MemTable(impl->internal_comparator_); |
| 1500 | impl->mem_->Ref(); |
| 1501 | } |
| 1502 | } |
| 1503 | if (s.ok() && save_manifest) { |
| 1504 | edit.SetPrevLogNumber(0); // No older logs needed after recovery. |
| 1505 | edit.SetLogNumber(impl->logfile_number_); |
| 1506 | s = impl->versions_->LogAndApply(&edit, &impl->mutex_); |
| 1507 | } |
| 1508 | if (s.ok()) { |
| 1509 | impl->DeleteObsoleteFiles(); |
| 1510 | impl->MaybeScheduleCompaction(); |
| 1511 | } |
| 1512 | impl->mutex_.Unlock(); |
| 1513 | if (s.ok()) { |
| 1514 | assert(impl->mem_ != nullptr); |
| 1515 | *dbptr = impl; |
| 1516 | } else { |
| 1517 | delete impl; |
| 1518 | } |
| 1519 | return s; |
| 1520 | } |
| 1521 | |
| 1522 | Snapshot::~Snapshot() = default; |
| 1523 |
nothing calls this directly
no test coverage detected