rdedup_lib/aio/
backend.rs

1use std::io;
2use std::path::PathBuf;
3use std::sync::mpsc;
4
5use sgdata::SGData;
6
7/// A lock held on the backend
8///
9/// It doesn't do much, except unlock on `drop`.
10pub trait Lock {}
11
12/// Backend API
13///
14/// Backend is thread-safe, and the actual work
15/// is implemented by per-thread instances of it.
16pub trait Backend: Send + Sync {
17    /// Lock the repository exclusively
18    ///
19    /// Use to protect operations that are potentially destructive,
20    /// like GC.
21    fn lock_exclusive(&self) -> io::Result<Box<dyn Lock>>;
22    /// Lock the repository in shared mode
23    ///
24    /// This will only prevent anyone from grabing exclusive lock.
25    /// Use to protect operations that only add new data, like `write`.
26    fn lock_shared(&self) -> io::Result<Box<dyn Lock>>;
27
28    /// Spawn a new thread object of the backend.
29    fn new_thread(&self) -> io::Result<Box<dyn BackendThread>>;
30}
31
32pub trait BackendThread: Send {
33    fn remove_dir_all(&mut self, path: PathBuf) -> io::Result<()>;
34
35    fn rename(
36        &mut self,
37        src_path: PathBuf,
38        dst_path: PathBuf,
39    ) -> io::Result<()>;
40
41    fn write(
42        &mut self,
43        path: PathBuf,
44        sg: SGData,
45        idempotent: bool,
46    ) -> io::Result<()>;
47
48    fn read(&mut self, path: PathBuf) -> io::Result<SGData>;
49
50    fn remove(&mut self, path: PathBuf) -> io::Result<()>;
51
52    fn read_metadata(&mut self, path: PathBuf) -> io::Result<super::Metadata>;
53    fn list(&mut self, path: PathBuf) -> io::Result<Vec<PathBuf>>;
54
55    fn list_recursively(
56        &mut self,
57        path: PathBuf,
58        tx: mpsc::Sender<io::Result<Vec<PathBuf>>>,
59    );
60}