From: Islam AbdelRahman Date: Tue, 13 Dec 2016 08:47:52 +0000 (-0800) Subject: Disallow ingesting files into dropped CFs X-Git-Tag: rocksdb-4.13.5~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bf152e7e48ed834b3a4a1290424bdfe35acb2791;p=rocksdb.git 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 --- diff --git a/db/db_impl.cc b/db/db_impl.cc index b5d52a92..67658e93 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -6418,13 +6418,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 89ed999a..731282b5 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 {