Disallow ingesting files into dropped CFs

Summary:
This PR update IngestExternalFile to return an error if we try to ingest a file into a dropped CF.

Right now if IngestExternalFile want to flush a memtable, and it's ingesting a file into a dropped CF, it will wait forever since flushing is not possible for the dropped CF
Closes https://github.com/facebook/rocksdb/pull/1657

Differential Revision: D4318657

Pulled By: IslamAbdelRahman

fbshipit-source-id: ed6ea2b
This commit is contained in:
Islam AbdelRahman 2016-12-13 00:47:52 -08:00
parent b1124fa127
commit bf152e7e48
2 changed files with 22 additions and 6 deletions

View File

@ -6418,13 +6418,22 @@ Status DBImpl::IngestExternalFile(
num_running_ingest_file_++; num_running_ingest_file_++;
// We cannot ingest a file into a dropped CF
if (cfd->IsDropped()) {
status = Status::InvalidArgument(
"Cannot ingest an external file into a dropped CF");
}
// Figure out if we need to flush the memtable first // Figure out if we need to flush the memtable first
bool need_flush = false; if (status.ok()) {
status = ingestion_job.NeedsFlush(&need_flush); bool need_flush = false;
if (status.ok() && need_flush) { status = ingestion_job.NeedsFlush(&need_flush);
mutex_.Unlock();
status = FlushMemTable(cfd, FlushOptions(), true /* writes_stopped */); if (status.ok() && need_flush) {
mutex_.Lock(); mutex_.Unlock();
status = FlushMemTable(cfd, FlushOptions(), true /* writes_stopped */);
mutex_.Lock();
}
} }
// Run the ingestion job // Run the ingestion job

View File

@ -1843,6 +1843,13 @@ TEST_F(ExternalSSTFileTest, FileWithCFInfo) {
ASSERT_OK(db_->IngestExternalFile(handles_[2], {unknown_sst}, ifo)); ASSERT_OK(db_->IngestExternalFile(handles_[2], {unknown_sst}, ifo));
// SST CF unknown // SST CF unknown
ASSERT_OK(db_->IngestExternalFile(handles_[0], {unknown_sst}, ifo)); ASSERT_OK(db_->IngestExternalFile(handles_[0], {unknown_sst}, ifo));
// Cannot ingest a file into a dropped CF
ASSERT_OK(db_->DropColumnFamily(handles_[1]));
ASSERT_NOK(db_->IngestExternalFile(handles_[1], {unknown_sst}, ifo));
// CF was not dropped, ok to Ingest
ASSERT_OK(db_->IngestExternalFile(handles_[2], {unknown_sst}, ifo));
} }
class TestIngestExternalFileListener : public EventListener { class TestIngestExternalFileListener : public EventListener {