From 075a877284e2e40afc357117faa6f51c3cf3dd71 Mon Sep 17 00:00:00 2001 From: ClSlaid Date: Sat, 28 Oct 2023 11:14:16 +0800 Subject: [PATCH] patch: increase FUSE block size and add retry 1. this should make file managers read small file in one request more likely 2. implemented retry, max times 3 Signed-off-by: ClSlaid --- libs/clipboard/src/X11/xf_cliprdr.c | 11 ----------- libs/clipboard/src/platform/fuse.rs | 27 +++++++++++++++++++-------- 2 files changed, 19 insertions(+), 19 deletions(-) delete mode 100644 libs/clipboard/src/X11/xf_cliprdr.c diff --git a/libs/clipboard/src/X11/xf_cliprdr.c b/libs/clipboard/src/X11/xf_cliprdr.c deleted file mode 100644 index 55d34a088..000000000 --- a/libs/clipboard/src/X11/xf_cliprdr.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "../cliprdr.h" - -void xf_cliprdr_init(CliprdrClientContext* cliprdr) -{ - (void)cliprdr; -} - -void xf_cliprdr_uninit( CliprdrClientContext* cliprdr) -{ - (void)cliprdr; -} diff --git a/libs/clipboard/src/platform/fuse.rs b/libs/clipboard/src/platform/fuse.rs index e83d6ea00..5ce4accd3 100644 --- a/libs/clipboard/src/platform/fuse.rs +++ b/libs/clipboard/src/platform/fuse.rs @@ -43,10 +43,11 @@ use crate::{send_data, ClipboardFile, CliprdrError}; #[cfg(target_os = "linux")] use super::LDAP_EPOCH_DELTA; +/// fuse server ready retry max times +const READ_RETRY: i32 = 3; + /// block size for fuse, align to our asynchronic request size over FileContentsRequest. -/// -/// Question: will this hint users to read data in this size? -const BLOCK_SIZE: u32 = 128 * 1024; +const BLOCK_SIZE: u32 = 4 * 1024 * 1024; /// read only permission const PERM_READ: u16 = 0o444; @@ -403,6 +404,7 @@ impl fuser::Filesystem for FuseServer { reply.opened(fh, 0); } + // todo: implement retry fn read( &mut self, _req: &fuser::Request<'_>, @@ -539,7 +541,7 @@ impl FuseServer { clip_data_id: 0, }; - send_data(node.conn_id, request); + send_data(node.conn_id, request.clone()); log::debug!( "waiting for read reply for {:?} on stream: {}", @@ -547,6 +549,8 @@ impl FuseServer { node.stream_id ); + let mut retry_times = 0; + loop { let reply = self.rx.recv_timeout(self.timeout).map_err(|e| { log::error!("failed to receive file list from channel: {:?}", e); @@ -563,11 +567,18 @@ impl FuseServer { log::debug!("stream id mismatch, ignore"); continue; } + if msg_flags & 1 == 0 { - return Err(std::io::Error::new( - std::io::ErrorKind::Other, - "failure request", - )); + retry_times += 1; + if retry_times > READ_RETRY { + return Err(std::io::Error::new( + std::io::ErrorKind::Other, + "failure request", + )); + } + + send_data(node.conn_id, request.clone()); + continue; } return Ok(requested_data); }