diff --git a/Cargo.lock b/Cargo.lock index ff48425..56ed173 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -691,6 +691,18 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cargo-lock" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11c675378efb449ed3ce8de78d75d0d80542fc98487c26aba28eb3b82feac72" +dependencies = [ + "semver", + "serde", + "toml 0.7.8", + "url", +] + [[package]] name = "cc" version = "1.0.97" @@ -1399,6 +1411,26 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "git-version" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" +dependencies = [ + "git-version-macro", +] + +[[package]] +name = "git-version-macro" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.63", +] + [[package]] name = "goblin" version = "0.5.4" @@ -2137,6 +2169,15 @@ dependencies = [ "syn 2.0.63", ] +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -2337,7 +2378,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -2451,7 +2492,9 @@ version = "0.1.0" dependencies = [ "agave-geyser-plugin-interface", "anyhow", + "cargo-lock", "clap", + "git-version", "log", "quic-geyser-common", "quinn", @@ -2460,6 +2503,7 @@ dependencies = [ "solana-sdk", "thiserror", "tokio", + "vergen", ] [[package]] @@ -2900,6 +2944,9 @@ name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] [[package]] name = "serde" @@ -2941,6 +2988,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3941,7 +3997,9 @@ checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "libc", "num-conv", + "num_threads", "powerfmt", "serde", "time-core", @@ -4060,11 +4118,26 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", +] + [[package]] name = "toml_datetime" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -4073,6 +4146,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.2.6", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -4223,6 +4298,18 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "vergen" +version = "8.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e27d6bdd219887a9eadd19e1c34f32e47fa332301184935c6d9bca26f3cca525" +dependencies = [ + "anyhow", + "rustc_version", + "rustversion", + "time", +] + [[package]] name = "version_check" version = "0.9.4" diff --git a/Cargo.toml b/Cargo.toml index 0fee1e5..dc6997d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,15 @@ pem = "1.1.1" lz4 = "1.24.0" async-stream = "0.3.5" +cargo-lock = "9.0.0" +git-version = "0.3.5" +vergen = "8.2.1" + quic-geyser-common = {path = "common", version="0.1.0"} quic-geyser-client = {path = "client", version="0.1.0"} -quic-geyser-plugin = {path = "plugin", version="0.1.0"} \ No newline at end of file +quic-geyser-plugin = {path = "plugin", version="0.1.0"} + +[profile.release] +debug = true +lto = true +codegen-units = 1 \ No newline at end of file diff --git a/config.json b/config.json index e046790..05f43f0 100644 --- a/config.json +++ b/config.json @@ -1,3 +1,17 @@ { - "libpath": "target/debug/libquic_geyser_plugin.so" + "libpath": "target/debug/libquic_geyser_plugin.so", + "quic_plugin": { + "address": "0.0.0.0:10800", + "compression_parameters": { + "compression_type": { + "Lz4Fast": 8 + } + }, + "number_of_retries": 100, + "quic_parameters": { + "connection_timeout": 600, + "max_number_of_streams_per_client": 1024, + "recieve_window_size": 1000000 + } + } } diff --git a/plugin/Cargo.toml b/plugin/Cargo.toml index e908f31..9bcbbf5 100644 --- a/plugin/Cargo.toml +++ b/plugin/Cargo.toml @@ -24,4 +24,13 @@ quinn = { workspace = "true" } log = { workspace = "true" } thiserror = {workspace = "true"} -quic-geyser-common = { path = "../common" } \ No newline at end of file +quic-geyser-common = { path = "../common" } + +[build-dependencies] +anyhow = { workspace = true } +cargo-lock = { workspace = true } +git-version = { workspace = true } +vergen = { workspace = true, features = ["build", "rustc"] } + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] \ No newline at end of file diff --git a/plugin/build.rs b/plugin/build.rs new file mode 100644 index 0000000..f50e332 --- /dev/null +++ b/plugin/build.rs @@ -0,0 +1,34 @@ +use {cargo_lock::Lockfile, std::collections::HashSet}; + +fn main() -> anyhow::Result<()> { + let mut envs = vergen::EmitBuilder::builder(); + envs.all_build().all_rustc(); + envs.emit()?; + + // vergen git version does not looks cool + println!( + "cargo:rustc-env=GIT_VERSION={}", + git_version::git_version!() + ); + + // Extract packages version + let lockfile = Lockfile::load("../Cargo.lock")?; + println!( + "cargo:rustc-env=SOLANA_SDK_VERSION={}", + get_pkg_version(&lockfile, "solana-sdk") + ); + + Ok(()) +} + +fn get_pkg_version(lockfile: &Lockfile, pkg_name: &str) -> String { + lockfile + .packages + .iter() + .filter(|pkg| pkg.name.as_str() == pkg_name) + .map(|pkg| pkg.version.to_string()) + .collect::>() + .into_iter() + .collect::>() + .join(",") +} diff --git a/plugin/src/quic/quic_server.rs b/plugin/src/quic/quic_server.rs index 8938dd1..c7aa934 100644 --- a/plugin/src/quic/quic_server.rs +++ b/plugin/src/quic/quic_server.rs @@ -1,6 +1,9 @@ use std::{ net::{IpAddr, Ipv4Addr, UdpSocket}, - sync::Arc, + sync::{ + atomic::{AtomicUsize, Ordering}, + Arc, + }, }; use agave_geyser_plugin_interface::geyser_plugin_interface::{GeyserPluginError, Result}; @@ -19,7 +22,10 @@ use solana_sdk::{ account::Account, clock::Slot, commitment_config::CommitmentLevel, pubkey::Pubkey, signature::Keypair, }; -use tokio::sync::mpsc::UnboundedSender; +use tokio::{ + runtime::{Builder, Runtime}, + sync::mpsc::UnboundedSender, +}; use crate::{config::Config, plugin_error::QuicGeyserError}; @@ -37,6 +43,7 @@ pub enum ChannelMessage { #[derive(Debug)] pub struct QuicServer { + runtime: Runtime, _quic_connection_manager: ConnectionManager, data_channel_sender: UnboundedSender, } @@ -61,7 +68,15 @@ impl QuicServer { Some(server_config), socket, Arc::new(TokioRuntime), - )?; + ); + let endpoint = match endpoint { + Ok(e) => e, + Err(e) => { + let s = e.to_string(); + log::info!("{}", s); + panic!("todo") + } + }; let retry_count = config.quic_plugin.number_of_retries; let (quic_connection_manager, _jh) = ConnectionManager::new( @@ -110,6 +125,7 @@ impl QuicServer { Ok(QuicServer { _quic_connection_manager: quic_connection_manager, data_channel_sender, + runtime, }) } diff --git a/tester/src/main.rs b/tester/src/main.rs index 3b1442c..9308f09 100644 --- a/tester/src/main.rs +++ b/tester/src/main.rs @@ -1,4 +1,5 @@ use std::{ + net::{Ipv4Addr, SocketAddrV4}, sync::{atomic::AtomicU64, Arc}, time::Duration, }; @@ -8,6 +9,8 @@ use cli::Args; use futures::StreamExt; use quic_geyser_client::{client::Client, DEFAULT_MAX_STREAM}; use quic_geyser_common::filters::{AccountFilter, Filter}; +use quic_geyser_plugin::config::{CompressionParameters, Config, ConfigQuicPlugin, QuicParameters}; +use serde_json::json; use solana_rpc_client::nonblocking::rpc_client::RpcClient; use solana_sdk::{commitment_config::CommitmentConfig, pubkey::Pubkey, signature::Keypair}; use tokio::pin; @@ -15,26 +18,43 @@ use tokio::pin; pub mod cli; // to create a config json - // let config = Config { - // libpath: "temp".to_string(), - // quic_plugin: ConfigQuicPlugin { - // address: std::net::SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 10800)), - // quic_parameters: QuicParameters { - // max_number_of_streams_per_client: 1024, - // recieve_window_size: 1_000_000, - // connection_timeout: 600, - // }, - // compression_parameters: CompressionParameters { - // compression_type: quic_geyser_common::compression::CompressionType::Lz4Fast(8), - // }, - // number_of_retries: 100, - // }, - // }; - // let config_json = json!(config); - //println!("{}", config_json); +// let config = Config { +// libpath: "temp".to_string(), +// quic_plugin: ConfigQuicPlugin { +// address: std::net::SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 10800)), +// quic_parameters: QuicParameters { +// max_number_of_streams_per_client: 1024, +// recieve_window_size: 1_000_000, +// connection_timeout: 600, +// }, +// compression_parameters: CompressionParameters { +// compression_type: quic_geyser_common::compression::CompressionType::Lz4Fast(8), +// }, +// number_of_retries: 100, +// }, +// }; +// let config_json = json!(config); +//println!("{}", config_json); #[tokio::main] async fn main() { + let config = Config { + libpath: "temp".to_string(), + quic_plugin: ConfigQuicPlugin { + address: std::net::SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 10800)), + quic_parameters: QuicParameters { + max_number_of_streams_per_client: 1024, + recieve_window_size: 1_000_000, + connection_timeout: 600, + }, + compression_parameters: CompressionParameters { + compression_type: quic_geyser_common::compression::CompressionType::Lz4Fast(8), + }, + number_of_retries: 100, + }, + }; + let config_json = json!(config); + println!("{}", config_json); let args = Args::parse(); let client = Client::new(args.url, &Keypair::new(), DEFAULT_MAX_STREAM)