diff --git a/db/db_impl.cc b/db/db_impl.cc index b7d6fbcbc..07b4513df 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -6493,13 +6493,22 @@ Status DBImpl::IngestExternalFile( 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 - bool need_flush = false; - status = ingestion_job.NeedsFlush(&need_flush); - if (status.ok() && need_flush) { - mutex_.Unlock(); - status = FlushMemTable(cfd, FlushOptions(), true /* writes_stopped */); - mutex_.Lock(); + if (status.ok()) { + bool need_flush = false; + status = ingestion_job.NeedsFlush(&need_flush); + + if (status.ok() && need_flush) { + mutex_.Unlock(); + status = FlushMemTable(cfd, FlushOptions(), true /* writes_stopped */); + mutex_.Lock(); + } } // Run the ingestion job diff --git a/db/external_sst_file_test.cc b/db/external_sst_file_test.cc index 89ed999a4..731282b5e 100644 --- a/db/external_sst_file_test.cc +++ b/db/external_sst_file_test.cc @@ -1843,6 +1843,13 @@ TEST_F(ExternalSSTFileTest, FileWithCFInfo) { ASSERT_OK(db_->IngestExternalFile(handles_[2], {unknown_sst}, ifo)); // SST CF unknown 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 {