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:
parent
b1124fa127
commit
bf152e7e48
@ -6418,14 +6418,23 @@ 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
|
||||||
|
if (status.ok()) {
|
||||||
bool need_flush = false;
|
bool need_flush = false;
|
||||||
status = ingestion_job.NeedsFlush(&need_flush);
|
status = ingestion_job.NeedsFlush(&need_flush);
|
||||||
|
|
||||||
if (status.ok() && need_flush) {
|
if (status.ok() && need_flush) {
|
||||||
mutex_.Unlock();
|
mutex_.Unlock();
|
||||||
status = FlushMemTable(cfd, FlushOptions(), true /* writes_stopped */);
|
status = FlushMemTable(cfd, FlushOptions(), true /* writes_stopped */);
|
||||||
mutex_.Lock();
|
mutex_.Lock();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Run the ingestion job
|
// Run the ingestion job
|
||||||
if (status.ok()) {
|
if (status.ok()) {
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user