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,30 +158,40 @@ 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 {
// Write bytes let mut buf_start: usize = 0;
if let Err(err) = rhnd.write(&buffer[0..bytes_read]) { while buf_start < bytes_read {
self.log( // Write bytes
LogLevel::Error, match rhnd.write(&buffer[buf_start..bytes_read]) {
format!("Could not write remote file: {}", err) Ok(bytes) => buf_start += bytes,
.as_ref(), Err(err) => {
); self.log(
self.input_mode = LogLevel::Error,
InputMode::Popup(PopupType::Alert( format!(
Color::Red, "Could not write remote file: {}",
format!( err
"Could not write remote file: {}", )
err .as_ref(),
), );
)); self.input_mode =
InputMode::Popup(PopupType::Alert(
Color::Red,
format!(
"Could not write remote file: {}",
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,35 +408,41 @@ 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 {
// Write bytes let mut buf_start: usize = 0;
if let Err(err) = while buf_start < bytes_read {
local_file.write(&buffer[0..bytes_read]) // Write bytes
{ match local_file
self.log( .write(&buffer[buf_start..bytes_read])
LogLevel::Error, {
format!( Ok(bytes) => buf_start += bytes,
"Could not write local file: {}", Err(err) => {
err self.log(
) LogLevel::Error,
.as_ref(), format!(
);
self.input_mode =
InputMode::Popup(PopupType::Alert(
Color::Red,
format!(
"Could not write local file: {}", "Could not write local file: {}",
err err
), )
)); .as_ref(),
);
self.input_mode =
InputMode::Popup(PopupType::Alert(
Color::Red,
format!(
"Could not write local file: {}",
err
),
));
}
}
} }
} }
} }
@@ -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();