1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use crate::engine::RocksEngine;
use crate::util;
use engine_traits::ImportExt;
use engine_traits::IngestExternalFileOptions;
use engine_traits::Result;
use rocksdb::set_external_sst_file_global_seq_no;
use rocksdb::IngestExternalFileOptions as RawIngestExternalFileOptions;
use std::fs::File;
use std::path::Path;
impl ImportExt for RocksEngine {
type IngestExternalFileOptions = RocksIngestExternalFileOptions;
fn ingest_external_file_cf(
&self,
cf: &str,
opts: &Self::IngestExternalFileOptions,
files: &[&str],
) -> Result<()> {
let cf = util::get_cf_handle(self.as_inner(), cf)?;
let _did_nonblocking_memtable_flush = self
.as_inner()
.ingest_external_file_optimized(&cf, &opts.0, files)?;
Ok(())
}
fn reset_global_seq<P: AsRef<Path>>(&self, cf: &str, path: P) -> Result<()> {
let path = path.as_ref().to_str().unwrap();
let f = File::open(path)?;
let cf = util::get_cf_handle(self.as_inner(), cf)?;
set_external_sst_file_global_seq_no(&self.as_inner(), cf, path, 0)?;
f.sync_all()
.map_err(|e| format!("sync {}: {:?}", path, e))?;
Ok(())
}
}
pub struct RocksIngestExternalFileOptions(RawIngestExternalFileOptions);
impl IngestExternalFileOptions for RocksIngestExternalFileOptions {
fn new() -> RocksIngestExternalFileOptions {
RocksIngestExternalFileOptions(RawIngestExternalFileOptions::new())
}
fn move_files(&mut self, f: bool) {
self.0.move_files(f);
}
}