Improved sftp and I/O in general: set buffer size to 65536

This commit is contained in:
ChristianVisintin
2020-12-06 20:59:45 +01:00
parent 0ed6bd30f1
commit 5e0b130123
2 changed files with 60 additions and 42 deletions

View File

@@ -522,7 +522,7 @@ impl FileTransfer for SftpFileTransfer {
mode, mode,
OpenType::File, OpenType::File,
) { ) {
Ok(file) => Ok(Box::new(BufWriter::with_capacity(8192, file))), Ok(file) => Ok(Box::new(BufWriter::with_capacity(65536, file))),
Err(err) => Err(FileTransferError::new_ex( Err(err) => Err(FileTransferError::new_ex(
FileTransferErrorType::FileCreateDenied, FileTransferErrorType::FileCreateDenied,
format!("{}", err), format!("{}", err),

View File

@@ -158,20 +158,27 @@ impl FileTransferActivity {
// Set started time // Set started time
self.transfer_started = Instant::now(); self.transfer_started = Instant::now();
let mut last_progress_val: f64 = 0.0; let mut last_progress_val: f64 = 0.0;
loop { while total_bytes_written < file_size {
// Read till you can // Read till you can
let mut buffer: [u8; 8192] = [0; 8192]; let mut buffer: [u8; 65536] = [0; 65536];
match fhnd.read(&mut buffer) { match fhnd.read(&mut buffer) {
Ok(bytes_read) => { Ok(bytes_read) => {
total_bytes_written += bytes_read; total_bytes_written += bytes_read;
if bytes_read == 0 { if bytes_read == 0 {
break; continue;
} else { } else {
let mut buf_start: usize = 0;
while buf_start < bytes_read {
// Write bytes // Write bytes
if let Err(err) = rhnd.write(&buffer[0..bytes_read]) { match rhnd.write(&buffer[buf_start..bytes_read]) {
Ok(bytes) => buf_start += bytes,
Err(err) => {
self.log( self.log(
LogLevel::Error, LogLevel::Error,
format!("Could not write remote file: {}", err) format!(
"Could not write remote file: {}",
err
)
.as_ref(), .as_ref(),
); );
self.input_mode = self.input_mode =
@@ -182,6 +189,9 @@ impl FileTransferActivity {
err err
), ),
)); ));
break;
}
}
} }
} }
} }
@@ -338,7 +348,9 @@ impl FileTransferActivity {
// Eventually, Reset input mode to explorer (if input mode is wait or progress) // Eventually, Reset input mode to explorer (if input mode is wait or progress)
if let InputMode::Popup(ptype) = &self.input_mode { if let InputMode::Popup(ptype) = &self.input_mode {
match ptype { match ptype {
PopupType::Wait(_) | PopupType::Progress(_) => self.input_mode = InputMode::Explorer, PopupType::Wait(_) | PopupType::Progress(_) => {
self.input_mode = InputMode::Explorer
}
_ => { /* Nothing to do */ } _ => { /* Nothing to do */ }
} }
} }
@@ -396,19 +408,23 @@ impl FileTransferActivity {
self.transfer_started = Instant::now(); self.transfer_started = Instant::now();
// Write local file // Write local file
let mut last_progress_val: f64 = 0.0; let mut last_progress_val: f64 = 0.0;
loop { while total_bytes_written < file.size {
// Read till you can // Read till you can
let mut buffer: [u8; 8192] = [0; 8192]; let mut buffer: [u8; 8192] = [0; 8192];
match rhnd.read(&mut buffer) { match rhnd.read(&mut buffer) {
Ok(bytes_read) => { Ok(bytes_read) => {
total_bytes_written += bytes_read; total_bytes_written += bytes_read;
if bytes_read == 0 { if bytes_read == 0 {
break; continue;
} else { } else {
let mut buf_start: usize = 0;
while buf_start < bytes_read {
// Write bytes // Write bytes
if let Err(err) = match local_file
local_file.write(&buffer[0..bytes_read]) .write(&buffer[buf_start..bytes_read])
{ {
Ok(bytes) => buf_start += bytes,
Err(err) => {
self.log( self.log(
LogLevel::Error, LogLevel::Error,
format!( format!(
@@ -428,6 +444,8 @@ impl FileTransferActivity {
} }
} }
} }
}
}
Err(err) => { Err(err) => {
self.log( self.log(
LogLevel::Error, LogLevel::Error,
@@ -595,7 +613,7 @@ impl FileTransferActivity {
None => match self.local.files.len() { None => match self.local.files.len() {
0 => 0, 0 => 0,
_ => self.local.files.len() - 1, _ => self.local.files.len() - 1,
} },
}; };
// Sort files // Sort files
self.local.sort_files_by_name(); self.local.sort_files_by_name();
@@ -626,7 +644,7 @@ impl FileTransferActivity {
None => match self.remote.files.len() { None => match self.remote.files.len() {
0 => 0, 0 => 0,
_ => self.remote.files.len() - 1, _ => self.remote.files.len() - 1,
} },
}; };
// Sort files // Sort files
self.remote.sort_files_by_name(); self.remote.sort_files_by_name();