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