#ifndef ROCKSDB_LITE
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <inttypes.h>
#include <stdint.h>
#include <algorithm>
#include <string>
#include "db/db_impl.h"
#include "db/job_context.h"
#include "db/version_set.h"
#include "port/port.h"
#include "rocksdb/db.h"
#include "rocksdb/env.h"
#include "util/file_util.h"
#include "util/filename.h"
#include "util/mutexlock.h"
#include "util/sync_point.h"
namespace
rocksdb {
Status DBImpl::DisableFileDeletions() {
InstrumentedMutexLock l(&mutex_);
++disable_delete_obsolete_files_;
if
(disable_delete_obsolete_files_ == 1) {
ROCKS_LOG_INFO(immutable_db_options_.info_log,
"File Deletions Disabled"
);
}
else
{
ROCKS_LOG_WARN(immutable_db_options_.info_log,
"File Deletions Disabled, but already disabled. Counter: %d"
,
disable_delete_obsolete_files_);
}
return
Status::OK();
}
Status DBImpl::EnableFileDeletions(
bool
force) {
JobContext job_context(0);
bool
should_purge_files =
false
;
{
InstrumentedMutexLock l(&mutex_);
if
(force) {
disable_delete_obsolete_files_ = 0;
}
else
if
(disable_delete_obsolete_files_ > 0) {
--disable_delete_obsolete_files_;
}
if
(disable_delete_obsolete_files_ == 0) {
ROCKS_LOG_INFO(immutable_db_options_.info_log,
"File Deletions Enabled"
);
should_purge_files =
true
;
FindObsoleteFiles(&job_context,
true
);
bg_cv_.SignalAll();
}
else
{
ROCKS_LOG_WARN(
immutable_db_options_.info_log,
"File Deletions Enable, but not really enabled. Counter: %d"
,
disable_delete_obsolete_files_);
}
}
if
(should_purge_files) {
PurgeObsoleteFiles(job_context);
}
job_context.Clean();
LogFlush(immutable_db_options_.info_log);
return
Status::OK();
}
int
DBImpl::IsFileDeletionsEnabled()
const
{
return
!disable_delete_obsolete_files_;
}
Status DBImpl::GetLiveFiles(std::vector<std::string>& ret,
uint64_t* manifest_file_size,
bool
flush_memtable) {
*manifest_file_size = 0;
mutex_.Lock();
if
(flush_memtable) {
Status status;
for
(
auto
cfd : *versions_->GetColumnFamilySet()) {
if
(cfd->IsDropped()) {
continue
;
}
cfd->Ref();
mutex_.Unlock();
status = FlushMemTable(cfd, FlushOptions(), FlushReason::kGetLiveFiles);
TEST_SYNC_POINT(
"DBImpl::GetLiveFiles:1"
);
TEST_SYNC_POINT(
"DBImpl::GetLiveFiles:2"
);
mutex_.Lock();
cfd->Unref();
if
(!status.ok()) {
break
;
}
}
versions_->GetColumnFamilySet()->FreeDeadColumnFamilies();
if
(!status.ok()) {
mutex_.Unlock();
ROCKS_LOG_ERROR(immutable_db_options_.info_log,
"Cannot Flush data %s\n"
,
status.ToString().c_str());
return
status;
}
}
std::vector<FileDescriptor> live;
for
(
auto
cfd : *versions_->GetColumnFamilySet()) {
if
(cfd->IsDropped()) {
continue
;
}
cfd->current()->AddLiveFiles(&live);
}
ret.clear();
ret.reserve(live.size() + 3);
for
(
auto
live_file : live) {
ret.push_back(MakeTableFileName(
""
, live_file.GetNumber()));
}
ret.push_back(CurrentFileName(
""
));
ret.push_back(DescriptorFileName(
""
, versions_->manifest_file_number()));
ret.push_back(OptionsFileName(
""
, versions_->options_file_number()));
*manifest_file_size = versions_->manifest_file_size();
mutex_.Unlock();
return
Status::OK();
}
Status DBImpl::GetSortedWalFiles(VectorLogPtr& files) {
{
InstrumentedMutexLock l(&mutex_);
while
(disable_delete_obsolete_files_ > 0 &&
pending_purge_obsolete_files_ > 0) {
bg_cv_.Wait();
}
}
return
wal_manager_.GetSortedWalFiles(files);
}
}
#endif // ROCKSDB_LITE