feat: implement more detailed progress on sending

This commit is contained in:
dignifiedquire
2023-03-17 23:36:54 +01:00
parent b26a351786
commit fd358617f5
2 changed files with 69 additions and 15 deletions

5
Cargo.lock generated
View File

@@ -2460,7 +2460,7 @@ checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146"
[[package]] [[package]]
name = "iroh" name = "iroh"
version = "0.3.0" version = "0.3.0"
source = "git+https://github.com/n0-computer/iroh?branch=flub/ticket-multiple-addrs#2149bc8c6819b044833f5af0b8fdac567ef93650" source = "git+https://github.com/n0-computer/iroh?branch=flub/ticket-multiple-addrs#9038359f14496d5f4694c398c512cdcb5358771c"
dependencies = [ dependencies = [
"abao", "abao",
"anyhow", "anyhow",
@@ -2473,10 +2473,13 @@ dependencies = [
"default-net", "default-net",
"der", "der",
"derive_more", "derive_more",
"dirs-next",
"ed25519-dalek", "ed25519-dalek",
"futures", "futures",
"hex",
"indicatif", "indicatif",
"multibase", "multibase",
"num_cpus",
"portable-atomic 1.0.1", "portable-atomic 1.0.1",
"postcard", "postcard",
"quic-rpc", "quic-rpc",

View File

@@ -188,6 +188,8 @@ impl BackupProvider {
) -> Result<()> { ) -> Result<()> {
// _dbfile exists so we can clean up the file once it is no longer needed // _dbfile exists so we can clean up the file once it is no longer needed
let mut events = provider.subscribe(); let mut events = provider.subscribe();
let mut total_size = 0;
let mut current_size = 0;
let res = loop { let res = loop {
tokio::select! { tokio::select! {
biased; biased;
@@ -202,10 +204,26 @@ impl BackupProvider {
context.emit_event(SendProgress::ClientConnected.into()); context.emit_event(SendProgress::ClientConnected.into());
} }
Event::RequestReceived { .. } => { Event::RequestReceived { .. } => {
context.emit_event(SendProgress::TransferStarted.into());
} }
Event::TransferCompleted { .. } => { Event::TransferCollectionStarted { total_blobs_size, .. } => {
context.emit_event(SendProgress::TransferFinished.into()); total_size = total_blobs_size;
context.emit_event(SendProgress::TransferInProgress {
current_size,
total_size,
}.into());
}
Event::TransferBlobCompleted { size, .. } => {
current_size += size;
context.emit_event(SendProgress::TransferInProgress {
current_size,
total_size,
}.into());
}
Event::TransferCollectionCompleted { .. } => {
context.emit_event(SendProgress::TransferInProgress {
current_size: total_size,
total_size
}.into());
provider.shutdown(); provider.shutdown();
} }
Event::TransferAborted { .. } => { Event::TransferAborted { .. } => {
@@ -301,22 +319,37 @@ impl Deref for TempPathGuard {
/// ///
/// Plus you get warnings if you don't use all variants. /// Plus you get warnings if you don't use all variants.
#[derive(Debug)] #[derive(Debug)]
#[repr(u16)]
enum SendProgress { enum SendProgress {
Failed = 0, Failed,
Started = 100, Started,
DatabaseExported = 300, DatabaseExported,
CollectionCreated = 400, CollectionCreated,
ProviderListening = 500, ProviderListening,
ClientConnected = 600, ClientConnected,
TransferStarted = 650, TransferInProgress { current_size: u64, total_size: u64 },
TransferFinished = 950, Completed,
Completed = 1000,
} }
impl From<SendProgress> for EventType { impl From<SendProgress> for EventType {
fn from(source: SendProgress) -> Self { fn from(source: SendProgress) -> Self {
Self::ImexProgress((source as u16).into()) use SendProgress::*;
let num: u16 = match source {
Failed => 0,
Started => 100,
DatabaseExported => 300,
CollectionCreated => 350,
ProviderListening => 400,
ClientConnected => 450,
TransferInProgress {
current_size,
total_size,
} => {
// the range is 450..=950
450 + ((current_size as f64 / total_size as f64) * 500.).floor() as u16
}
Completed => 1000,
};
Self::ImexProgress(num.into())
} }
} }
@@ -645,4 +678,22 @@ mod tests {
.get_matching(|ev| matches!(ev, EventType::ImexProgress(1000))) .get_matching(|ev| matches!(ev, EventType::ImexProgress(1000)))
.await; .await;
} }
#[test]
fn test_send_progress() {
let cases = [
((0, 100), 450),
((10, 100), 500),
((50, 100), 700),
((100, 100), 950),
];
for ((current_size, total_size), progress) in cases {
let out = EventType::from(SendProgress::TransferInProgress {
current_size,
total_size,
});
assert_eq!(out, EventType::ImexProgress(progress));
}
}
} }