Skip to content

Commit a8456cb

Browse files
committed
Optimize error handlling
1 parent c36b212 commit a8456cb

File tree

3 files changed

+71
-90
lines changed

3 files changed

+71
-90
lines changed

clients/filesystem-fuse/src/filesystem.rs

+14-12
Original file line numberDiff line numberDiff line change
@@ -19,39 +19,41 @@
1919
use fuse3::{Errno, FileType, Timestamp};
2020
use std::time::SystemTime;
2121

22+
pub type Result<T> = std::result::Result<T, Errno>;
23+
2224
/// File system interface for the file system implementation. it use by FuseApiHandle
2325
/// the `file_id` and `parent_file_id` it is the unique identifier for the file system, it is used to identify the file or directory
2426
/// the `fh` it is the file handle, it is used to identify the opened file, it is used to read or write the file content
2527
pub trait IFileSystem: Send + Sync {
2628
fn get_file_path(&self, file_id: u64) -> String;
2729

28-
fn get_opened_file(&self, file_id: u64, fh: u64) -> Option<OpenedFile>;
30+
fn get_opened_file(&self, file_id: u64, fh: u64) -> Result<OpenedFile>;
2931

30-
fn stat(&self, file_id: u64) -> Option<FileStat>;
32+
fn stat(&self, file_id: u64) -> Result<FileStat>;
3133

32-
fn lookup(&self, parent_file_id: u64, name: &str) -> Option<FileStat>;
34+
fn lookup(&self, parent_file_id: u64, name: &str) -> Result<FileStat>;
3335

34-
fn read_dir(&self, dir_file_id: u64) -> Vec<FileStat>;
36+
fn read_dir(&self, dir_file_id: u64) -> Result<Vec<FileStat>>;
3537

36-
fn open_file(&self, file_id: u64) -> Result<OpenedFile, Errno>;
38+
fn open_file(&self, file_id: u64) -> Result<OpenedFile>;
3739

38-
fn create_file(&self, parent_file_id: u64, name: &str) -> Result<OpenedFile, Errno>;
40+
fn create_file(&self, parent_file_id: u64, name: &str) -> Result<OpenedFile>;
3941

40-
fn create_dir(&self, parent_file_id: u64, name: &str) -> Result<OpenedFile, Errno>;
42+
fn create_dir(&self, parent_file_id: u64, name: &str) -> Result<OpenedFile>;
4143

42-
fn set_attr(&self, file_id: u64, file_stat: &FileStat) -> Result<(), Errno>;
44+
fn set_attr(&self, file_id: u64, file_stat: &FileStat) -> Result<()>;
4345

44-
fn update_file_status(&self, file_id: u64, file_stat: &FileStat);
46+
fn update_file_status(&self, file_id: u64, file_stat: &FileStat) -> Result<()>;
4547

4648
fn read(&self, file_id: u64, fh: u64) -> Box<dyn FileReader>;
4749

4850
fn write(&self, file_id: u64, fh: u64) -> Box<dyn FileWriter>;
4951

50-
fn remove_file(&self, parent_file_id: u64, name: &str) -> Result<(), Errno>;
52+
fn remove_file(&self, parent_file_id: u64, name: &str) -> Result<()>;
5153

52-
fn remove_dir(&self, parent_file_id: u64, name: &str) -> Result<(), Errno>;
54+
fn remove_dir(&self, parent_file_id: u64, name: &str) -> Result<()>;
5355

54-
fn close_file(&self, file_id: u64, fh: u64) -> Result<(), Errno>;
56+
fn close_file(&self, file_id: u64, fh: u64) -> Result<()>;
5557
}
5658

5759
pub struct FileSystemContext {

clients/filesystem-fuse/src/fuse_api_handle.rs

+39-60
Original file line numberDiff line numberDiff line change
@@ -72,24 +72,19 @@ impl FuseApiHandle {
7272
size: Option<u64>,
7373
atime: Option<Timestamp>,
7474
mtime: Option<Timestamp>,
75-
) -> Option<FileStat> {
76-
let file_stat = self.local_fs.stat(inode);
77-
match file_stat {
78-
Some(f) => {
79-
let mut nf = FileStat::clone(&f);
80-
size.map(|size| {
81-
nf.size = size;
82-
});
83-
atime.map(|atime| {
84-
nf.atime = atime;
85-
});
86-
mtime.map(|mtime| {
87-
nf.mtime = mtime;
88-
});
89-
Some(nf)
90-
}
91-
_ => None,
92-
}
75+
) -> Result<FileStat, Errno> {
76+
let file_stat = self.local_fs.stat(inode)?;
77+
let mut nf = FileStat::clone(&file_stat);
78+
size.map(|size| {
79+
nf.size = size;
80+
});
81+
atime.map(|atime| {
82+
nf.atime = atime;
83+
});
84+
mtime.map(|mtime| {
85+
nf.mtime = mtime;
86+
});
87+
Ok(nf)
9388
}
9489
}
9590

@@ -108,16 +103,12 @@ impl Filesystem for FuseApiHandle {
108103
parent: Inode,
109104
name: &OsStr,
110105
) -> fuse3::Result<ReplyEntry> {
111-
let file_stat = self.local_fs.lookup(parent, name.to_str().unwrap());
112-
113-
match file_stat {
114-
Some(f) => Ok(ReplyEntry {
115-
ttl: self.default_ttl,
116-
attr: fstat_to_file_attr(&f, &self.fs_context),
117-
generation: 0,
118-
}),
119-
None => Err(libc::ENOENT.into()),
120-
}
106+
let file_stat = self.local_fs.lookup(parent, name.to_str().unwrap())?;
107+
Ok(ReplyEntry {
108+
ttl: self.default_ttl,
109+
attr: fstat_to_file_attr(&file_stat, &self.fs_context),
110+
generation: 0,
111+
})
121112
}
122113

123114
async fn getattr(
@@ -128,20 +119,18 @@ impl Filesystem for FuseApiHandle {
128119
_flags: u32,
129120
) -> fuse3::Result<ReplyAttr> {
130121
// check the opened file inode is the same as the inode
131-
if let Some(f) = fh.and_then(|fh| self.local_fs.get_opened_file(inode, fh)) {
132-
if f.file_id != inode {
122+
if let Some(fh) = fh {
123+
let opened_file = self.local_fs.get_opened_file(inode, fh)?;
124+
if opened_file.file_id != inode {
133125
return Err(libc::EBADF.into());
134126
}
135127
}
136128

137-
let file_stat = self.local_fs.stat(inode);
138-
match file_stat {
139-
Some(f) => Ok(ReplyAttr {
140-
ttl: self.default_ttl,
141-
attr: fstat_to_file_attr(&f, &self.fs_context),
142-
}),
143-
None => Err(libc::ENOENT.into()),
144-
}
129+
let file_stat = self.local_fs.stat(inode)?;
130+
Ok(ReplyAttr {
131+
ttl: self.default_ttl,
132+
attr: fstat_to_file_attr(&file_stat, &self.fs_context),
133+
})
145134
}
146135

147136
async fn setattr(
@@ -152,18 +141,13 @@ impl Filesystem for FuseApiHandle {
152141
set_attr: SetAttr,
153142
) -> fuse3::Result<ReplyAttr> {
154143
let new_file_stat =
155-
self.get_modified_file_stat(inode, set_attr.size, set_attr.atime, set_attr.mtime);
156-
match new_file_stat {
157-
Some(stat) => {
158-
let attr = fstat_to_file_attr(&stat, &self.fs_context);
159-
self.local_fs.set_attr(inode, &stat);
160-
Ok(ReplyAttr {
161-
ttl: self.default_ttl,
162-
attr: attr,
163-
})
164-
}
165-
None => Err(libc::ENOENT.into()),
166-
}
144+
self.get_modified_file_stat(inode, set_attr.size, set_attr.atime, set_attr.mtime)?;
145+
let attr = fstat_to_file_attr(&new_file_stat, &self.fs_context);
146+
self.local_fs.set_attr(inode, &new_file_stat)?;
147+
Ok(ReplyAttr {
148+
ttl: self.default_ttl,
149+
attr: attr,
150+
})
167151
}
168152

169153
async fn mkdir(
@@ -300,11 +284,11 @@ impl Filesystem for FuseApiHandle {
300284
) -> fuse3::Result<ReplyDirectory<Self::DirEntryStream<'a>>> {
301285
let current = self.local_fs.stat(parent);
302286
let current = match current {
303-
Some(file) => file,
304-
None => return Err(libc::ENOENT.into()),
287+
Ok(file) => file,
288+
Err(e) => return Err(e),
305289
};
306290

307-
let files = self.local_fs.read_dir(parent);
291+
let files = self.local_fs.read_dir(parent)?;
308292
let entries_stream =
309293
stream::iter(files.into_iter().enumerate().map(|(index, file_stat)| {
310294
Ok(DirectoryEntry {
@@ -383,13 +367,8 @@ impl Filesystem for FuseApiHandle {
383367
offset: u64,
384368
lock_owner: u64,
385369
) -> fuse3::Result<ReplyDirectoryPlus<Self::DirEntryPlusStream<'a>>> {
386-
let current = self.local_fs.stat(parent);
387-
let current = match current {
388-
Some(file) => file,
389-
None => return Err(libc::ENOENT.into()),
390-
};
391-
392-
let files = self.local_fs.read_dir(parent);
370+
let current = self.local_fs.stat(parent)?;
371+
let files = self.local_fs.read_dir(parent)?;
393372
let entries_stream =
394373
stream::iter(files.into_iter().enumerate().map(|(index, file_stat)| {
395374
Ok(DirectoryEntryPlus {

clients/filesystem-fuse/src/memory_filesystem.rs

+18-18
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@
1717
* under the License.
1818
*/
1919
use crate::file_handle_manager::FileHandleManager;
20-
use crate::filesystem::{FileReader, FileStat, FileWriter, IFileSystem, OpenedFile};
20+
use crate::filesystem::{FileReader, FileStat, FileWriter, IFileSystem, OpenedFile, Result};
2121
use crate::filesystem_metadata::{DefaultFileSystemMetadata, IFileSystemMetadata};
2222
use dashmap::DashMap;
23-
use fuse3::Errno;
2423
use std::sync::{Arc, Mutex, RwLock};
2524

2625
// MemoryFileSystem is a simple in-memory filesystem implementation
@@ -71,27 +70,28 @@ impl IFileSystem for MemoryFileSystem {
7170
meta.get_file_path(file_id)
7271
}
7372

74-
fn get_opened_file(&self, _file_id: u64, fh: u64) -> Option<OpenedFile> {
73+
fn get_opened_file(&self, _file_id: u64, fh: u64) -> Result<OpenedFile> {
7574
let file_handle_map = self.file_handle_manager.read().unwrap();
76-
file_handle_map.get_file(fh)
75+
file_handle_map.get_file(fh).ok_or(libc::ENOENT.into())
7776
}
7877

79-
fn stat(&self, file_id: u64) -> Option<FileStat> {
78+
fn stat(&self, file_id: u64) -> Result<FileStat> {
8079
let meta = self.meta.read().unwrap();
81-
meta.get_file(file_id)
80+
meta.get_file(file_id).ok_or(libc::ENOENT.into())
8281
}
8382

84-
fn lookup(&self, parent_file_id: u64, name: &str) -> Option<FileStat> {
83+
fn lookup(&self, parent_file_id: u64, name: &str) -> Result<FileStat> {
8584
let meta = self.meta.read().unwrap();
8685
meta.get_file_from_dir(parent_file_id, name)
86+
.ok_or(libc::ENOENT.into())
8787
}
8888

89-
fn read_dir(&self, file_id: u64) -> Vec<FileStat> {
89+
fn read_dir(&self, file_id: u64) -> Result<Vec<FileStat>> {
9090
let meta = self.meta.read().unwrap();
91-
meta.get_dir_childs(file_id)
91+
Ok(meta.get_dir_childs(file_id))
9292
}
9393

94-
fn open_file(&self, file_id: u64) -> Result<OpenedFile, Errno> {
94+
fn open_file(&self, file_id: u64) -> Result<OpenedFile> {
9595
let meta = self.meta.read().unwrap();
9696
let file_stat = meta.get_file(file_id);
9797
match file_stat {
@@ -104,7 +104,7 @@ impl IFileSystem for MemoryFileSystem {
104104
}
105105
}
106106

107-
fn create_file(&self, parent_file_id: u64, name: &str) -> Result<OpenedFile, Errno> {
107+
fn create_file(&self, parent_file_id: u64, name: &str) -> Result<OpenedFile> {
108108
let mut meta = self.meta.write().unwrap();
109109
let file_stat = meta.add_file(parent_file_id, name);
110110

@@ -116,7 +116,7 @@ impl IFileSystem for MemoryFileSystem {
116116
Ok(file_handle)
117117
}
118118

119-
fn create_dir(&self, parent_file_id: u64, name: &str) -> Result<OpenedFile, Errno> {
119+
fn create_dir(&self, parent_file_id: u64, name: &str) -> Result<OpenedFile> {
120120
let mut meta = self.meta.write().unwrap();
121121
let file_stat = meta.add_dir(parent_file_id, name);
122122

@@ -125,13 +125,13 @@ impl IFileSystem for MemoryFileSystem {
125125
Ok(file_handle)
126126
}
127127

128-
fn set_attr(&self, file_id: u64, file_info: &FileStat) -> Result<(), Errno> {
128+
fn set_attr(&self, file_id: u64, file_info: &FileStat) -> Result<()> {
129129
Ok(())
130130
}
131131

132-
fn update_file_status(&self, file_id: u64, file_stat: &FileStat) {
132+
fn update_file_status(&self, file_id: u64, file_stat: &FileStat) -> Result<()> {
133133
let mut meta = self.meta.write().unwrap();
134-
meta.update_file_stat(file_id, file_stat)
134+
Ok(meta.update_file_stat(file_id, file_stat))
135135
}
136136

137137
fn read(&self, file_id: u64, fh: u64) -> Box<dyn FileReader> {
@@ -162,18 +162,18 @@ impl IFileSystem for MemoryFileSystem {
162162
})
163163
}
164164

165-
fn remove_file(&self, parent_file_id: u64, name: &str) -> Result<(), Errno> {
165+
fn remove_file(&self, parent_file_id: u64, name: &str) -> Result<()> {
166166
let mut meta = self.meta.write().unwrap();
167167
meta.remove_file(parent_file_id, name);
168168
Ok(())
169169
}
170170

171-
fn remove_dir(&self, parent_file_id: u64, name: &str) -> Result<(), Errno> {
171+
fn remove_dir(&self, parent_file_id: u64, name: &str) -> Result<()> {
172172
let mut meta = self.meta.write().unwrap();
173173
meta.remove_dir(parent_file_id, name)
174174
}
175175

176-
fn close_file(&self, _file_id: u64, fh: u64) -> Result<(), Errno> {
176+
fn close_file(&self, _file_id: u64, fh: u64) -> Result<()> {
177177
let mut file_handle_manager = self.file_handle_manager.write().unwrap();
178178
file_handle_manager.remove_file(fh);
179179
Ok(())

0 commit comments

Comments
 (0)