From 8fb445b0e84b133aeb1c4c862e3094f2b4fd2fdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Mon, 6 Jul 2020 00:32:38 +0200 Subject: [PATCH] better lz4 --- network/src/message.rs | 21 +++++++++++---------- network/src/protocols.rs | 10 ++++------ network/src/types.rs | 2 +- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/network/src/message.rs b/network/src/message.rs index d1e86f01ec..24b55bb21e 100644 --- a/network/src/message.rs +++ b/network/src/message.rs @@ -36,13 +36,16 @@ pub(crate) struct IncomingMessage { pub(crate) fn serialize(message: &M) -> MessageBuffer { //this will never fail: https://docs.rs/bincode/0.8.0/bincode/fn.serialize.html let writer = bincode::serialize(message).unwrap(); - MessageBuffer { data: writer } + MessageBuffer { + data: lz4_compress::compress(&writer), + } } //pub(crate) fn deserialize(buffer: MessageBuffer) -> // std::Result> { pub(crate) fn deserialize(buffer: MessageBuffer) -> bincode::Result { - let span = buffer.data; + let span = lz4_compress::decompress(&buffer.data) + .expect("lz4_compression error, failed to deserialze"); //this might fail if you choose the wrong type for M. in that case probably X // got transfered while you assume Y. probably this means your application // logic is wrong. E.g. You expect a String, but just get a u8. @@ -134,13 +137,11 @@ mod tests { fn serialize_test() { let msg = "abc"; let mb = serialize(&msg); - assert_eq!(mb.data.len(), 11); - assert_eq!(mb.data[0], 3); - assert_eq!(mb.data[1], 0); - assert_eq!(mb.data[7], 0); - assert_eq!(mb.data[8], b'a'); - assert_eq!(mb.data[8], 97); - assert_eq!(mb.data[9], b'b'); - assert_eq!(mb.data[10], b'c'); + assert_eq!(mb.data.len(), 9); + assert_eq!(mb.data[0], 34); + assert_eq!(mb.data[1], 3); + assert_eq!(mb.data[6], b'a'); + assert_eq!(mb.data[7], b'b'); + assert_eq!(mb.data[8], b'c'); } } diff --git a/network/src/protocols.rs b/network/src/protocols.rs index 33f5b8a4b3..801e227d85 100644 --- a/network/src/protocols.rs +++ b/network/src/protocols.rs @@ -182,10 +182,9 @@ impl TcpProtocol { bytes[15], ]); let length = u16::from_le_bytes([bytes[16], bytes[17]]); - let mut cdata = vec![0; length as usize]; + let mut data = vec![0; length as usize]; throughput_cache.inc_by(length as i64); - Self::read_except_or_close(cid, &stream, &mut cdata, w2c_cid_frame_s).await; - let data = lz4_compress::decompress(&cdata).unwrap(); + Self::read_except_or_close(cid, &stream, &mut data, w2c_cid_frame_s).await; Frame::Data { mid, start, data } }, FRAME_RAW => { @@ -348,7 +347,6 @@ impl TcpProtocol { }, Frame::Data { mid, start, data } => { throughput_cache.inc_by(data.len() as i64); - let cdata = lz4_compress::compress(&data); Self::write_or_close(&mut stream, &FRAME_DATA.to_be_bytes(), &mut c2w_frame_r) .await || Self::write_or_close(&mut stream, &mid.to_le_bytes(), &mut c2w_frame_r) @@ -357,11 +355,11 @@ impl TcpProtocol { .await || Self::write_or_close( &mut stream, - &(cdata.len() as u16).to_le_bytes(), + &(data.len() as u16).to_le_bytes(), &mut c2w_frame_r, ) .await - || Self::write_or_close(&mut stream, &cdata, &mut c2w_frame_r).await + || Self::write_or_close(&mut stream, &data, &mut c2w_frame_r).await }, Frame::Raw(data) => { Self::write_or_close(&mut stream, &FRAME_RAW.to_be_bytes(), &mut c2w_frame_r) diff --git a/network/src/types.rs b/network/src/types.rs index 46205f25ce..6b358cad54 100644 --- a/network/src/types.rs +++ b/network/src/types.rs @@ -34,7 +34,7 @@ pub const PROMISES_COMPRESSED: Promises = 8; pub const PROMISES_ENCRYPTED: Promises = 16; pub(crate) const VELOREN_MAGIC_NUMBER: [u8; 7] = [86, 69, 76, 79, 82, 69, 78]; //VELOREN -pub const VELOREN_NETWORK_VERSION: [u32; 3] = [0, 3, 0]; +pub const VELOREN_NETWORK_VERSION: [u32; 3] = [0, 4, 0]; pub(crate) const STREAM_ID_OFFSET1: Sid = Sid::new(0); pub(crate) const STREAM_ID_OFFSET2: Sid = Sid::new(u64::MAX / 2);