Implement FuseFS — wrap around FileSystem that implements fuser::Filesystem trait to mount it. - #7
Implement FuseFS — wrap around FileSystem that implements fuser::Filesystem trait to mount it. #7Ycyken wants to merge 61 commits into
Conversation
|
|
||
| /// Retrieves a multitude of values, corresponding to the keys, in the correct order. | ||
| fn get_multi(&self, keys: &[K]) -> io::Result<Vec<V>> { | ||
| fn get_multi(&self, keys: Vec<&K>) -> io::Result<Vec<V>> { |
There was a problem hiding this comment.
| fn get_multi(&self, keys: Vec<&K>) -> io::Result<Vec<V>> { | |
| fn get_multi(&self, keys: &[&K]) -> io::Result<Vec<V>> { |
так работает?
| } | ||
|
|
||
| pub fn offset(&self) -> &usize { | ||
| &self.offset |
There was a problem hiding this comment.
usize предпочтительнее чем &usize (они занимают одинаково места в памяти)
| .storage | ||
| .retrieve(spans.iter().map(|span| span.hash()).collect())?; | ||
|
|
||
| let first_span = spans.first().unwrap(); |
There was a problem hiding this comment.
в чем смысл этих двух действий внизу?
There was a problem hiding this comment.
Т.к. мы читаем по оффсету, который может быть не ровно по оффсету FileSpan, а где-то посередине, то надо убрать лишнее в начале первого спана и лишнее в конце последнего спана. Добавил побольше комментариев
| /// Retrieves the data from the storage based on hashes of the data [`segments`][Segment], | ||
| /// or Error(NotFound) if some of the hashes were not present in the base. | ||
| pub fn retrieve(&self, request: &[Hash]) -> io::Result<Vec<Vec<u8>>> { | ||
| pub fn retrieve(&self, request: Vec<&Hash>) -> io::Result<Vec<Vec<u8>>> { |
There was a problem hiding this comment.
| pub fn retrieve(&self, request: Vec<&Hash>) -> io::Result<Vec<Vec<u8>>> { | |
| pub fn retrieve(&self, request: &[&Hash]) -> io::Result<Vec<Vec<u8>>> { |
и снизу можно будет убрать .iter().collect() который не к месту
| } | ||
|
|
||
| pub fn offset(&self) -> usize { | ||
| self.offset.clone() |
There was a problem hiding this comment.
clone не нужен, usize маленький тип и имплементит Copy, потому он автоматически скопируется
| FileAttr, FileType, Filesystem, ReplyAttr, ReplyCreate, ReplyData, ReplyDirectory, ReplyEmpty, | ||
| ReplyEntry, ReplyOpen, ReplyWrite, Request, TimeOrNow, | ||
| }; | ||
| use libc::{ |
There was a problem hiding this comment.
убери эту строку импорта и вставь везде префикс libc где используются константы
|
|
||
| let session = fuser::spawn_mount2(fuse_fs, MOUNT_POINT, &vec![]).unwrap(); | ||
|
|
||
| let file_path = format!("{}/{}", MOUNT_POINT, "file"); |
There was a problem hiding this comment.
можно MOUNT_POINT сделать Path и file_path инициализировать через MOUNT_POINT.join(...)
| } | ||
| let last_span = spans.last().unwrap(); |
There was a problem hiding this comment.
| } | |
| let last_span = spans.last().unwrap(); | |
| } | |
| let last_span = spans.last().unwrap(); |
| // Since we read by offset, which may be somewhere in the middle of the FileSpan offset, | ||
| // we need to remove the extra at the beginning of the first span | ||
| let first_span = spans.first().unwrap(); | ||
| let last_span = spans.last().unwrap(); |
There was a problem hiding this comment.
перекинь last_span чуть ниже, перед read_size_possible
| /// Starting point is based on the `FileHandle`'s offset. | ||
| /// | ||
| /// If `size` + file handle offset is greater than file size, then returns FileSpans up to the end of the file. | ||
| pub fn read(&self, handle: &mut FileHandle, size: usize) -> Vec<&FileSpan<Hash>> { |
There was a problem hiding this comment.
почему он возвращает вектор FileSpan а не Hash?
There was a problem hiding this comment.
Потому что если возвращать просто хэши, то будет непонятно, как обрезать данные в FileSystem::read(), т.к. информация об оффсетах потерялась. Можно попробовать возвращать вместе с хэшами какую-то информацию о начале и конце первого/последнего спана, но звучит не очень.
| pub fn read_from_file(&self, handle: &mut FileHandle) -> io::Result<Vec<u8>> { | ||
| let hashes = self.file_layer.read(handle); | ||
| Ok(self.storage.retrieve(&hashes)?.concat()) | ||
| pub fn read_1mb_from_file(&self, handle: &mut FileHandle) -> io::Result<Vec<u8>> { |
There was a problem hiding this comment.
лучше вернуть на read_from_file
There was a problem hiding this comment.
по-хорошему бы накидать миллион тестов, проверяющих инварианты фьюза (не можем открыть файл к которому нет прав доступа, не можем создать папку, лукап работает верно, связка гетаттр/сетаттр и т.д.),
а чтобы в каждом из них не инициализировать это все в несколько строк, можно написать структурку FuseFixture, у которой будет какой-нибудь new или default, в нем будет собственно инициализация, монтирование и создание файла. к нему можно прикрутить методы типа "получить этот файл", а затем создавать через let fs = FuseFixture::new(); let file = fs.file()
тестов пока очень мало
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
…f fh counter Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
…orrect read() Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Piletskii-Oleg
left a comment
There was a problem hiding this comment.
норм, замечания по мелочи
| Ok(()) | ||
| } | ||
|
|
||
| fn drop_cache(&mut self, file: Inode, handle: Fh) -> io::Result<()> { |
There was a problem hiding this comment.
добавил больше документации
| } | ||
| #[test] |
There was a problem hiding this comment.
пробельчики
| } | |
| #[test] | |
| } | |
| #[test] |
| }; | ||
| let read_denied = || { | ||
| let res = OpenOptions::new().read(true).open(&file_path); | ||
| assert!(res.is_err()); |
There was a problem hiding this comment.
добавил проверку на PermissionDenied
|
|
||
| let dir_path = mount_point.join("directory"); | ||
| let res = fs::create_dir(&dir_path); | ||
| assert!(res.is_err()); |
| } | ||
|
|
||
| #[test] | ||
| fn offset_change_not_affects_cache_drop() { |
There was a problem hiding this comment.
| fn offset_change_not_affects_cache_drop() { | |
| fn offset_change_does_not_affect_cache_drop() { |
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
… behaviour Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
…ry file's content change Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
…possible inconsistency Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
f1c61a4 to
77dbc11
Compare
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
…bench Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Signed-off-by: Gleb Nasretdinov <gleb.nasretdinov@proton.me>
Also added the ability to read the exact size from a file and at a specific offset.
Remove Hash copying in FileLayer::read_complete and FileLayer::read methods.