1 #pragma once 2 #include <string> 3 #include <unordered_set> 4 #include <vector> 5 6 #include "db/column_family.h" 7 #include "db/dbformat.h" 8 #include "db/external_sst_file_ingestion_job.h" 9 #include "db/snapshot_impl.h" 10 #include "options/db_options.h" 11 #include "rocksdb/db.h" 12 #include "rocksdb/env.h" 13 #include "rocksdb/metadata.h" 14 #include "rocksdb/sst_file_writer.h" 15 #include "util/autovector.h" 16 17 namespace ROCKSDB_NAMESPACE { 18 19 // Imports a set of sst files as is into a new column family. Logic is similar 20 // to ExternalSstFileIngestionJob. 21 class ImportColumnFamilyJob { 22 public: ImportColumnFamilyJob(Env * env,VersionSet * versions,ColumnFamilyData * cfd,const ImmutableDBOptions & db_options,const EnvOptions & env_options,const ImportColumnFamilyOptions & import_options,const std::vector<LiveFileMetaData> & metadata)23 ImportColumnFamilyJob(Env* env, VersionSet* versions, ColumnFamilyData* cfd, 24 const ImmutableDBOptions& db_options, 25 const EnvOptions& env_options, 26 const ImportColumnFamilyOptions& import_options, 27 const std::vector<LiveFileMetaData>& metadata) 28 : env_(env), 29 versions_(versions), 30 cfd_(cfd), 31 db_options_(db_options), 32 fs_(db_options_.fs.get()), 33 env_options_(env_options), 34 import_options_(import_options), 35 metadata_(metadata) {} 36 37 // Prepare the job by copying external files into the DB. 38 Status Prepare(uint64_t next_file_number, SuperVersion* sv); 39 40 // Will execute the import job and prepare edit() to be applied. 41 // REQUIRES: Mutex held 42 Status Run(); 43 44 // Cleanup after successful/failed job 45 void Cleanup(const Status& status); 46 edit()47 VersionEdit* edit() { return &edit_; } 48 files_to_import()49 const autovector<IngestedFileInfo>& files_to_import() const { 50 return files_to_import_; 51 } 52 53 private: 54 // Open the external file and populate `file_to_import` with all the 55 // external information we need to import this file. 56 Status GetIngestedFileInfo(const std::string& external_file, 57 IngestedFileInfo* file_to_import, 58 SuperVersion* sv); 59 60 Env* env_; 61 VersionSet* versions_; 62 ColumnFamilyData* cfd_; 63 const ImmutableDBOptions& db_options_; 64 FileSystem* fs_; 65 const EnvOptions& env_options_; 66 autovector<IngestedFileInfo> files_to_import_; 67 VersionEdit edit_; 68 const ImportColumnFamilyOptions& import_options_; 69 std::vector<LiveFileMetaData> metadata_; 70 }; 71 72 } // namespace ROCKSDB_NAMESPACE 73