diff --git a/Cargo.lock b/Cargo.lock index 7c2d509..667cab3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,7 +6,6 @@ dependencies = [ "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -14,28 +13,6 @@ name = "bitflags" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "itoa" version = "0.4.3" @@ -89,31 +66,6 @@ dependencies = [ "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rand" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "redox_syscall" version = "0.1.40" @@ -185,14 +137,6 @@ name = "unicode-xid" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "uuid" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "vcpkg" version = "0.2.6" @@ -219,9 +163,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" "checksum libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)" = "10923947f84a519a45c8fefb7dd1b3e8c08747993381adee176d7a82b4195311" "checksum libsqlite3-sys 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "742b695cbfb89e549dca6960a55e6802f67d352e33e97859ee46dee835211b0f" @@ -230,9 +171,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" "checksum proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)" = "77619697826f31a02ae974457af0b29b723e5619e113e9397b8b82c6bd253f09" "checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c" -"checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" -"checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372" -"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" "checksum rusqlite 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "39bae767eb27866f5c0be918635ae54af705bc09db11be2c43a3c6b361cf3462" "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" @@ -242,7 +180,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)" = "ae8b29eb5210bc5cf63ed6149cbf9adfc82ac0be023d8735c176ee74a2db4da7" "checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dab5c5526c5caa3d106653401a267fed923e7046f35895ffcb5ca42db64942e6" "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" diff --git a/Cargo.toml b/Cargo.toml index ff74e9d..6a7de88 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,3 @@ rusqlite = "0.15.0" serde = "1.0" serde_derive = "1.0" serde_json = "1.0" -uuid = { version = "0.7", features = ["v4"] } diff --git a/src/bin/copy.rs b/src/bin/copy.rs index 48762d3..dcddefb 100644 --- a/src/bin/copy.rs +++ b/src/bin/copy.rs @@ -5,11 +5,10 @@ extern crate serde_derive; use a03::*; use std::net::{TcpStream, Shutdown}; -use std::io::Write; use std::fs::File; use std::fs; -use std::io::Read; -use std::io::BufWriter; +use std::io::{Write, BufWriter}; +use std::time::Instant; fn main() { let args = get_cli_args(); @@ -111,7 +110,10 @@ fn get_file_from_data_nodes( Ok(Packet { p_type: PacketType::GetFile, json, }) => { let chunk: Chunk = serde_json::from_str(&json.unwrap()).unwrap(); println!("Getting chunk: {:?}", chunk); + let start = Instant::now(); receive_chunk(&mut stream, &chunk, &mut file); + let elapsed = start.elapsed(); + println!("Elapsed: {} ms", (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64); }, Ok(Packet { p_type: PacketType::Error, json, .. }) => { eprintln!("Data Node Server Error: {}", &json.unwrap()); @@ -122,16 +124,6 @@ fn get_file_from_data_nodes( } } -fn receive_chunk(stream: &mut TcpStream, chunk: &Chunk, chunk_buf: &mut BufWriter) { - let mut buf = [0u8; 1]; - for _ in 0..(chunk.file_size) as usize { - stream.read(&mut buf).unwrap(); - chunk_buf.write(&buf).unwrap(); - chunk_buf.flush().unwrap(); - } -} - - #[derive(Debug)] pub struct CliArgs { pub endpoint: String, diff --git a/src/bin/data_node.rs b/src/bin/data_node.rs index efbf9c0..3890e75 100644 --- a/src/bin/data_node.rs +++ b/src/bin/data_node.rs @@ -13,6 +13,7 @@ use std::fs::File; use std::fs; use std::error::Error; use std::io::BufWriter; +use std::time::Instant; fn main() { let node_endpoint = parse_endpoint_from_cli(0); @@ -32,7 +33,7 @@ fn main() { } Ok(Packet { p_type: PacketType::PutFile, json }) => { println!("Receiving chunk"); - receive_chunk(&mut stream, &data_path, &json.unwrap()); + receive_chunk_from_copy(&mut stream, &data_path, &json.unwrap()); }, Ok(Packet { p_type: PacketType::ShutdownDataNode, .. }) => shutdown(&metadata_endpoint, &node_endpoint), @@ -42,16 +43,15 @@ fn main() { } } -fn receive_chunk(stream: &mut TcpStream, base_path: &String, json: &String) { +fn receive_chunk_from_copy(stream: &mut TcpStream, base_path: &String, json: &String) { let chunk: Chunk = serde_json::from_str(json).unwrap(); - let mut buf = [0u8; 1]; let filepath = format!("{}/{}_{}", base_path, chunk.filename, chunk.index); - let mut copy = BufWriter::new(File::create(filepath).unwrap()); - for _ in 0..(chunk.file_size) as usize { - stream.read(&mut buf).unwrap(); - copy.write(&buf).unwrap(); - copy.flush().unwrap(); - } + let mut file = BufWriter::new(File::create(filepath).unwrap()); + let start = Instant::now(); + receive_chunk(&mut *stream, &chunk, &mut file); + let elapsed = start.elapsed(); + println!("Elapsed: {} ms", (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64); + file.flush().unwrap(); } fn send_chunk(base_path: &String, stream: &mut TcpStream, json: &String) { diff --git a/src/lib.rs b/src/lib.rs index 268e4a5..de4015b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,9 +4,9 @@ extern crate serde_json; extern crate serde_derive; use std::borrow::Cow; -use std::net::Ipv4Addr; -use std::net::SocketAddrV4; -use std::str::FromStr; +use std::net::TcpStream; +use std::fs::File; +use std::io::{Write, Read, BufWriter}; pub const DEFAULT_PORT: &str = "8000"; @@ -101,3 +101,16 @@ pub fn parse_endpoint_from_cli(arg_index : usize) -> String { } } +pub fn receive_chunk(stream: &mut TcpStream, chunk: &Chunk, chunk_buf: &mut BufWriter) { + let mut buf = [0u8; 256]; + let mut bytes_read = 0; + while bytes_read < chunk.file_size as usize { + let bytes = stream.read(&mut buf).unwrap(); + chunk_buf.write_all(&buf[0..bytes]).unwrap(); + bytes_read += bytes; + } + chunk_buf.flush().unwrap(); +} + + +