mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-07 10:14:35 +00:00
feat: support lzo compression
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#[cfg(feature = "zstd")]
|
||||
#[cfg(any(feature = "zstd", feature = "lzo"))]
|
||||
use anyhow::Context;
|
||||
#[cfg(feature = "zstd")]
|
||||
use dashmap::DashMap;
|
||||
@@ -53,6 +53,13 @@ impl DefaultCompressor {
|
||||
)
|
||||
})
|
||||
}),
|
||||
#[cfg(feature = "lzo")]
|
||||
CompressorAlgo::Lzo => lzokay_native::compress(data).with_context(|| {
|
||||
format!(
|
||||
"Failed to compress data with algorithm: {:?}",
|
||||
compress_algo
|
||||
)
|
||||
}),
|
||||
CompressorAlgo::None => Ok(data.to_vec()),
|
||||
}
|
||||
}
|
||||
@@ -85,6 +92,13 @@ impl DefaultCompressor {
|
||||
compress_algo
|
||||
))
|
||||
}),
|
||||
#[cfg(feature = "lzo")]
|
||||
CompressorAlgo::Lzo => lzokay_native::decompress_all(data, None).with_context(|| {
|
||||
format!(
|
||||
"Failed to decompress data with algorithm: {:?}",
|
||||
compress_algo
|
||||
)
|
||||
}),
|
||||
CompressorAlgo::None => Ok(data.to_vec()),
|
||||
}
|
||||
}
|
||||
@@ -181,14 +195,13 @@ thread_local! {
|
||||
static DCTX_MAP: RefCell<DashMap<CompressorAlgo, bulk::Decompressor<'static>>> = RefCell::new(DashMap::new());
|
||||
}
|
||||
|
||||
#[cfg(all(test, feature = "zstd"))]
|
||||
#[cfg(all(test, any(feature = "zstd", feature = "lzo")))]
|
||||
pub mod tests {
|
||||
use super::*;
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_compress() {
|
||||
let text = b"12345670000000000000000000";
|
||||
let mut packet = ZCPacket::new_with_payload(text);
|
||||
async fn test_compress_algo(compress_algo: CompressorAlgo) {
|
||||
let text = vec![b'a'; 4096];
|
||||
let mut packet = ZCPacket::new_with_payload(&text);
|
||||
packet.fill_peer_manager_hdr(0, 0, 0);
|
||||
|
||||
let compressor = DefaultCompressor {};
|
||||
@@ -200,7 +213,7 @@ pub mod tests {
|
||||
);
|
||||
|
||||
compressor
|
||||
.compress(&mut packet, CompressorAlgo::ZstdDefault)
|
||||
.compress(&mut packet, compress_algo)
|
||||
.await
|
||||
.unwrap();
|
||||
println!(
|
||||
@@ -215,8 +228,7 @@ pub mod tests {
|
||||
assert!(!packet.peer_manager_header().unwrap().is_compressed());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_short_text_compress() {
|
||||
async fn test_short_text_compress_algo(compress_algo: CompressorAlgo) {
|
||||
let text = b"1234";
|
||||
let mut packet = ZCPacket::new_with_payload(text);
|
||||
packet.fill_peer_manager_hdr(0, 0, 0);
|
||||
@@ -225,7 +237,7 @@ pub mod tests {
|
||||
|
||||
// short text can't be compressed
|
||||
compressor
|
||||
.compress(&mut packet, CompressorAlgo::ZstdDefault)
|
||||
.compress(&mut packet, compress_algo)
|
||||
.await
|
||||
.unwrap();
|
||||
assert!(!packet.peer_manager_header().unwrap().is_compressed());
|
||||
@@ -234,4 +246,28 @@ pub mod tests {
|
||||
assert_eq!(packet.payload(), text);
|
||||
assert!(!packet.peer_manager_header().unwrap().is_compressed());
|
||||
}
|
||||
|
||||
#[cfg(feature = "zstd")]
|
||||
#[tokio::test]
|
||||
async fn test_zstd_compress() {
|
||||
test_compress_algo(CompressorAlgo::ZstdDefault).await;
|
||||
}
|
||||
|
||||
#[cfg(feature = "zstd")]
|
||||
#[tokio::test]
|
||||
async fn test_zstd_short_text_compress() {
|
||||
test_short_text_compress_algo(CompressorAlgo::ZstdDefault).await;
|
||||
}
|
||||
|
||||
#[cfg(feature = "lzo")]
|
||||
#[tokio::test]
|
||||
async fn test_lzo_compress() {
|
||||
test_compress_algo(CompressorAlgo::Lzo).await;
|
||||
}
|
||||
|
||||
#[cfg(feature = "lzo")]
|
||||
#[tokio::test]
|
||||
async fn test_lzo_short_text_compress() {
|
||||
test_short_text_compress_algo(CompressorAlgo::Lzo).await;
|
||||
}
|
||||
}
|
||||
|
||||
+15
-2
@@ -37,6 +37,15 @@ use crate::tunnel::IpScheme;
|
||||
#[cfg(feature = "jemalloc-prof")]
|
||||
use jemalloc_ctl::{Access as _, AsName as _, epoch, stats};
|
||||
|
||||
fn supported_compression_algorithms() -> &'static str {
|
||||
cfg_select! {
|
||||
all(feature = "zstd", feature = "lzo") => "none, zstd, lzo",
|
||||
feature = "zstd" => "none, zstd",
|
||||
feature = "lzo" => "none, lzo",
|
||||
_ => "none",
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
windows_service::define_windows_service!(ffi_service_main, win_service_main);
|
||||
|
||||
@@ -1108,10 +1117,14 @@ impl NetworkOptions {
|
||||
if let Some(compression) = &self.compression {
|
||||
f.data_compress_algo = match compression.as_str() {
|
||||
"none" => CompressionAlgoPb::None,
|
||||
#[cfg(feature = "zstd")]
|
||||
"zstd" => CompressionAlgoPb::Zstd,
|
||||
#[cfg(feature = "lzo")]
|
||||
"lzo" => CompressionAlgoPb::Lzo,
|
||||
_ => panic!(
|
||||
"unknown compression algorithm: {}, supported: none, zstd",
|
||||
compression
|
||||
"unknown compression algorithm: {}, supported: {}",
|
||||
compression,
|
||||
supported_compression_algorithms()
|
||||
),
|
||||
}
|
||||
.into();
|
||||
|
||||
@@ -105,6 +105,7 @@ enum CompressionAlgoPb {
|
||||
Invalid = 0;
|
||||
None = 1;
|
||||
Zstd = 2;
|
||||
Lzo = 3;
|
||||
}
|
||||
|
||||
message RpcCompressionInfo {
|
||||
|
||||
@@ -467,6 +467,8 @@ impl TryFrom<CompressionAlgoPb> for CompressorAlgo {
|
||||
match value {
|
||||
#[cfg(feature = "zstd")]
|
||||
CompressionAlgoPb::Zstd => Ok(CompressorAlgo::ZstdDefault),
|
||||
#[cfg(feature = "lzo")]
|
||||
CompressionAlgoPb::Lzo => Ok(CompressorAlgo::Lzo),
|
||||
CompressionAlgoPb::None => Ok(CompressorAlgo::None),
|
||||
_ => Err(anyhow::anyhow!("Invalid CompressionAlgoPb")),
|
||||
}
|
||||
@@ -480,6 +482,8 @@ impl TryFrom<CompressorAlgo> for CompressionAlgoPb {
|
||||
match value {
|
||||
#[cfg(feature = "zstd")]
|
||||
CompressorAlgo::ZstdDefault => Ok(CompressionAlgoPb::Zstd),
|
||||
#[cfg(feature = "lzo")]
|
||||
CompressorAlgo::Lzo => Ok(CompressionAlgoPb::Lzo),
|
||||
CompressorAlgo::None => Ok(CompressionAlgoPb::None),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -309,6 +309,8 @@ pub enum CompressorAlgo {
|
||||
None = 0,
|
||||
#[cfg(feature = "zstd")]
|
||||
ZstdDefault = 1,
|
||||
#[cfg(feature = "lzo")]
|
||||
Lzo = 2,
|
||||
}
|
||||
|
||||
#[repr(C, packed)]
|
||||
@@ -323,6 +325,8 @@ impl CompressorTail {
|
||||
match self.algo {
|
||||
#[cfg(feature = "zstd")]
|
||||
1 => Some(CompressorAlgo::ZstdDefault),
|
||||
#[cfg(feature = "lzo")]
|
||||
2 => Some(CompressorAlgo::Lzo),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user