Skip to content

Commit 9abd45d

Browse files
committed
Add close file
1 parent 3b2fb12 commit 9abd45d

File tree

4 files changed

+89
-17
lines changed

4 files changed

+89
-17
lines changed

clients/filesystem-fuse/src/filesystem.rs

+73-10
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ pub trait RawFileSystem: Send + Sync {
5454

5555
async fn open_file(&self, file_id: u64, flags: u32) -> Result<FileHandle>;
5656

57+
async fn open_dir(&self, file_id: u64, flags: u32) -> Result<FileHandle>;
58+
5759
async fn create_file(&self, parent_file_id: u64, name: &str, flags: u32) -> Result<FileHandle>;
5860

5961
async fn create_dir(&self, parent_file_id: u64, name: &str) -> Result<FileHandle>;
@@ -85,6 +87,8 @@ pub trait PathFileSystem: Send + Sync {
8587

8688
async fn open_file(&self, name: &str, flags: OpenFileFlags) -> Result<OpenedFile>;
8789

90+
async fn open_dir(&self, name: &str, flags: OpenFileFlags) -> Result<OpenedFile>;
91+
8892
async fn create_file(
8993
&self,
9094
parent: &str,
@@ -250,6 +254,24 @@ impl OpenedFile {
250254
self.writer.as_mut().unwrap().write(offset, data).await
251255
}
252256

257+
async fn close(&mut self) -> Result<()> {
258+
if let Some(mut reader) = self.reader.take() {
259+
reader.close().await?;
260+
}
261+
if let Some(mut writer) = self.writer.take() {
262+
self.flush().await?;
263+
writer.close().await?
264+
}
265+
Ok(())
266+
}
267+
268+
async fn flush(&mut self) -> Result<()> {
269+
if let Some(writer) = &mut self.writer {
270+
writer.flush().await?;
271+
}
272+
Ok(())
273+
}
274+
253275
fn file_handle(&self) -> FileHandle {
254276
FileHandle {
255277
file_id: self.file_stat.inode,
@@ -266,12 +288,21 @@ impl OpenedFile {
266288
#[async_trait]
267289
pub trait FileReader: Sync + Send {
268290
async fn read(&mut self, offset: u64, size: u32) -> Result<Bytes>;
291+
async fn close(&mut self) -> Result<()> {
292+
Ok(())
293+
}
269294
}
270295

271296
/// File writer interface for write file content
272297
#[async_trait]
273298
pub trait FileWriter: Sync + Send {
274299
async fn write(&mut self, offset: u64, data: &[u8]) -> Result<u32>;
300+
async fn close(&mut self) -> Result<()> {
301+
Ok(())
302+
}
303+
async fn flush(&mut self) -> Result<()> {
304+
Ok(())
305+
}
275306
}
276307

277308
#[derive(Debug, Clone)]
@@ -409,6 +440,35 @@ impl<T: PathFileSystem> SimpleFileSystem<T> {
409440
let file = file.lock().await;
410441
Ok(file.file_handle())
411442
}
443+
444+
async fn open_file_internal(
445+
&self,
446+
file_id: u64,
447+
flags: u32,
448+
kind: FileType,
449+
) -> Result<FileHandle> {
450+
let file_node = self.get_file_node(file_id)?;
451+
452+
let mut file = {
453+
match kind {
454+
FileType::Directory => {
455+
self.fs
456+
.open_dir(&file_node.file_name, OpenFileFlags(flags))
457+
.await?
458+
}
459+
FileType::RegularFile => {
460+
self.fs
461+
.open_file(&file_node.file_name, OpenFileFlags(flags))
462+
.await?
463+
}
464+
_ => return Err(Errno::from(libc::EINVAL)),
465+
}
466+
};
467+
file.set_inode(file_node.parent_file_id, file_id);
468+
let file = self.opened_file_manager.put_file(file);
469+
let file = file.lock().await;
470+
Ok(file.file_handle())
471+
}
412472
}
413473

414474
#[async_trait]
@@ -467,15 +527,13 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
467527
}
468528

469529
async fn open_file(&self, file_id: u64, flags: u32) -> Result<FileHandle> {
470-
let file_node = self.get_file_node(file_id)?;
471-
let mut file = self
472-
.fs
473-
.open_file(&file_node.file_name, OpenFileFlags(flags))
474-
.await?;
475-
file.set_inode(file_node.parent_file_id, file_id);
476-
let file = self.opened_file_manager.put_file(file);
477-
let file = file.lock().await;
478-
Ok(file.file_handle())
530+
self.open_file_internal(file_id, flags, FileType::RegularFile)
531+
.await
532+
}
533+
534+
async fn open_dir(&self, file_id: u64, flags: u32) -> Result<FileHandle> {
535+
self.open_file_internal(file_id, flags, FileType::Directory)
536+
.await
479537
}
480538

481539
async fn create_file(&self, parent_file_id: u64, name: &str, flags: u32) -> Result<FileHandle> {
@@ -522,7 +580,12 @@ impl<T: PathFileSystem> RawFileSystem for SimpleFileSystem<T> {
522580
}
523581

524582
async fn close_file(&self, _file_id: u64, fh: u64) -> Result<()> {
525-
self.opened_file_manager.remove_file(fh);
583+
let file = self
584+
.opened_file_manager
585+
.remove_file(fh)
586+
.ok_or(Errno::from(libc::EBADF))?;
587+
let mut file = file.lock().await;
588+
file.close().await?;
526589
Ok(())
527590
}
528591

clients/filesystem-fuse/src/fuse_api_handle.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -231,19 +231,21 @@ impl<T: RawFileSystem> Filesystem for FuseApiHandle<T> {
231231
lock_owner: u64,
232232
flush: bool,
233233
) -> fuse3::Result<()> {
234-
let _ = self.local_fs.close_file(inode, fh);
235-
Ok(())
234+
self.local_fs.close_file(inode, fh).await
236235
}
237236

238237
async fn opendir(&self, req: Request, inode: Inode, flags: u32) -> fuse3::Result<ReplyOpen> {
239-
let file_handle = self.local_fs.open_file(inode, flags).await?;
238+
let file_handle = self.local_fs.open_dir(inode, flags).await?;
240239
Ok(ReplyOpen {
241240
fh: file_handle.handle_id,
242241
flags: flags,
243242
})
244243
}
245244

246-
type DirEntryStream<'a> = BoxStream<'a, fuse3::Result<DirectoryEntry>> where T: 'a;
245+
type DirEntryStream<'a>
246+
= BoxStream<'a, fuse3::Result<DirectoryEntry>>
247+
where
248+
T: 'a;
247249

248250
async fn readdir<'a>(
249251
&'a self,
@@ -321,7 +323,10 @@ impl<T: RawFileSystem> Filesystem for FuseApiHandle<T> {
321323
})
322324
}
323325

324-
type DirEntryPlusStream<'a> = BoxStream<'a, fuse3::Result<DirectoryEntryPlus>> where T: 'a;
326+
type DirEntryPlusStream<'a>
327+
= BoxStream<'a, fuse3::Result<DirectoryEntryPlus>>
328+
where
329+
T: 'a;
325330

326331
async fn readdirplus<'a>(
327332
&'a self,

clients/filesystem-fuse/src/memory_filesystem.rs

+4
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ impl PathFileSystem for MemoryFileSystem {
126126
}
127127
}
128128

129+
async fn open_dir(&self, name: &str, flags: OpenFileFlags) -> Result<OpenedFile> {
130+
self.open_file(name, flags).await
131+
}
132+
129133
async fn create_file(
130134
&self,
131135
parent: &str,

clients/filesystem-fuse/src/opened_file_manager.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ impl OpenedFileManager {
5959
.map(|x| x.value().clone())
6060
}
6161

62-
pub(crate) fn remove_file(&self, handle_id: u64) {
63-
self.file_handle_map.remove(&handle_id);
62+
pub(crate) fn remove_file(&self, handle_id: u64) -> Option<Arc<Mutex<OpenedFile>>> {
63+
self.file_handle_map.remove(&handle_id).map(|x| x.1)
6464
}
6565
}

0 commit comments

Comments
 (0)