diff --git a/Cargo.toml b/Cargo.toml index adb5c8b210..a5fa2b3da3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ members = [ "server-cli", "voxygen", "world", - "network", + "network", ] # default profile for devs, fast to compile, okay enough to run, no debug information diff --git a/network/Cargo.lock b/network/Cargo.lock deleted file mode 100644 index e8966891a8..0000000000 --- a/network/Cargo.lock +++ /dev/null @@ -1,901 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "aho-corasick" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "async-std" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "async-task 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "async-task" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "autocfg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "bincode" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "bitflags" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "byteorder" -version = "1.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "chrono" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-channel" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-channel" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-deque" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-utils" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "crossbeam-utils" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "fnv" -version = "1.0.6" -source = "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.2.1 (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 = "futures" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "futures-channel" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "futures-core" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-executor" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "futures-io" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "futures-sink" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-task" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-timer" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "futures-util" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "getrandom" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "hermit-abi" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "itoa" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "libc" -version = "0.2.69" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "log" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "matchers" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "regex-automata 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "maybe-uninit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "memchr" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "memoffset" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mio" -version = "0.6.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "mio-uds" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "miow" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "net2" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-integer" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num-traits" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "num_cpus" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "hermit-abi 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "once_cell" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "pin-project" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "pin-project-internal" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "pin-project-lite" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "pin-utils" -version = "0.1.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "ppv-lite86" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "proc-macro-hack" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "proc-macro-nested" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "proc-macro2" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "prometheus" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "protobuf 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "protobuf" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "quote" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "redox_syscall" -version = "0.1.56" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "regex" -version = "1.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-automata" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "regex-syntax" -version = "0.6.17" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "ryu" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde_json" -version = "1.0.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "sharded-slab" -version = "0.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "slab" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "smallvec" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "syn" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "thread_local" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "time" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tracing" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-attributes 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tracing-core" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tracing-futures" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tracing-log" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tracing-serde" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "matchers 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", - "sharded-slab 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-log 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "unicode-xid" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "uvth" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "veloren_network" -version = "0.1.0" -dependencies = [ - "async-std 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "prometheus 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-futures 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tracing-subscriber 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "uvth 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[metadata] -"checksum aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" -"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -"checksum async-std 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "538ecb01eb64eecd772087e5b6f7540cbc917f047727339a472dafed2185b267" -"checksum async-task 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0ac2c016b079e771204030951c366db398864f5026f84a44dafb0ff20f02085d" -"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" -"checksum bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" -"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" -"checksum crossbeam-channel 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" -"checksum crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" -"checksum crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" -"checksum crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" -"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" -"checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" -"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" -"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 futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5c329ae8753502fb44ae4fc2b622fa2a94652c41e795143765ba0927f92ab780" -"checksum futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8" -"checksum futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" -"checksum futures-executor 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba" -"checksum futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" -"checksum futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" -"checksum futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" -"checksum futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" -"checksum futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" -"checksum futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5" -"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" -"checksum hermit-abi 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "725cf19794cf90aa94e65050cb4191ff5d8fa87a498383774c47b332e3af952e" -"checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -"checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c54d9f465d530a752e6ebdc217e081a7a614b48cb200f6f0aee21ba6bc9aabb" -"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum libc 0.2.69 (registry+https://github.com/rust-lang/crates.io-index)" = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" -"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" -"checksum matchers 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" -"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" -"checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" -"checksum memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" -"checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" -"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" -"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" -"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" -"checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" -"checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b" -"checksum pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7804a463a8d9572f13453c516a5faea534a2403d7ced2f0c7e100eeff072772c" -"checksum pin-project-internal 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "385322a45f2ecf3410c68d2a549a4a2685e8051d0f278e39743ff4e451cb9b3f" -"checksum pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" -"checksum pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" -"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" -"checksum proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63" -"checksum proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" -"checksum proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3" -"checksum prometheus 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5567486d5778e2c6455b1b90ff1c558f29e751fc018130fa182e15828e728af1" -"checksum protobuf 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8e86d370532557ae7573551a1ec8235a0f8d6cb276c7c9e6aa490b511c447485" -"checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" -"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -"checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7f6946991529684867e47d86474e3a6d0c0ab9b82d5821e314b1ede31fa3a4b3" -"checksum regex-automata 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" -"checksum regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" -"checksum ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76" -"checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -"checksum serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)" = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399" -"checksum serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)" = "da07b57ee2623368351e9a0488bb0b261322a15a6e0ae53e243cbdc0f4208da9" -"checksum sharded-slab 0.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ae75d0445b5d3778c9da3d1f840faa16d0627c8607f78a74daf69e5b988c39a1" -"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" -"checksum smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05720e22615919e4734f6a99ceae50d00226c3c5aca406e102ebc33298214e0a" -"checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" -"checksum syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03" -"checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" -"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tracing 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1721cc8cf7d770cc4257872507180f35a4797272f5962f24c806af9e7faf52ab" -"checksum tracing-attributes 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "7fbad39da2f9af1cae3016339ad7f2c7a9e870f12e8fd04c4fd7ef35b30c0d2b" -"checksum tracing-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715" -"checksum tracing-futures 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "58b0b7fd92dc7b71f29623cc6836dd7200f32161a2313dd78be233a8405694f6" -"checksum tracing-log 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9" -"checksum tracing-serde 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b6ccba2f8f16e0ed268fc765d9b7ff22e965e7185d32f8f1ec8294fe17d86e79" -"checksum tracing-subscriber 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cfc50df245be6f0adf35c399cb16dea60e2c7d6cc83ff5dc22d727df06dd6f0c" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum uvth 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e59a167890d173eb0fcd7a1b99b84dc05c521ae8d76599130b8e19bef287abbf" -"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" -"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" diff --git a/network/examples/.gitignore b/network/examples/.gitignore deleted file mode 100644 index 3a70e511f5..0000000000 --- a/network/examples/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# dont save cargo locks for examples -*/Cargo.lock \ No newline at end of file diff --git a/network/examples/async_recv/Cargo.lock b/network/examples/async_recv/Cargo.lock new file mode 100644 index 0000000000..d015d8bb72 --- /dev/null +++ b/network/examples/async_recv/Cargo.lock @@ -0,0 +1,978 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi 0.3.8", +] + +[[package]] +name = "async-recv" +version = "0.1.0" +dependencies = [ + "bincode", + "chrono", + "clap", + "futures", + "serde", + "tracing", + "tracing-subscriber", + "uvth", + "veloren_network", +] + +[[package]] +name = "async-std" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538ecb01eb64eecd772087e5b6f7540cbc917f047727339a472dafed2185b267" +dependencies = [ + "async-task", + "crossbeam-channel 0.4.2", + "crossbeam-deque", + "crossbeam-utils 0.7.2", + "futures-core", + "futures-io", + "futures-timer", + "kv-log-macro", + "log", + "memchr", + "mio", + "mio-uds", + "num_cpus", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "async-task" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ac2c016b079e771204030951c366db398864f5026f84a44dafb0ff20f02085d" +dependencies = [ + "libc", + "winapi 0.3.8", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi 0.3.8", +] + +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" + +[[package]] +name = "bincode" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" +dependencies = [ + "byteorder", + "serde", +] + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "chrono" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" +dependencies = [ + "num-integer", + "num-traits", + "time", +] + +[[package]] +name = "clap" +version = "2.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "crossbeam-channel" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" +dependencies = [ + "crossbeam-utils 0.6.6", +] + +[[package]] +name = "crossbeam-channel" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" +dependencies = [ + "crossbeam-utils 0.7.2", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-deque" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils 0.7.2", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils 0.7.2", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" +dependencies = [ + "cfg-if", + "lazy_static", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if", + "lazy_static", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "bitflags", + "fuchsia-zircon-sys", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" + +[[package]] +name = "futures" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" + +[[package]] +name = "futures-executor" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" + +[[package]] +name = "futures-macro" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" + +[[package]] +name = "futures-task" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" +dependencies = [ + "once_cell", +] + +[[package]] +name = "futures-timer" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" + +[[package]] +name = "futures-util" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hermit-abi" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71" +dependencies = [ + "libc", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + +[[package]] +name = "itoa" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ff57d6d215f7ca7eb35a9a64d656ba4d9d2bef114d741dc08048e75e2f5d418" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" + +[[package]] +name = "log" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + +[[package]] +name = "memoffset" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mio" +version = "0.6.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" +dependencies = [ + "cfg-if", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow", + "net2", + "slab", + "winapi 0.2.8", +] + +[[package]] +name = "mio-uds" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" +dependencies = [ + "iovec", + "libc", + "mio", +] + +[[package]] +name = "miow" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", +] + +[[package]] +name = "net2" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" +dependencies = [ + "cfg-if", + "libc", + "winapi 0.3.8", +] + +[[package]] +name = "num-integer" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" + +[[package]] +name = "pin-project" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df32da11d84f3a7d70205549562966279adb900e080fad3dccd8e64afccf0ad" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" + +[[package]] +name = "proc-macro-hack" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4" + +[[package]] +name = "proc-macro-nested" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" + +[[package]] +name = "proc-macro2" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "prometheus" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5567486d5778e2c6455b1b90ff1c558f29e751fc018130fa182e15828e728af1" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "protobuf", + "quick-error", + "spin", +] + +[[package]] +name = "protobuf" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e86d370532557ae7573551a1ec8235a0f8d6cb276c7c9e6aa490b511c447485" + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "regex" +version = "1.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-automata" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +dependencies = [ + "byteorder", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2c3ac8e6ca1e9c80b8be1023940162bf81ae3cffbb1809474152f2ce1eb250" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d5a3f5166fb5b42a5439f2eee8b9de149e235961e3eb21c5808fc3ea17ff3e" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" + +[[package]] +name = "smallvec" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4" + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "syn" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93a56fabc59dce20fe48b6c832cc249c713e7ed88fa28b0ee0a3bfcaae5fe4e2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi 0.3.8", +] + +[[package]] +name = "tracing" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7c6b59d116d218cb2d990eb06b77b64043e0268ef7323aae63d8b30ae462923" +dependencies = [ + "cfg-if", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99bbad0de3fd923c9c3232ead88510b783e5a4d16a6154adffa3d53308de984c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tracing-futures" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-log" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6ccba2f8f16e0ed268fc765d9b7ff22e965e7185d32f8f1ec8294fe17d86e79" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d53c40489aa69c9aed21ff483f26886ca8403df33bdc2d2f87c60c1617826d2" +dependencies = [ + "ansi_term", + "chrono", + "lazy_static", + "matchers", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "unicode-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" + +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" + +[[package]] +name = "uvth" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e59a167890d173eb0fcd7a1b99b84dc05c521ae8d76599130b8e19bef287abbf" +dependencies = [ + "crossbeam-channel 0.3.9", + "log", + "num_cpus", +] + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "veloren_network" +version = "0.1.0" +dependencies = [ + "async-std", + "bincode", + "futures", + "lazy_static", + "prometheus", + "rand", + "serde", + "tracing", + "tracing-futures", + "uvth", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + +[[package]] +name = "winapi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] diff --git a/network/examples/async_recv/Cargo.toml b/network/examples/async_recv/Cargo.toml index 6eb51c19cd..ceb362c679 100644 --- a/network/examples/async_recv/Cargo.toml +++ b/network/examples/async_recv/Cargo.toml @@ -17,4 +17,4 @@ tracing = "0.1" chrono = "0.4" tracing-subscriber = "0.2.3" bincode = "1.2" -serde = "1.0" \ No newline at end of file +serde = { version = "1.0", features = ["derive"] } \ No newline at end of file diff --git a/network/examples/async_recv/src/main.rs b/network/examples/async_recv/src/main.rs index 2a547592c1..5da8627fc0 100644 --- a/network/examples/async_recv/src/main.rs +++ b/network/examples/async_recv/src/main.rs @@ -1,10 +1,13 @@ +//!run with +//! ```bash +//! (cd network/examples/async_recv && RUST_BACKTRACE=1 cargo run) +//! ``` use chrono::prelude::*; use clap::{App, Arg}; use futures::executor::block_on; use network::{Address, Network, Pid, Stream, PROMISES_NONE}; use serde::{Deserialize, Serialize}; use std::{ - net::SocketAddr, thread, time::{Duration, Instant}, }; @@ -107,7 +110,7 @@ fn main() { fn server(address: Address) { let thread_pool = ThreadPoolBuilder::new().build(); - let server = Network::new(Pid::new(), &thread_pool); + let server = Network::new(Pid::new(), &thread_pool, None); block_on(server.listen(address.clone())).unwrap(); //await println!("waiting for client"); @@ -179,7 +182,7 @@ async fn async_task2(mut s: Stream) -> u64 { fn client(address: Address) { let thread_pool = ThreadPoolBuilder::new().build(); - let client = Network::new(Pid::new(), &thread_pool); + let client = Network::new(Pid::new(), &thread_pool, None); let p1 = block_on(client.connect(address.clone())).unwrap(); //remote representation of p1 let s1 = block_on(p1.open(16, PROMISES_NONE)).unwrap(); //remote representation of s1 diff --git a/network/examples/chat/Cargo.lock b/network/examples/chat/Cargo.lock index b0b07e7af0..148709ed50 100644 --- a/network/examples/chat/Cargo.lock +++ b/network/examples/chat/Cargo.lock @@ -704,20 +704,6 @@ name = "serde" version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] [[package]] name = "serde_json" @@ -919,7 +905,6 @@ version = "0.1.0" dependencies = [ "async-std", "bincode", - "byteorder", "futures", "lazy_static", "prometheus", diff --git a/network/examples/chat/src/main.rs b/network/examples/chat/src/main.rs index f0df705b80..1ddb0fca0a 100644 --- a/network/examples/chat/src/main.rs +++ b/network/examples/chat/src/main.rs @@ -1,3 +1,8 @@ +//!run with +//! ```bash +//! (cd network/examples/chat && RUST_BACKTRACE=1 cargo run --release -- --trace=info --port 15006) +//! (cd network/examples/chat && RUST_BACKTRACE=1 cargo run --release -- --trace=info --port 15006 --mode=client) +//! ``` use async_std::io; use clap::{App, Arg}; use futures::executor::{block_on, ThreadPool}; @@ -96,7 +101,7 @@ fn main() { fn server(address: Address) { let thread_pool = ThreadPoolBuilder::new().build(); - let server = Arc::new(Network::new(Pid::new(), &thread_pool)); + let server = Arc::new(Network::new(Pid::new(), &thread_pool, None)); let pool = ThreadPool::new().unwrap(); block_on(async { server.listen(address).await.unwrap(); @@ -135,7 +140,7 @@ async fn client_connection(network: Arc, participant: Arc) fn client(address: Address) { let thread_pool = ThreadPoolBuilder::new().build(); - let client = Network::new(Pid::new(), &thread_pool); + let client = Network::new(Pid::new(), &thread_pool, None); let pool = ThreadPool::new().unwrap(); block_on(async { diff --git a/network/examples/fileshare/Cargo.lock b/network/examples/fileshare/Cargo.lock index 935f43ccc7..4bf8e8870b 100644 --- a/network/examples/fileshare/Cargo.lock +++ b/network/examples/fileshare/Cargo.lock @@ -1010,7 +1010,6 @@ version = "0.1.0" dependencies = [ "async-std", "bincode", - "byteorder", "futures", "lazy_static", "prometheus", diff --git a/network/examples/fileshare/Cargo.toml b/network/examples/fileshare/Cargo.toml index a39df5e636..f175a55f1b 100644 --- a/network/examples/fileshare/Cargo.toml +++ b/network/examples/fileshare/Cargo.toml @@ -17,6 +17,6 @@ futures = "0.3" tracing = "0.1" tracing-subscriber = "0.2.3" bincode = "1.2" -serde = "1.0" +serde = { version = "1.0", features = ["derive"] } rand = "0.7.3" shellexpand = "2.0.0" \ No newline at end of file diff --git a/network/examples/fileshare/src/main.rs b/network/examples/fileshare/src/main.rs index 4b8e1ef760..5647dfaf07 100644 --- a/network/examples/fileshare/src/main.rs +++ b/network/examples/fileshare/src/main.rs @@ -1,5 +1,8 @@ #![feature(async_closure, exclusive_range_pattern)] - +//!run with +//! (cd network/examples/fileshare && RUST_BACKTRACE=1 cargo run --profile=release -Z unstable-options -- --trace=info --port 15006) +//! (cd network/examples/fileshare && RUST_BACKTRACE=1 cargo run --profile=release -Z unstable-options -- --trace=info --port 15007) +//! ``` use async_std::{io, path::PathBuf}; use clap::{App, Arg, SubCommand}; use futures::{ @@ -152,7 +155,7 @@ async fn client(mut cmd_sender: mpsc::UnboundedSender) { cmd_sender.send(LocalCommand::Disconnect).await.unwrap(); }, ("connect", Some(connect_matches)) => { - let socketaddr = connect_matches.value_of("ipport").unwrap().parse().unwrap(); + let socketaddr = connect_matches.value_of("ip:port").unwrap().parse().unwrap(); cmd_sender .send(LocalCommand::Connect(Address::Tcp(socketaddr))) .await diff --git a/network/examples/fileshare/src/server.rs b/network/examples/fileshare/src/server.rs index 2073f5ab15..9628e4f384 100644 --- a/network/examples/fileshare/src/server.rs +++ b/network/examples/fileshare/src/server.rs @@ -28,7 +28,7 @@ impl Server { let (command_sender, command_receiver) = mpsc::unbounded(); let thread_pool = ThreadPoolBuilder::new().build(); - let network = Network::new(Pid::new(), &thread_pool); + let network = Network::new(Pid::new(), &thread_pool, None); let run_channels = Some(ControlChannels { command_receiver }); ( diff --git a/network/examples/network-speed/Cargo.lock b/network/examples/network-speed/Cargo.lock new file mode 100644 index 0000000000..2fcebd2eb7 --- /dev/null +++ b/network/examples/network-speed/Cargo.lock @@ -0,0 +1,1056 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi 0.3.8", +] + +[[package]] +name = "ascii" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbf56136a5198c7b01a49e3afcbef6cf84597273d298f54432926024107b0109" + +[[package]] +name = "async-std" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "538ecb01eb64eecd772087e5b6f7540cbc917f047727339a472dafed2185b267" +dependencies = [ + "async-task", + "crossbeam-channel 0.4.2", + "crossbeam-deque", + "crossbeam-utils 0.7.2", + "futures-core", + "futures-io", + "futures-timer", + "kv-log-macro", + "log", + "memchr", + "mio", + "mio-uds", + "num_cpus", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "async-task" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ac2c016b079e771204030951c366db398864f5026f84a44dafb0ff20f02085d" +dependencies = [ + "libc", + "winapi 0.3.8", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi 0.3.8", +] + +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" + +[[package]] +name = "bincode" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" +dependencies = [ + "byteorder", + "serde", +] + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "chrono" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" +dependencies = [ + "num-integer", + "num-traits", + "time", +] + +[[package]] +name = "chunked_transfer" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b89647f09b9f4c838cb622799b2843e4e13bff64661dab9a0362bb92985addd" + +[[package]] +name = "clap" +version = "2.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "crossbeam-channel" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ec7fcd21571dc78f96cc96243cab8d8f035247c3efd16c687be154c3fa9efa" +dependencies = [ + "crossbeam-utils 0.6.6", +] + +[[package]] +name = "crossbeam-channel" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" +dependencies = [ + "crossbeam-utils 0.7.2", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-deque" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils 0.7.2", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils 0.7.2", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" +dependencies = [ + "cfg-if", + "lazy_static", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if", + "lazy_static", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "bitflags", + "fuchsia-zircon-sys", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" + +[[package]] +name = "futures" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" + +[[package]] +name = "futures-executor" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" + +[[package]] +name = "futures-macro" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" + +[[package]] +name = "futures-task" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" +dependencies = [ + "once_cell", +] + +[[package]] +name = "futures-timer" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" + +[[package]] +name = "futures-util" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hermit-abi" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71" +dependencies = [ + "libc", +] + +[[package]] +name = "idna" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + +[[package]] +name = "itoa" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ff57d6d215f7ca7eb35a9a64d656ba4d9d2bef114d741dc08048e75e2f5d418" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" + +[[package]] +name = "log" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matchers" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + +[[package]] +name = "memoffset" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mio" +version = "0.6.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" +dependencies = [ + "cfg-if", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow", + "net2", + "slab", + "winapi 0.2.8", +] + +[[package]] +name = "mio-uds" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" +dependencies = [ + "iovec", + "libc", + "mio", +] + +[[package]] +name = "miow" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", +] + +[[package]] +name = "net2" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" +dependencies = [ + "cfg-if", + "libc", + "winapi 0.3.8", +] + +[[package]] +name = "network-speed" +version = "0.1.0" +dependencies = [ + "bincode", + "clap", + "futures", + "prometheus", + "serde", + "tiny_http", + "tracing", + "tracing-subscriber", + "uvth", + "veloren_network", +] + +[[package]] +name = "num-integer" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df32da11d84f3a7d70205549562966279adb900e080fad3dccd8e64afccf0ad" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" + +[[package]] +name = "proc-macro-hack" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4" + +[[package]] +name = "proc-macro-nested" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" + +[[package]] +name = "proc-macro2" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "prometheus" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5567486d5778e2c6455b1b90ff1c558f29e751fc018130fa182e15828e728af1" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "protobuf", + "quick-error", + "spin", +] + +[[package]] +name = "protobuf" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e86d370532557ae7573551a1ec8235a0f8d6cb276c7c9e6aa490b511c447485" + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "regex" +version = "1.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-automata" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +dependencies = [ + "byteorder", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2c3ac8e6ca1e9c80b8be1023940162bf81ae3cffbb1809474152f2ce1eb250" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d5a3f5166fb5b42a5439f2eee8b9de149e235961e3eb21c5808fc3ea17ff3e" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" + +[[package]] +name = "smallvec" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4" + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "syn" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93a56fabc59dce20fe48b6c832cc249c713e7ed88fa28b0ee0a3bfcaae5fe4e2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi 0.3.8", +] + +[[package]] +name = "tiny_http" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15ce4fc3c4cdea1a4399bb1819a539195fb69db4bbe0bde5b7c7f18fed412e02" +dependencies = [ + "ascii", + "chrono", + "chunked_transfer", + "log", + "url", +] + +[[package]] +name = "tracing" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7c6b59d116d218cb2d990eb06b77b64043e0268ef7323aae63d8b30ae462923" +dependencies = [ + "cfg-if", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99bbad0de3fd923c9c3232ead88510b783e5a4d16a6154adffa3d53308de984c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aa83a9a47081cd522c09c81b31aec2c9273424976f922ad61c053b58350b715" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tracing-futures" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-log" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6ccba2f8f16e0ed268fc765d9b7ff22e965e7185d32f8f1ec8294fe17d86e79" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d53c40489aa69c9aed21ff483f26886ca8403df33bdc2d2f87c60c1617826d2" +dependencies = [ + "ansi_term", + "chrono", + "lazy_static", + "matchers", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +dependencies = [ + "matches", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" +dependencies = [ + "smallvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" + +[[package]] +name = "unicode-xid" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" + +[[package]] +name = "url" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" +dependencies = [ + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "uvth" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e59a167890d173eb0fcd7a1b99b84dc05c521ae8d76599130b8e19bef287abbf" +dependencies = [ + "crossbeam-channel 0.3.9", + "log", + "num_cpus", +] + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "veloren_network" +version = "0.1.0" +dependencies = [ + "async-std", + "bincode", + "futures", + "lazy_static", + "prometheus", + "rand", + "serde", + "tracing", + "tracing-futures", + "uvth", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + +[[package]] +name = "winapi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] diff --git a/network/examples/network-speed/src/main.rs b/network/examples/network-speed/src/main.rs index ef44609307..77410c1499 100644 --- a/network/examples/network-speed/src/main.rs +++ b/network/examples/network-speed/src/main.rs @@ -1,13 +1,18 @@ +///run with +/// ```bash +/// (cd network/examples/network-speed && RUST_BACKTRACE=1 cargo run --profile=debuginfo -Z unstable-options -- --trace=error --protocol=tcp --mode=server) +/// (cd network/examples/network-speed && RUST_BACKTRACE=1 cargo run --profile=debuginfo -Z unstable-options -- --trace=error --protocol=tcp --mode=client) +/// ``` mod metrics; use clap::{App, Arg}; use futures::executor::block_on; -use network::{Address, Network, Pid, PROMISES_CONSISTENCY, PROMISES_ORDERED, MessageBuffer}; +use network::{Address, MessageBuffer, Network, Pid, PROMISES_CONSISTENCY, PROMISES_ORDERED}; use serde::{Deserialize, Serialize}; use std::{ + sync::Arc, thread, time::{Duration, Instant}, - sync::Arc, }; use tracing::*; use tracing_subscriber::EnvFilter; @@ -152,11 +157,12 @@ fn client(address: Address) { let mut s1 = block_on(p1.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY)).unwrap(); //remote representation of s1 let mut last = Instant::now(); let mut id = 0u64; - let raw_msg = Arc::new(MessageBuffer{ + let raw_msg = Arc::new(MessageBuffer { data: bincode::serialize(&Msg::Ping { id, data: vec![0; 1000], - }).unwrap(), + }) + .unwrap(), }); loop { s1.send_raw(raw_msg.clone()).unwrap(); @@ -172,13 +178,13 @@ fn client(address: Address) { std::thread::sleep(std::time::Duration::from_millis(5000)); break; } - }; + } drop(s1); std::thread::sleep(std::time::Duration::from_millis(5000)); info!("closing participant"); block_on(client.disconnect(p1)).unwrap(); - std::thread::sleep(std::time::Duration::from_millis(75000)); + std::thread::sleep(std::time::Duration::from_millis(25000)); info!("DROPPING! client"); drop(client); - std::thread::sleep(std::time::Duration::from_millis(75000)); + std::thread::sleep(std::time::Duration::from_millis(25000)); } diff --git a/network/examples/network-speed/src/metrics.rs b/network/examples/network-speed/src/metrics.rs index 9186c3fdc8..978c686d58 100644 --- a/network/examples/network-speed/src/metrics.rs +++ b/network/examples/network-speed/src/metrics.rs @@ -1,6 +1,4 @@ use prometheus::{Encoder, Registry, TextEncoder}; -use tiny_http; -use tracing::*; use std::{ error::Error, net::SocketAddr, @@ -10,6 +8,8 @@ use std::{ }, thread, }; +use tiny_http; +use tracing::*; pub struct SimpleMetrics { running: Arc, @@ -54,15 +54,25 @@ impl SimpleMetrics { let request = match server.recv_timeout(TIMEOUT) { Ok(Some(rq)) => rq, Ok(None) => continue, - Err(e) => { println!("error: {}", e); break } + Err(e) => { + println!("error: {}", e); + break; + }, }; let mf = registry.gather(); let encoder = TextEncoder::new(); let mut buffer = vec![]; - encoder.encode(&mf, &mut buffer).expect("Failed to encoder metrics text."); - let response = tiny_http::Response::from_string(String::from_utf8(buffer).expect("Failed to parse bytes as a string.")); + encoder + .encode(&mf, &mut buffer) + .expect("Failed to encoder metrics text."); + let response = tiny_http::Response::from_string( + String::from_utf8(buffer).expect("Failed to parse bytes as a string."), + ); match request.respond(response) { - Err(e) => error!(?e, "The metrics HTTP server had encountered and error with answering"), + Err(e) => error!( + ?e, + "The metrics HTTP server had encountered and error with answering" + ), _ => (), } } @@ -81,4 +91,4 @@ impl Drop for SimpleMetrics { .join() .expect("Error shutting down prometheus metric exporter"); } -} \ No newline at end of file +} diff --git a/network/examples/tcp-loadtest/Cargo.lock b/network/examples/tcp-loadtest/Cargo.lock new file mode 100644 index 0000000000..189d054fd9 --- /dev/null +++ b/network/examples/tcp-loadtest/Cargo.lock @@ -0,0 +1,84 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "getrandom" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" + +[[package]] +name = "ppv-lite86" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "tcp-loadtest" +version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" diff --git a/network/examples/tcp-loadtest/src/main.rs b/network/examples/tcp-loadtest/src/main.rs index acc3e1f746..d1d2bbe9f4 100644 --- a/network/examples/tcp-loadtest/src/main.rs +++ b/network/examples/tcp-loadtest/src/main.rs @@ -1,3 +1,7 @@ +//!run with +//! ```bash +//! (cd network/examples/tcp-loadtest && RUST_BACKTRACE=1 cargo run 127.0.0.1 52000) +//! ``` use std::{ env, io::Write, diff --git a/network/src/api.rs b/network/src/api.rs index d8d24e1b1a..cbe13541fa 100644 --- a/network/src/api.rs +++ b/network/src/api.rs @@ -1,3 +1,7 @@ +//! +//! +//! +//! (cd network/examples/async_recv && RUST_BACKTRACE=1 cargo run) use crate::{ message::{self, InCommingMessage, MessageBuffer, OutGoingMessage}, scheduler::Scheduler, @@ -115,13 +119,13 @@ pub enum StreamError { /// use futures::executor::block_on; /// /// # fn main() -> std::result::Result<(), Box> { -/// // Create a Network, listen on port `12345` to accept connections and connect to port `8080` to connect to a (pseudo) database Application +/// // Create a Network, listen on port `2999` to accept connections and connect to port `8080` to connect to a (pseudo) database Application /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// block_on(async{ /// # //setup pseudo database! /// # let database = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// # database.listen(Address::Tcp("127.0.0.1:8080".parse().unwrap())).await?; -/// network.listen(Address::Tcp("127.0.0.1:12345".parse().unwrap())).await?; +/// network.listen(Address::Tcp("127.0.0.1:2999".parse().unwrap())).await?; /// let database = network.connect(Address::Tcp("127.0.0.1:8080".parse().unwrap())).await?; /// # Ok(()) /// }) @@ -248,20 +252,20 @@ impl Network { /// use veloren_network::{Address, Network, Pid}; /// /// # fn main() -> std::result::Result<(), Box> { - /// // Create a Network, connect on port `2000` TCP and `2001` UDP like listening above + /// // Create a Network, connect on port `2010` TCP and `2011` UDP like listening above /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// block_on(async { - /// # remote.listen(Address::Tcp("0.0.0.0:2000".parse().unwrap())).await?; - /// # remote.listen(Address::Udp("0.0.0.0:2001".parse().unwrap())).await?; + /// # remote.listen(Address::Tcp("0.0.0.0:2010".parse().unwrap())).await?; + /// # remote.listen(Address::Udp("0.0.0.0:2011".parse().unwrap())).await?; /// let p1 = network - /// .connect(Address::Tcp("127.0.0.1:2000".parse().unwrap())) + /// .connect(Address::Tcp("127.0.0.1:2010".parse().unwrap())) /// .await?; /// # //this doesn't work yet, so skip the test /// # //TODO fixme! /// # return Ok(()); /// let p2 = network - /// .connect(Address::Udp("127.0.0.1:2001".parse().unwrap())) + /// .connect(Address::Udp("127.0.0.1:2011".parse().unwrap())) /// .await?; /// assert!(std::sync::Arc::ptr_eq(&p1, &p2)); /// # Ok(()) @@ -311,14 +315,14 @@ impl Network { /// use veloren_network::{Address, Network, Pid}; /// /// # fn main() -> std::result::Result<(), Box> { - /// // Create a Network, listen on port `2000` TCP and opens returns their Pid + /// // Create a Network, listen on port `2020` TCP and opens returns their Pid /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// block_on(async { /// network - /// .listen(Address::Tcp("0.0.0.0:2000".parse().unwrap())) + /// .listen(Address::Tcp("0.0.0.0:2020".parse().unwrap())) /// .await?; - /// # remote.connect(Address::Tcp("0.0.0.0:2000".parse().unwrap())).await?; + /// # remote.connect(Address::Tcp("0.0.0.0:2020".parse().unwrap())).await?; /// while let Ok(participant) = network.connected().await { /// println!("Participant connected: {}", participant.remote_pid()); /// # //skip test here as it would be a endless loop @@ -350,7 +354,9 @@ impl Network { /// /// This function will wait for all [`Streams`] to properly close, including /// all messages to be send before closing. If an error occurs with one - /// of the messavb + /// of the messages. + /// Except if the remote side already dropped the [`Participant`] + /// simultaneously, then messages won't be sended /// /// # Examples /// ```rust @@ -359,14 +365,14 @@ impl Network { /// use veloren_network::{Address, Network, Pid}; /// /// # fn main() -> std::result::Result<(), Box> { - /// // Create a Network, listen on port `2000` TCP and opens returns their Pid and close connection. + /// // Create a Network, listen on port `2030` TCP and opens returns their Pid and close connection. /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// block_on(async { /// network - /// .listen(Address::Tcp("0.0.0.0:2000".parse().unwrap())) + /// .listen(Address::Tcp("0.0.0.0:2030".parse().unwrap())) /// .await?; - /// # remote.connect(Address::Tcp("0.0.0.0:2000".parse().unwrap())).await?; + /// # remote.connect(Address::Tcp("0.0.0.0:2030".parse().unwrap())).await?; /// while let Ok(participant) = network.connected().await { /// println!("Participant connected: {}", participant.remote_pid()); /// network.disconnect(participant).await?; @@ -469,13 +475,13 @@ impl Participant { /// use veloren_network::{Address, Network, Pid, PROMISES_CONSISTENCY, PROMISES_ORDERED}; /// /// # fn main() -> std::result::Result<(), Box> { - /// // Create a Network, connect on port 2000 and open a stream + /// // Create a Network, connect on port 2100 and open a stream /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// block_on(async { - /// # remote.listen(Address::Tcp("0.0.0.0:2000".parse().unwrap())).await?; + /// # remote.listen(Address::Tcp("0.0.0.0:2100".parse().unwrap())).await?; /// let p1 = network - /// .connect(Address::Tcp("127.0.0.1:2000".parse().unwrap())) + /// .connect(Address::Tcp("127.0.0.1:2100".parse().unwrap())) /// .await?; /// let _s1 = p1.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?; /// # Ok(()) @@ -530,13 +536,13 @@ impl Participant { /// use futures::executor::block_on; /// /// # fn main() -> std::result::Result<(), Box> { - /// // Create a Network, connect on port 2000 and wait for the other side to open a stream + /// // Create a Network, connect on port 2110 and wait for the other side to open a stream /// // Note: It's quite unusal to activly connect, but then wait on a stream to be connected, usually the Appication taking initiative want's to also create the first Stream. /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// block_on(async { - /// # remote.listen(Address::Tcp("0.0.0.0:2000".parse().unwrap())).await?; - /// let p1 = network.connect(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?; + /// # remote.listen(Address::Tcp("0.0.0.0:2110".parse().unwrap())).await?; + /// let p1 = network.connect(Address::Tcp("127.0.0.1:2110".parse().unwrap())).await?; /// # let p2 = remote.connected().await?; /// # p2.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?; /// let _s1 = p1.opened().await?; @@ -613,9 +619,14 @@ impl Stream { /// any more. A [`StreamError`] will be returned in the error case, e.g. /// when the `Stream` got closed already. /// - /// Note when a `Stream` is dropped, it will still send all messages, though - /// the `drop` will return immediately, however, when a [`Participant`] - /// gets gracefully shut down, all remaining messages will be send. + /// Note when a `Stream` is dropped locally, it will still send all + /// messages, though the `drop` will return immediately, however, when a + /// [`Participant`] gets gracefully shut down, all remaining messages + /// will be send. If the `Stream` is dropped from remote side no further + /// messages are send, because the remote side has no way of listening + /// to them either way. If the last channel is destroyed (e.g. by losing + /// the internet connection or non-gracefull shutdown, pending messages + /// are also dropped. /// /// # Example /// ```rust @@ -623,21 +634,51 @@ impl Stream { /// # use veloren_network::{PROMISES_ORDERED, PROMISES_CONSISTENCY}; /// use uvth::ThreadPoolBuilder; /// use futures::executor::block_on; + /// use tracing::*; + /// use tracing_subscriber::EnvFilter; /// /// # fn main() -> std::result::Result<(), Box> { - /// // Create a Network, listen on Port `2000` and wait for a Stream to be opened, then answer `Hello World` + /// + /// std::thread::spawn(|| { + /// let filter = EnvFilter::from_default_env() + /// .add_directive("trace".parse().unwrap()) + /// .add_directive("async_std::task::block_on=warn".parse().unwrap()) + /// .add_directive("veloren_network::tests=trace".parse().unwrap()) + /// .add_directive("veloren_network::controller=trace".parse().unwrap()) + /// .add_directive("veloren_network::channel=trace".parse().unwrap()) + /// .add_directive("veloren_network::message=trace".parse().unwrap()) + /// .add_directive("veloren_network::metrics=trace".parse().unwrap()) + /// .add_directive("veloren_network::types=trace".parse().unwrap()); + /// let _sub = tracing_subscriber::FmtSubscriber::builder() + /// // all spans/events with a level higher than TRACE (e.g, info, warn, etc.) + /// // will be written to stdout. + /// .with_max_level(Level::TRACE) + /// .with_env_filter(filter) + /// // sets this to be the default, global subscriber for this application. + /// .try_init(); + /// + /// // Create a Network, listen on Port `2200` and wait for a Stream to be opened, then answer `Hello World` /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// block_on(async { - /// network.listen(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?; - /// # let remote_p = remote.connect(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?; - /// # remote_p.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?; - /// let participant_a = network.connected().await?; - /// let mut stream_a = participant_a.opened().await?; + /// network.listen(Address::Tcp("127.0.0.1:2200".parse().unwrap())).await.unwrap(); + /// # let remote_p = remote.connect(Address::Tcp("127.0.0.1:2200".parse().unwrap())).await.unwrap(); + /// # remote_p.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await.unwrap(); + /// let participant_a = network.connected().await.unwrap(); + /// let mut stream_a = participant_a.opened().await.unwrap(); /// //Send Message - /// stream_a.send("Hello World"); - /// # Ok(()) + /// stream_a.send("Hello World").unwrap(); /// }) + /// }); + /// + /// std::thread::sleep(std::time::Duration::from_secs(70)); + /// println!("Sleep another 10s"); + /// std::thread::sleep(std::time::Duration::from_secs(10)); + /// println!("TRACING THE DEADLOCK"); + /// assert!(false); + /// + /// std::thread::sleep(std::time::Duration::from_secs(150)); + /// Ok(()) /// # } /// ``` /// @@ -668,9 +709,9 @@ impl Stream { /// # let remote1 = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// # let remote2 = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); /// block_on(async { - /// network.listen(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?; - /// # let remote1_p = remote1.connect(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?; - /// # let remote2_p = remote2.connect(Address::Tcp("127.0.0.1:2000".parse().unwrap())).await?; + /// network.listen(Address::Tcp("127.0.0.1:2210".parse().unwrap())).await?; + /// # let remote1_p = remote1.connect(Address::Tcp("127.0.0.1:2210".parse().unwrap())).await?; + /// # let remote2_p = remote2.connect(Address::Tcp("127.0.0.1:2210".parse().unwrap())).await?; /// # assert_eq!(remote1_p.remote_pid(), remote2_p.remote_pid()); /// # remote1_p.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?; /// # remote2_p.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?; @@ -717,6 +758,31 @@ impl Stream { /// /// A [`StreamError`] will be returned in the error case, e.g. when the /// `Stream` got closed already. + /// + /// # Example + /// ```rust + /// use veloren_network::{Network, Address, Pid}; + /// # use veloren_network::{PROMISES_ORDERED, PROMISES_CONSISTENCY}; + /// use uvth::ThreadPoolBuilder; + /// use futures::executor::block_on; + /// + /// # fn main() -> std::result::Result<(), Box> { + /// // Create a Network, listen on Port `2220` and wait for a Stream to be opened, then listen on it + /// let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); + /// # let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); + /// block_on(async { + /// network.listen(Address::Tcp("127.0.0.1:2220".parse().unwrap())).await?; + /// # let remote_p = remote.connect(Address::Tcp("127.0.0.1:2220".parse().unwrap())).await?; + /// # let mut stream_p = remote_p.open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY).await?; + /// # stream_p.send("Hello World"); + /// let participant_a = network.connected().await?; + /// let mut stream_a = participant_a.opened().await?; + /// //Send Message + /// println!("{}", stream_a.recv::().await?); + /// # Ok(()) + /// }) + /// # } + /// ``` #[inline] pub async fn recv(&mut self) -> Result { Ok(message::deserialize(self.recv_raw().await?)) @@ -731,7 +797,7 @@ impl Stream { //no need to access self.closed here, as when this stream is closed the Channel // is closed which will trigger a None let msg = self.b2a_msg_recv_r.next().await?; - info!(?msg, "delivering a message"); + //info!(?msg, "delivering a message"); Ok(msg.buffer) } } @@ -745,6 +811,23 @@ impl Drop for Network { "shutting down Participants of Network, while we still have metrics" ); task::block_on(async { + // we need to carefully shut down here! as otherwise we might call + // Participant::Drop with a2s_disconnect_s here which would open + // another task::block, which would panic! also i can't `.write` on + // `self.participants` as the `disconnect` fn needs it. + let mut participant_clone = self.participants().await; + for (_, p) in participant_clone.drain() { + match self.disconnect(p).await { + Err(e) => { + error!( + ?e, + "error while dropping network, the error occured when dropping a \ + participant but can't be notified to the user any more" + ); + }, + _ => (), + } + } self.participants.write().await.clear(); }); debug!(?pid, "shutting down Scheduler"); diff --git a/network/src/lib.rs b/network/src/lib.rs index ad086258b6..22219439c0 100644 --- a/network/src/lib.rs +++ b/network/src/lib.rs @@ -103,6 +103,7 @@ mod participant; mod prios; mod protocols; mod scheduler; +#[macro_use] mod types; pub use api::{Address, Network, NetworkError, Participant, ParticipantError, Stream, StreamError}; diff --git a/network/src/metrics.rs b/network/src/metrics.rs index 8a0b3eb835..eb875040f7 100644 --- a/network/src/metrics.rs +++ b/network/src/metrics.rs @@ -27,13 +27,13 @@ pub struct NetworkMetrics { // Frames counted at protocol level, seperated by CHANNEL (and PARTICIPANT) AND FRAME TYPE, pub frames_wire_out_total: IntCounterVec, pub frames_wire_in_total: IntCounterVec, - pub frames_count: IntGaugeVec, - // send Messages, seperated by STREAM (and PARTICIPANT, CHANNEL), - pub message_count: IntGaugeVec, - // send Messages bytes, seperated by STREAM (and PARTICIPANT, CHANNEL), - pub bytes_send: IntGaugeVec, - // Frames, seperated by MESSAGE (and PARTICIPANT, CHANNEL, STREAM), - pub frames_message_count: IntGaugeVec, + // throughput at protocol level, seperated by CHANNEL (and PARTICIPANT), + pub wire_out_throughput: IntCounterVec, + pub wire_in_throughput: IntCounterVec, + // send(prio) Messages count, seperated by STREAM AND PARTICIPANT, + pub message_out_total: IntCounterVec, + // send(prio) Messages throughput, seperated by STREAM AND PARTICIPANT, + pub message_out_throughput: IntCounterVec, // TODO: queued Messages, seperated by STREAM (add PART, CHANNEL), // queued Messages, seperated by PARTICIPANT pub queued_count: IntGaugeVec, @@ -137,31 +137,35 @@ impl NetworkMetrics { ), &["channel", "frametype"], )?; - - let frames_count = IntGaugeVec::new( + let wire_out_throughput = IntCounterVec::new( Opts::new( - "frames_count", - "number of all frames send by streams on the network", + "wire_out_throughput", + "throupgput of all data frames send per channel, at the protocol level", ), &["channel"], )?; - let message_count = IntGaugeVec::new( + let wire_in_throughput = IntCounterVec::new( Opts::new( - "message_count", + "wire_in_throughput", + "throupgput of all data frames send per channel, at the protocol level", + ), + &["channel"], + )?; + //TODO IN + let message_out_total = IntCounterVec::new( + Opts::new( + "message_out_total", "number of messages send by streams on the network", ), - &["channel"], + &["participant", "stream"], )?; - let bytes_send = IntGaugeVec::new( - Opts::new("bytes_send", "bytes send by streams on the network"), - &["channel"], - )?; - let frames_message_count = IntGaugeVec::new( + //TODO IN + let message_out_throughput = IntCounterVec::new( Opts::new( - "frames_message_count", - "bytes sends per message on the network", + "message_out_throughput", + "throughput of messages send by streams on the network", ), - &["channel"], + &["participant", "stream"], )?; let queued_count = IntGaugeVec::new( Opts::new( @@ -199,10 +203,10 @@ impl NetworkMetrics { frames_in_total, frames_wire_out_total, frames_wire_in_total, - frames_count, - message_count, - bytes_send, - frames_message_count, + wire_out_throughput, + wire_in_throughput, + message_out_total, + message_out_throughput, queued_count, queued_bytes, participants_ping, @@ -218,15 +222,15 @@ impl NetworkMetrics { registry.register(Box::new(self.channels_disconnected_total.clone()))?; registry.register(Box::new(self.streams_opened_total.clone()))?; registry.register(Box::new(self.streams_closed_total.clone()))?; + registry.register(Box::new(self.network_info.clone()))?; registry.register(Box::new(self.frames_out_total.clone()))?; registry.register(Box::new(self.frames_in_total.clone()))?; registry.register(Box::new(self.frames_wire_out_total.clone()))?; registry.register(Box::new(self.frames_wire_in_total.clone()))?; - registry.register(Box::new(self.network_info.clone()))?; - registry.register(Box::new(self.frames_count.clone()))?; - registry.register(Box::new(self.message_count.clone()))?; - registry.register(Box::new(self.bytes_send.clone()))?; - registry.register(Box::new(self.frames_message_count.clone()))?; + registry.register(Box::new(self.wire_out_throughput.clone()))?; + registry.register(Box::new(self.wire_in_throughput.clone()))?; + registry.register(Box::new(self.message_out_total.clone()))?; + registry.register(Box::new(self.message_out_throughput.clone()))?; registry.register(Box::new(self.queued_count.clone()))?; registry.register(Box::new(self.queued_bytes.clone()))?; registry.register(Box::new(self.participants_ping.clone()))?; diff --git a/network/src/participant.rs b/network/src/participant.rs index ae9d449dab..adf748cea6 100644 --- a/network/src/participant.rs +++ b/network/src/participant.rs @@ -21,13 +21,14 @@ use std::{ atomic::{AtomicBool, AtomicUsize, Ordering}, Arc, }, + time::{Duration, Instant}, }; use tracing::*; #[derive(Debug)] struct ChannelInfo { cid: Cid, - cid_string: String, //optimisation + cid_string: String, //optimisationmetrics b2w_frame_s: mpsc::UnboundedSender, b2r_read_shutdown: oneshot::Sender<()>, } @@ -109,7 +110,7 @@ impl BParticipant { ) } - pub async fn run(mut self) { + pub async fn run(mut self, b2s_prio_statistic_s: mpsc::UnboundedSender<(Pid, u64, u64)>) { //those managers that listen on api::Participant need an additional oneshot for // shutdown scenario, those handled by scheduler will be closed by it. let (shutdown_send_mgr_sender, shutdown_send_mgr_receiver) = oneshot::channel(); @@ -118,7 +119,8 @@ impl BParticipant { let (shutdown_open_mgr_sender, shutdown_open_mgr_receiver) = oneshot::channel(); let (b2b_prios_flushed_s, b2b_prios_flushed_r) = oneshot::channel(); let (w2b_frames_s, w2b_frames_r) = mpsc::unbounded::<(Cid, Frame)>(); - let (prios, a2p_msg_s, b2p_notify_empty_stream_s) = PrioManager::new(); + let (prios, a2p_msg_s, b2p_notify_empty_stream_s) = + PrioManager::new(self.metrics.clone(), self.remote_pid_string.clone()); let run_channels = self.run_channels.take().unwrap(); futures::join!( @@ -135,7 +137,12 @@ impl BParticipant { a2p_msg_s.clone(), ), self.create_channel_mgr(run_channels.s2b_create_channel_r, w2b_frames_s,), - self.send_mgr(prios, shutdown_send_mgr_receiver, b2b_prios_flushed_s), + self.send_mgr( + prios, + shutdown_send_mgr_receiver, + b2b_prios_flushed_s, + b2s_prio_statistic_s + ), self.stream_close_mgr( run_channels.a2b_close_stream_r, shutdown_stream_close_mgr_receiver, @@ -158,11 +165,12 @@ impl BParticipant { mut prios: PrioManager, mut shutdown_send_mgr_receiver: oneshot::Receiver<()>, b2b_prios_flushed_s: oneshot::Sender<()>, + mut b2s_prio_statistic_s: mpsc::UnboundedSender<(Pid, u64, u64)>, ) { //This time equals the MINIMUM Latency in average, so keep it down and //Todo: // make it configureable or switch to await E.g. Prio 0 = await, prio 50 // wait for more messages - const TICK_TIME: std::time::Duration = std::time::Duration::from_millis(10); + const TICK_TIME: Duration = Duration::from_millis(10); const FRAMES_PER_TICK: usize = 10005; self.running_mgr.fetch_add(1, Ordering::Relaxed); let mut closing_up = false; @@ -180,6 +188,10 @@ impl BParticipant { for (_, frame) in frames { self.send_frame(frame, &mut send_cache).await; } + b2s_prio_statistic_s + .send((self.remote_pid, len as u64, /* */ 0)) + .await + .unwrap(); async_std::task::sleep(TICK_TIME).await; //shutdown after all msg are send! if closing_up && (len == 0) { @@ -199,11 +211,28 @@ impl BParticipant { async fn send_frame(&self, frame: Frame, frames_out_total_cache: &mut PidCidFrameCache) { // find out ideal channel here //TODO: just take first - if let Some(ci) = self.channels.write().await.get_mut(0) { + let mut lock = self.channels.write().await; + if let Some(ci) = lock.get_mut(0) { + //note: this is technically wrong we should only increase when it suceeded, but + // this requiered me to clone `frame` which is a to big performance impact for + // error handling frames_out_total_cache .with_label_values(ci.cid, &frame) .inc(); - ci.b2w_frame_s.send(frame).await.unwrap(); + if let Err(e) = ci.b2w_frame_s.send(frame).await { + warn!( + ?e, + "the channel got closed unexpectedly, cleaning it up now." + ); + let ci = lock.remove(0); + if let Err(e) = ci.b2r_read_shutdown.send(()) { + debug!( + ?e, + "error shutdowning channel, which is prob fine as we detected it to no \ + longer work in the first place" + ); + }; + } } else { error!("participant has no channel to communicate on"); } @@ -219,6 +248,10 @@ impl BParticipant { self.running_mgr.fetch_add(1, Ordering::Relaxed); trace!("start handle_frames_mgr"); let mut messages = HashMap::new(); + let mut dropped_instant = Instant::now(); + let mut dropped_cnt = 0u64; + let mut dropped_sid = Sid::new(0); + while let Some((cid, frame)) = w2b_frames_r.next().await { let cid_string = cid.to_string(); //trace!("handling frame"); @@ -245,19 +278,26 @@ impl BParticipant { // However Stream.send() is not async and their receiver isn't dropped if Steam // is dropped, so i need a way to notify the Stream that it's send messages will // be dropped... from remote, notify local + trace!( + ?sid, + "got remote request to close a stream, without flushing it, local \ + messages are dropped" + ); + // no wait for flush here, as the remote wouldn't care anyway. if let Some(si) = self.streams.write().await.remove(&sid) { self.metrics .streams_closed_total .with_label_values(&[&self.remote_pid_string]) .inc(); si.closed.store(true, Ordering::Relaxed); + trace!(?sid, "closed stream from remote"); } else { - error!( + warn!( + ?sid, "couldn't find stream to close, either this is a duplicate message, \ or the local copy of the Stream got closed simultaniously" ); } - trace!("closed frame from remote"); }, Frame::DataHeader { mid, sid, length } => { let imsg = InCommingMessage { @@ -283,15 +323,44 @@ impl BParticipant { //debug!(?mid, "finished receiving message"); let imsg = messages.remove(&mid).unwrap(); if let Some(si) = self.streams.write().await.get_mut(&imsg.sid) { - si.b2a_msg_recv_s.send(imsg).await.unwrap(); + if let Err(e) = si.b2a_msg_recv_s.send(imsg).await { + warn!( + ?e, + ?mid, + "dropping message, as streams seem to be in act of beeing \ + dropped right now" + ); + } } else { - error!("dropping message as stream no longer seems to exist"); + //aggregate errors + let n = Instant::now(); + if dropped_sid != imsg.sid + || n.duration_since(dropped_instant) > Duration::from_secs(1) + { + warn!( + ?dropped_cnt, + "dropping multiple messages as stream no longer seems to \ + exist because it was dropped probably." + ); + dropped_cnt = 0; + dropped_instant = n; + dropped_sid = imsg.sid; + } else { + dropped_cnt += 1; + } } } }, _ => unreachable!("never reaches frame!"), } } + if dropped_cnt > 0 { + warn!( + ?dropped_cnt, + "dropping multiple messages as stream no longer seems to exist because it was \ + dropped probably." + ); + } trace!("stop handle_frames_mgr"); self.running_mgr.fetch_sub(1, Ordering::Relaxed); } @@ -392,8 +461,8 @@ impl BParticipant { let sender = s2b_shutdown_bparticipant_r.await.unwrap(); debug!("closing all managers"); for sender in to_shutdown.drain(..) { - if sender.send(()).is_err() { - warn!("manager seems to be closed already, weird, maybe a bug"); + if let Err(e) = sender.send(()) { + warn!(?e, "manager seems to be closed already, weird, maybe a bug"); }; } debug!("closing all streams"); @@ -410,7 +479,7 @@ impl BParticipant { }; } //Wait for other bparticipants mgr to close via AtomicUsize - const SLEEP_TIME: std::time::Duration = std::time::Duration::from_millis(5); + const SLEEP_TIME: Duration = Duration::from_millis(5); async_std::task::sleep(SLEEP_TIME).await; let mut i: u32 = 1; while self.running_mgr.load(Ordering::Relaxed) > 1 { @@ -458,14 +527,15 @@ impl BParticipant { // be handled at the remote side. trace!(?sid, "stopping api to use this stream"); - self.streams - .read() - .await - .get(&sid) - .unwrap() - .closed - .store(true, Ordering::Relaxed); + match self.streams.read().await.get(&sid) { + Some(si) => { + si.closed.store(true, Ordering::Relaxed); + }, + None => warn!("couldn't find the stream, might be simulanious close from remote"), + } + //TODO: what happens if RIGHT NOW the remote sends a StreamClose and this + // streams get closed and removed? RACE CONDITION trace!(?sid, "wait for stream to be flushed"); let (s2b_stream_finished_closed_s, s2b_stream_finished_closed_r) = oneshot::channel(); b2p_notify_empty_stream_s diff --git a/network/src/prios.rs b/network/src/prios.rs index 7900f97326..fe33ccd109 100644 --- a/network/src/prios.rs +++ b/network/src/prios.rs @@ -7,12 +7,16 @@ use crate::{ message::OutGoingMessage, + metrics::NetworkMetrics, types::{Frame, Prio, Sid}, }; use futures::channel::oneshot; use std::{ collections::{HashMap, HashSet, VecDeque}, - sync::mpsc::{channel, Receiver, Sender}, + sync::{ + mpsc::{channel, Receiver, Sender}, + Arc, + }, }; use tracing::*; @@ -32,20 +36,10 @@ pub(crate) struct PrioManager { //you can register to be notified if a pid_sid combination is flushed completly here sid_flushed_rx: Receiver<(Sid, oneshot::Sender<()>)>, queued: HashSet, + metrics: Arc, + pid: String, } -/* -ERROR Okay ich kann die frames und msg nicht counten, da api auf msg basis zöhlt und BParticipant auf frame basis. -Der Priomanager hört auf gekillte PID, SIDs, und entweder returned sofort wenn keine msg drinn ist, oder schreibt es in id_sid_owned und haut es dann raus -Evtl sollten wir auch den prioManger auf mehr Async umstellen. auch wenn der TICK selber syncron ist. mal schaun. -*/ - -/* -ERROR, okay wie hauen alles komplett um, PRIOS wird ein teildes BPARTICIPANT -Der BPARTICIPANT bekommt vom Scheduler seine throughput werte, und berichtet zurück -PRIOS wird ASYNC! -*/ - impl PrioManager { const FRAME_DATA_SIZE: u64 = 1400; const PRIOS: [u32; PRIO_MAX] = [ @@ -56,7 +50,10 @@ impl PrioManager { 310419, 356578, 409600, 470507, 540470, 620838, ]; - pub fn new() -> ( + pub fn new( + metrics: Arc, + pid: String, + ) -> ( Self, Sender<(Prio, Sid, OutGoingMessage)>, Sender<(Sid, oneshot::Sender<()>)>, @@ -137,6 +134,8 @@ impl PrioManager { queued: HashSet::new(), //TODO: optimize with u64 and 64 bits sid_flushed_rx, sid_owned: HashMap::new(), + metrics, + pid, }, messages_tx, sid_flushed_tx, @@ -145,11 +144,19 @@ impl PrioManager { async fn tick(&mut self) { // Check Range - let mut times = 0; + let mut messages = 0; let mut closed = 0; for (prio, sid, msg) in self.messages_rx.try_iter() { debug_assert!(prio as usize <= PRIO_MAX); - times += 1; + messages += 1; + self.metrics + .message_out_total + .with_label_values(&[&self.pid, &sid.to_string()]) + .inc(); + self.metrics + .message_out_throughput + .with_label_values(&[&self.pid, &sid.to_string()]) + .inc_by(msg.buffer.data.len() as i64); //trace!(?prio, ?sid, "tick"); self.queued.insert(prio); self.messages[prio as usize].push_back((sid, msg)); @@ -173,8 +180,8 @@ impl PrioManager { return_sender.send(()).unwrap(); } } - if times > 0 || closed > 0 { - trace!(?times, ?closed, "tick"); + if messages > 0 || closed > 0 { + trace!(?messages, ?closed, "tick"); } } @@ -239,10 +246,14 @@ impl PrioManager { no_of_frames: usize, frames: &mut E, ) { + for v in self.messages.iter_mut() { + v.reserve_exact(no_of_frames) + } self.tick().await; for _ in 0..no_of_frames { match self.calc_next_prio() { Some(prio) => { + //let prio2 = self.calc_next_prio().unwrap(); //trace!(?prio, "handle next prio"); self.points[prio as usize] += Self::PRIOS[prio as usize]; //pop message from front of VecDeque, handle it and push it back, so that all @@ -268,8 +279,8 @@ impl PrioManager { .map(|empty_notify| empty_notify.send(()).unwrap()); } } else { + error!(?msg.mid, "repush message"); self.messages[prio as usize].push_back((sid, msg)); - //trace!(?m.mid, "repush message"); } }, None => unreachable!("msg not in VecDeque, but queued"), @@ -301,15 +312,31 @@ impl std::fmt::Debug for PrioManager { mod tests { use crate::{ message::{MessageBuffer, OutGoingMessage}, + metrics::NetworkMetrics, prios::*, - types::{Frame, Prio, Sid}, + types::{Frame, Pid, Prio, Sid}, + }; + use futures::{channel::oneshot, executor::block_on}; + use std::{ + collections::VecDeque, + sync::{mpsc::Sender, Arc}, }; - use futures::executor::block_on; - use std::{collections::VecDeque, sync::Arc}; const SIZE: u64 = PrioManager::FRAME_DATA_SIZE; const USIZE: usize = PrioManager::FRAME_DATA_SIZE as usize; + fn mock_new() -> ( + PrioManager, + Sender<(Prio, Sid, OutGoingMessage)>, + Sender<(Sid, oneshot::Sender<()>)>, + ) { + let pid = Pid::fake(1); + PrioManager::new( + Arc::new(NetworkMetrics::new(&pid).unwrap()), + pid.to_string(), + ) + } + fn mock_out(prio: Prio, sid: u64) -> (Prio, Sid, OutGoingMessage) { let sid = Sid::new(sid); (prio, sid, OutGoingMessage { @@ -365,7 +392,7 @@ mod tests { #[test] fn single_p16() { - let (mut mgr, msg_tx, _flush_tx) = PrioManager::new(); + let (mut mgr, msg_tx, _flush_tx) = mock_new(); msg_tx.send(mock_out(16, 1337)).unwrap(); let mut frames = VecDeque::new(); block_on(mgr.fill_frames(100, &mut frames)); @@ -377,7 +404,7 @@ mod tests { #[test] fn single_p16_p20() { - let (mut mgr, msg_tx, _flush_tx) = PrioManager::new(); + let (mut mgr, msg_tx, _flush_tx) = mock_new(); msg_tx.send(mock_out(16, 1337)).unwrap(); msg_tx.send(mock_out(20, 42)).unwrap(); let mut frames = VecDeque::new(); @@ -392,7 +419,7 @@ mod tests { #[test] fn single_p20_p16() { - let (mut mgr, msg_tx, _flush_tx) = PrioManager::new(); + let (mut mgr, msg_tx, _flush_tx) = mock_new(); msg_tx.send(mock_out(20, 42)).unwrap(); msg_tx.send(mock_out(16, 1337)).unwrap(); let mut frames = VecDeque::new(); @@ -407,7 +434,7 @@ mod tests { #[test] fn multiple_p16_p20() { - let (mut mgr, msg_tx, _flush_tx) = PrioManager::new(); + let (mut mgr, msg_tx, _flush_tx) = mock_new(); msg_tx.send(mock_out(20, 2)).unwrap(); msg_tx.send(mock_out(16, 1)).unwrap(); msg_tx.send(mock_out(16, 3)).unwrap(); @@ -433,7 +460,7 @@ mod tests { #[test] fn multiple_fill_frames_p16_p20() { - let (mut mgr, msg_tx, _flush_tx) = PrioManager::new(); + let (mut mgr, msg_tx, _flush_tx) = mock_new(); msg_tx.send(mock_out(20, 2)).unwrap(); msg_tx.send(mock_out(16, 1)).unwrap(); msg_tx.send(mock_out(16, 3)).unwrap(); @@ -465,7 +492,7 @@ mod tests { #[test] fn single_large_p16() { - let (mut mgr, msg_tx, _flush_tx) = PrioManager::new(); + let (mut mgr, msg_tx, _flush_tx) = mock_new(); msg_tx.send(mock_out_large(16, 1)).unwrap(); let mut frames = VecDeque::new(); block_on(mgr.fill_frames(100, &mut frames)); @@ -479,7 +506,7 @@ mod tests { #[test] fn multiple_large_p16() { - let (mut mgr, msg_tx, _flush_tx) = PrioManager::new(); + let (mut mgr, msg_tx, _flush_tx) = mock_new(); msg_tx.send(mock_out_large(16, 1)).unwrap(); msg_tx.send(mock_out_large(16, 2)).unwrap(); let mut frames = VecDeque::new(); @@ -498,7 +525,7 @@ mod tests { #[test] fn multiple_large_p16_sudden_p0() { - let (mut mgr, msg_tx, _flush_tx) = PrioManager::new(); + let (mut mgr, msg_tx, _flush_tx) = mock_new(); msg_tx.send(mock_out_large(16, 1)).unwrap(); msg_tx.send(mock_out_large(16, 2)).unwrap(); let mut frames = VecDeque::new(); @@ -524,7 +551,7 @@ mod tests { #[test] fn single_p20_thousand_p16_at_once() { - let (mut mgr, msg_tx, _flush_tx) = PrioManager::new(); + let (mut mgr, msg_tx, _flush_tx) = mock_new(); for _ in 0..998 { msg_tx.send(mock_out(16, 2)).unwrap(); } @@ -546,7 +573,7 @@ mod tests { #[test] fn single_p20_thousand_p16_later() { - let (mut mgr, msg_tx, _flush_tx) = PrioManager::new(); + let (mut mgr, msg_tx, _flush_tx) = mock_new(); for _ in 0..998 { msg_tx.send(mock_out(16, 2)).unwrap(); } diff --git a/network/src/protocols.rs b/network/src/protocols.rs index 3a96cd380c..b5a8f268f3 100644 --- a/network/src/protocols.rs +++ b/network/src/protocols.rs @@ -58,6 +58,26 @@ impl TcpProtocol { Self { stream, metrics } } + /// read_except and if it fails, close the protocol + async fn read_except_or_close( + cid: Cid, + mut stream: &TcpStream, + mut bytes: &mut [u8], + from_wire_sender: &mut mpsc::UnboundedSender<(Cid, Frame)>, + ) { + match stream.read_exact(&mut bytes).await { + Err(e) => { + warn!( + ?e, + "closing tcp protocol due to read error, sending close frame to gracefully \ + shutdown" + ); + from_wire_sender.send((cid, Frame::Shutdown)).await.unwrap(); + }, + _ => (), + } + } + pub async fn read( &self, cid: Cid, @@ -66,8 +86,13 @@ impl TcpProtocol { ) { trace!("starting up tcp read()"); let mut metrics_cache = CidFrameCache::new(self.metrics.frames_wire_in_total.clone(), cid); + let throughput_cache = self + .metrics + .wire_in_throughput + .with_label_values(&[&cid.to_string()]); let mut stream = self.stream.clone(); let mut end_receiver = end_receiver.fuse(); + loop { let mut bytes = [0u8; 1]; let r = select! { @@ -82,7 +107,8 @@ impl TcpProtocol { let frame = match frame_no { FRAME_HANDSHAKE => { let mut bytes = [0u8; 19]; - stream.read_exact(&mut bytes).await.unwrap(); + Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender) + .await; let magic_number = [ bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], ]; @@ -97,7 +123,8 @@ impl TcpProtocol { }, FRAME_INIT => { let mut bytes = [0u8; 16]; - stream.read_exact(&mut bytes).await.unwrap(); + Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender) + .await; let pid = Pid::from_le_bytes(bytes); stream.read_exact(&mut bytes).await.unwrap(); let secret = u128::from_le_bytes(bytes); @@ -106,7 +133,8 @@ impl TcpProtocol { FRAME_SHUTDOWN => Frame::Shutdown, FRAME_OPEN_STREAM => { let mut bytes = [0u8; 10]; - stream.read_exact(&mut bytes).await.unwrap(); + Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender) + .await; let sid = Sid::from_le_bytes([ bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7], @@ -121,7 +149,8 @@ impl TcpProtocol { }, FRAME_CLOSE_STREAM => { let mut bytes = [0u8; 8]; - stream.read_exact(&mut bytes).await.unwrap(); + Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender) + .await; let sid = Sid::from_le_bytes([ bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7], @@ -130,7 +159,8 @@ impl TcpProtocol { }, FRAME_DATA_HEADER => { let mut bytes = [0u8; 24]; - stream.read_exact(&mut bytes).await.unwrap(); + Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender) + .await; let mid = Mid::from_le_bytes([ bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7], @@ -147,7 +177,8 @@ impl TcpProtocol { }, FRAME_DATA => { let mut bytes = [0u8; 18]; - stream.read_exact(&mut bytes).await.unwrap(); + Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender) + .await; let mid = Mid::from_le_bytes([ bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7], @@ -158,22 +189,27 @@ impl TcpProtocol { ]); let length = u16::from_le_bytes([bytes[16], bytes[17]]); let mut data = vec![0; length as usize]; - stream.read_exact(&mut data).await.unwrap(); + throughput_cache.inc_by(length as i64); + Self::read_except_or_close(cid, &mut stream, &mut data, &mut from_wire_sender) + .await; Frame::Data { mid, start, data } }, FRAME_RAW => { let mut bytes = [0u8; 2]; - stream.read_exact(&mut bytes).await.unwrap(); + Self::read_except_or_close(cid, &mut stream, &mut bytes, &mut from_wire_sender) + .await; let length = u16::from_le_bytes([bytes[0], bytes[1]]); let mut data = vec![0; length as usize]; - stream.read_exact(&mut data).await.unwrap(); + Self::read_except_or_close(cid, &mut stream, &mut data, &mut from_wire_sender) + .await; Frame::Raw(data) }, _ => { // report a RAW frame, but cannot rely on the next 2 bytes to be a size. // guessing 256 bytes, which might help to sort down issues let mut data = vec![0; 256]; - stream.read(&mut data).await.unwrap(); + Self::read_except_or_close(cid, &mut stream, &mut data, &mut from_wire_sender) + .await; Frame::Raw(data) }, }; @@ -183,6 +219,25 @@ impl TcpProtocol { trace!("shutting down tcp read()"); } + /// read_except and if it fails, close the protocol + async fn write_or_close( + stream: &mut TcpStream, + bytes: &[u8], + to_wire_receiver: &mut mpsc::UnboundedReceiver, + ) -> bool { + match stream.write_all(&bytes).await { + Err(e) => { + warn!( + ?e, + "got an error writing to tcp, going to close this channel" + ); + to_wire_receiver.close(); + true + }, + _ => false, + } + } + //dezerialize here as this is executed in a seperate thread PER channel. // Limites Throughput per single Receiver but stays in same thread (maybe as its // in a threadpool) for TCP, UDP and MPSC @@ -190,80 +245,188 @@ impl TcpProtocol { trace!("starting up tcp write()"); let mut stream = self.stream.clone(); let mut metrics_cache = CidFrameCache::new(self.metrics.frames_wire_out_total.clone(), cid); + let throughput_cache = self + .metrics + .wire_out_throughput + .with_label_values(&[&cid.to_string()]); while let Some(frame) = to_wire_receiver.next().await { metrics_cache.with_label_values(&frame).inc(); - match frame { + if match frame { Frame::Handshake { magic_number, version, } => { - stream - .write_all(&FRAME_HANDSHAKE.to_be_bytes()) + Self::write_or_close( + &mut stream, + &FRAME_HANDSHAKE.to_be_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close(&mut stream, &magic_number, &mut to_wire_receiver) + .await + || Self::write_or_close( + &mut stream, + &version[0].to_le_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &version[1].to_le_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &version[2].to_le_bytes(), + &mut to_wire_receiver, + ) .await - .unwrap(); - stream.write_all(&magic_number).await.unwrap(); - stream.write_all(&version[0].to_le_bytes()).await.unwrap(); - stream.write_all(&version[1].to_le_bytes()).await.unwrap(); - stream.write_all(&version[2].to_le_bytes()).await.unwrap(); }, Frame::Init { pid, secret } => { - stream.write_all(&FRAME_INIT.to_be_bytes()).await.unwrap(); - stream.write_all(&pid.to_le_bytes()).await.unwrap(); - stream.write_all(&secret.to_le_bytes()).await.unwrap(); + Self::write_or_close( + &mut stream, + &FRAME_INIT.to_be_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &pid.to_le_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &secret.to_le_bytes(), + &mut to_wire_receiver, + ) + .await }, Frame::Shutdown => { - stream - .write_all(&FRAME_SHUTDOWN.to_be_bytes()) - .await - .unwrap(); + Self::write_or_close( + &mut stream, + &FRAME_SHUTDOWN.to_be_bytes(), + &mut to_wire_receiver, + ) + .await }, Frame::OpenStream { sid, prio, promises, } => { - stream - .write_all(&FRAME_OPEN_STREAM.to_be_bytes()) + Self::write_or_close( + &mut stream, + &FRAME_OPEN_STREAM.to_be_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &sid.to_le_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &prio.to_le_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &promises.to_le_bytes(), + &mut to_wire_receiver, + ) .await - .unwrap(); - stream.write_all(&sid.to_le_bytes()).await.unwrap(); - stream.write_all(&prio.to_le_bytes()).await.unwrap(); - stream.write_all(&promises.to_le_bytes()).await.unwrap(); }, Frame::CloseStream { sid } => { - stream - .write_all(&FRAME_CLOSE_STREAM.to_be_bytes()) + Self::write_or_close( + &mut stream, + &FRAME_CLOSE_STREAM.to_be_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &sid.to_le_bytes(), + &mut to_wire_receiver, + ) .await - .unwrap(); - stream.write_all(&sid.to_le_bytes()).await.unwrap(); }, Frame::DataHeader { mid, sid, length } => { - stream - .write_all(&FRAME_DATA_HEADER.to_be_bytes()) + Self::write_or_close( + &mut stream, + &FRAME_DATA_HEADER.to_be_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &mid.to_le_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &sid.to_le_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &length.to_le_bytes(), + &mut to_wire_receiver, + ) .await - .unwrap(); - stream.write_all(&mid.to_le_bytes()).await.unwrap(); - stream.write_all(&sid.to_le_bytes()).await.unwrap(); - stream.write_all(&length.to_le_bytes()).await.unwrap(); }, Frame::Data { mid, start, data } => { - stream.write_all(&FRAME_DATA.to_be_bytes()).await.unwrap(); - stream.write_all(&mid.to_le_bytes()).await.unwrap(); - stream.write_all(&start.to_le_bytes()).await.unwrap(); - stream - .write_all(&(data.len() as u16).to_le_bytes()) + throughput_cache.inc_by(data.len() as i64); + Self::write_or_close( + &mut stream, + &FRAME_DATA.to_be_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &mid.to_le_bytes(), + &mut to_wire_receiver, + ) .await - .unwrap(); - stream.write_all(&data).await.unwrap(); + || Self::write_or_close( + &mut stream, + &start.to_le_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &(data.len() as u16).to_le_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close(&mut stream, &data, &mut to_wire_receiver).await }, Frame::Raw(data) => { - stream.write_all(&FRAME_RAW.to_be_bytes()).await.unwrap(); - stream - .write_all(&(data.len() as u16).to_le_bytes()) + Self::write_or_close( + &mut stream, + &FRAME_RAW.to_be_bytes(), + &mut to_wire_receiver, + ) + .await + || Self::write_or_close( + &mut stream, + &(data.len() as u16).to_le_bytes(), + &mut to_wire_receiver, + ) .await - .unwrap(); - stream.write_all(&data).await.unwrap(); + || Self::write_or_close(&mut stream, &data, &mut to_wire_receiver).await }, + } { + //failure + return; } } trace!("shutting down tcp write()"); @@ -293,6 +456,10 @@ impl UdpProtocol { ) { trace!("starting up udp read()"); let mut metrics_cache = CidFrameCache::new(self.metrics.frames_wire_in_total.clone(), cid); + let throughput_cache = self + .metrics + .wire_in_throughput + .with_label_values(&[&cid.to_string()]); let mut data_in = self.data_in.write().await; let mut end_receiver = end_receiver.fuse(); while let Some(bytes) = select! { @@ -379,6 +546,7 @@ impl UdpProtocol { ]); let length = u16::from_le_bytes([bytes[17], bytes[18]]); let mut data = vec![0; length as usize]; + throughput_cache.inc_by(length as i64); data.copy_from_slice(&bytes[19..]); Frame::Data { mid, start, data } }, @@ -400,6 +568,10 @@ impl UdpProtocol { trace!("starting up udp write()"); let mut buffer = [0u8; 2000]; let mut metrics_cache = CidFrameCache::new(self.metrics.frames_wire_out_total.clone(), cid); + let throughput_cache = self + .metrics + .wire_out_throughput + .with_label_values(&[&cid.to_string()]); while let Some(frame) = to_wire_receiver.next().await { metrics_cache.with_label_values(&frame).inc(); let len = match frame { @@ -572,6 +744,7 @@ impl UdpProtocol { for i in 0..data.len() { buffer[19 + i] = data[i]; } + throughput_cache.inc_by(data.len() as i64); 19 + data.len() }, Frame::Raw(data) => { diff --git a/network/src/scheduler.rs b/network/src/scheduler.rs index 23f3bcd421..215e55f1bc 100644 --- a/network/src/scheduler.rs +++ b/network/src/scheduler.rs @@ -4,7 +4,7 @@ use crate::{ metrics::NetworkMetrics, participant::BParticipant, protocols::{Protocols, TcpProtocol, UdpProtocol}, - types::{Cid, Pid, Prio, Sid}, + types::{Cid, Pid, Sid}, }; use async_std::{ io, net, @@ -51,12 +51,14 @@ struct ControlChannels { a2s_connect_r: mpsc::UnboundedReceiver<(Address, oneshot::Sender>)>, a2s_scheduler_shutdown_r: oneshot::Receiver<()>, a2s_disconnect_r: mpsc::UnboundedReceiver<(Pid, oneshot::Sender>)>, + b2s_prio_statistic_r: mpsc::UnboundedReceiver<(Pid, u64, u64)>, } #[derive(Debug, Clone)] struct ParticipantChannels { s2a_connected_s: mpsc::UnboundedSender, a2s_disconnect_s: mpsc::UnboundedSender<(Pid, oneshot::Sender>)>, + b2s_prio_statistic_s: mpsc::UnboundedSender<(Pid, u64, u64)>, } #[derive(Debug)] @@ -92,17 +94,20 @@ impl Scheduler { let (a2s_scheduler_shutdown_s, a2s_scheduler_shutdown_r) = oneshot::channel::<()>(); let (a2s_disconnect_s, a2s_disconnect_r) = mpsc::unbounded::<(Pid, oneshot::Sender>)>(); + let (b2s_prio_statistic_s, b2s_prio_statistic_r) = mpsc::unbounded::<(Pid, u64, u64)>(); let run_channels = Some(ControlChannels { a2s_listen_r, a2s_connect_r, a2s_scheduler_shutdown_r, a2s_disconnect_r, + b2s_prio_statistic_r, }); let participant_channels = ParticipantChannels { s2a_connected_s, a2s_disconnect_s, + b2s_prio_statistic_s, }; let metrics = Arc::new(NetworkMetrics::new(&local_pid).unwrap()); @@ -140,7 +145,7 @@ impl Scheduler { self.listen_mgr(run_channels.a2s_listen_r), self.connect_mgr(run_channels.a2s_connect_r), self.disconnect_mgr(run_channels.a2s_disconnect_r), - self.prio_adj_mgr(), + self.prio_adj_mgr(run_channels.b2s_prio_statistic_r), self.scheduler_shutdown_mgr(run_channels.a2s_scheduler_shutdown_r), ); } @@ -151,7 +156,7 @@ impl Scheduler { ) { trace!("start listen_mgr"); a2s_listen_r - .for_each_concurrent(None, |(address, s2a_result_s)| { + .for_each_concurrent(None, |(address, s2a_listen_result_s)| { let address = address.clone(); async move { @@ -169,7 +174,7 @@ impl Scheduler { .write() .await .insert(address.clone(), end_sender); - self.channel_creator(address, end_receiver, s2a_result_s) + self.channel_creator(address, end_receiver, s2a_listen_result_s) .await; } }) @@ -275,9 +280,15 @@ impl Scheduler { trace!("stop disconnect_mgr"); } - async fn prio_adj_mgr(&self) { + async fn prio_adj_mgr( + &self, + mut b2s_prio_statistic_r: mpsc::UnboundedReceiver<(Pid, u64, u64)>, + ) { trace!("start prio_adj_mgr"); - //TODO adjust prios in participants here! + while let Some((_pid, _frame_cnt, _unused)) = b2s_prio_statistic_r.next().await { + + //TODO adjust prios in participants here! + } trace!("stop prio_adj_mgr"); } @@ -300,14 +311,13 @@ impl Scheduler { } debug!("wait for partiticipants to be shut down"); for (pid, recv) in waitings { - match recv.await { - Err(e) => error!( + if let Err(e) = recv.await { + error!( ?pid, ?e, "failed to finish sending all remainding messages to participant when \ shutting down" - ), - _ => (), + ); }; } //removing the possibility to create new participants, needed to close down @@ -499,7 +509,7 @@ impl Scheduler { }); pool.spawn_ok( bparticipant - .run() + .run(participant_channels.b2s_prio_statistic_s) .instrument(tracing::info_span!("participant", ?pid)), ); //create a new channel within BParticipant and wait for it to run diff --git a/network/src/types.rs b/network/src/types.rs index 88a64ce509..2d7855b7bc 100644 --- a/network/src/types.rs +++ b/network/src/types.rs @@ -240,6 +240,13 @@ impl From for Sid { fn from(internal: u64) -> Self { Sid { internal } } } +impl std::fmt::Display for Sid { + #[inline] + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.internal) + } +} + #[inline] fn sixlet_to_str(sixlet: u128) -> char { match sixlet { diff --git a/network/tests/closing.rs b/network/tests/closing.rs new file mode 100644 index 0000000000..32125c94a7 --- /dev/null +++ b/network/tests/closing.rs @@ -0,0 +1,136 @@ +use async_std::task; +use task::block_on; +use veloren_network::StreamError; +mod helper; +use helper::{network_participant_stream, tcp}; + +#[test] +fn close_network() { + let (_, _) = helper::setup(false, 0); + let (_, _p1_a, mut s1_a, _, _p1_b, mut s1_b) = block_on(network_participant_stream(tcp())); + + std::thread::sleep(std::time::Duration::from_millis(200)); + + assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed)); + let msg1: Result = block_on(s1_b.recv()); + assert_eq!(msg1, Err(StreamError::StreamClosed)); +} + +#[test] +fn close_participant() { + let (_, _) = helper::setup(false, 0); + let (n_a, p1_a, mut s1_a, n_b, p1_b, mut s1_b) = block_on(network_participant_stream(tcp())); + + block_on(n_a.disconnect(p1_a)).unwrap(); + block_on(n_b.disconnect(p1_b)).unwrap(); + + assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed)); + assert_eq!( + block_on(s1_b.recv::()), + Err(StreamError::StreamClosed) + ); +} + +#[test] +fn close_stream() { + let (_, _) = helper::setup(false, 0); + let (_n_a, _, mut s1_a, _n_b, _, _) = block_on(network_participant_stream(tcp())); + + // s1_b is dropped directly while s1_a isn't + std::thread::sleep(std::time::Duration::from_millis(200)); + + assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed)); + assert_eq!( + block_on(s1_a.recv::()), + Err(StreamError::StreamClosed) + ); +} + +#[test] +fn stream_simple_3msg_then_close() { + let (_, _) = helper::setup(false, 0); + let (_n_a, _, mut s1_a, _n_b, _, mut s1_b) = block_on(network_participant_stream(tcp())); + + s1_a.send(1u8).unwrap(); + s1_a.send(42).unwrap(); + s1_a.send("3rdMessage").unwrap(); + assert_eq!(block_on(s1_b.recv()), Ok(1u8)); + assert_eq!(block_on(s1_b.recv()), Ok(42)); + assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string())); + drop(s1_a); + std::thread::sleep(std::time::Duration::from_millis(200)); + assert_eq!(s1_b.send("Hello World"), Err(StreamError::StreamClosed)); +} + +#[test] +fn stream_send_first_then_receive() { + // recv should still be possible even if stream got closed if they are in queue + let (_, _) = helper::setup(false, 0); + let (_n_a, _, mut s1_a, _n_b, _, mut s1_b) = block_on(network_participant_stream(tcp())); + + s1_a.send(1u8).unwrap(); + s1_a.send(42).unwrap(); + s1_a.send("3rdMessage").unwrap(); + drop(s1_a); + std::thread::sleep(std::time::Duration::from_millis(500)); + assert_eq!(block_on(s1_b.recv()), Ok(1u8)); + assert_eq!(block_on(s1_b.recv()), Ok(42)); + assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string())); + assert_eq!(s1_b.send("Hello World"), Err(StreamError::StreamClosed)); +} + +#[test] +fn stream_send_100000_then_close_stream() { + let (_, _) = helper::setup(false, 0); + let (_n_a, _, mut s1_a, _n_b, _, mut s1_b) = block_on(network_participant_stream(tcp())); + for _ in 0..100000 { + s1_a.send("woop_PARTY_HARD_woop").unwrap(); + } + drop(s1_a); + let exp = Ok("woop_PARTY_HARD_woop".to_string()); + println!("start receiving"); + block_on(async { + for _ in 0..100000 { + assert_eq!(s1_b.recv().await, exp); + } + }); + println!("all received and done"); +} + +#[test] +fn stream_send_100000_then_close_stream_remote() { + let (_, _) = helper::setup(false, 0); + let (_n_a, _, mut s1_a, _n_b, _, _s1_b) = block_on(network_participant_stream(tcp())); + for _ in 0..100000 { + s1_a.send("woop_PARTY_HARD_woop").unwrap(); + } + drop(s1_a); + drop(_s1_b); + //no receiving +} + +#[test] +fn stream_send_100000_then_close_stream_remote2() { + let (_, _) = helper::setup(false, 0); + let (_n_a, _, mut s1_a, _n_b, _, _s1_b) = block_on(network_participant_stream(tcp())); + for _ in 0..100000 { + s1_a.send("woop_PARTY_HARD_woop").unwrap(); + } + drop(_s1_b); + std::thread::sleep(std::time::Duration::from_millis(200)); + drop(s1_a); + //no receiving +} + +#[test] +fn stream_send_100000_then_close_stream_remote3() { + let (_, _) = helper::setup(false, 0); + let (_n_a, _, mut s1_a, _n_b, _, _s1_b) = block_on(network_participant_stream(tcp())); + for _ in 0..100000 { + s1_a.send("woop_PARTY_HARD_woop").unwrap(); + } + drop(_s1_b); + std::thread::sleep(std::time::Duration::from_millis(200)); + drop(s1_a); + //no receiving +} diff --git a/network/tests/helper.rs b/network/tests/helper.rs index f576324660..3970601aba 100644 --- a/network/tests/helper.rs +++ b/network/tests/helper.rs @@ -13,6 +13,7 @@ use tracing_subscriber::EnvFilter; use uvth::ThreadPoolBuilder; use veloren_network::{Address, Network, Participant, Pid, Stream, PROMISES_NONE}; +#[allow(dead_code)] pub fn setup(tracing: bool, mut sleep: u64) -> (u64, u64) { if tracing { sleep += 1000 @@ -48,6 +49,7 @@ pub fn setup(tracing: bool, mut sleep: u64) -> (u64, u64) { (0, 0) } +#[allow(dead_code)] pub async fn network_participant_stream( addr: Address, ) -> ( @@ -72,6 +74,7 @@ pub async fn network_participant_stream( (n_a, p1_a, s1_a, n_b, p1_b, s1_b) } +#[allow(dead_code)] pub fn tcp() -> veloren_network::Address { lazy_static! { static ref PORTS: AtomicU16 = AtomicU16::new(5000); @@ -80,6 +83,7 @@ pub fn tcp() -> veloren_network::Address { veloren_network::Address::Tcp(SocketAddr::from(([127, 0, 0, 1], port))) } +#[allow(dead_code)] pub fn udp() -> veloren_network::Address { lazy_static! { static ref PORTS: AtomicU16 = AtomicU16::new(5000); diff --git a/network/tests/integration.rs b/network/tests/integration.rs index 0f0d489560..92ef6aaa8c 100644 --- a/network/tests/integration.rs +++ b/network/tests/integration.rs @@ -1,9 +1,11 @@ use async_std::task; use task::block_on; -use veloren_network::{NetworkError, StreamError}; +use veloren_network::NetworkError; mod helper; use helper::{network_participant_stream, tcp, udp}; use std::io::ErrorKind; +use uvth::ThreadPoolBuilder; +use veloren_network::{Address, Network, Pid, PROMISES_CONSISTENCY, PROMISES_ORDERED}; #[test] #[ignore] @@ -13,49 +15,6 @@ fn network_20s() { std::thread::sleep(std::time::Duration::from_secs(30)); } -#[test] -fn close_network() { - let (_, _) = helper::setup(false, 0); - let (_, _p1_a, mut s1_a, _, _p1_b, mut s1_b) = block_on(network_participant_stream(tcp())); - - std::thread::sleep(std::time::Duration::from_millis(30)); - - assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed)); - let msg1: Result = block_on(s1_b.recv()); - assert_eq!(msg1, Err(StreamError::StreamClosed)); -} - -#[test] -fn close_participant() { - let (_, _) = helper::setup(false, 0); - let (n_a, p1_a, mut s1_a, n_b, p1_b, mut s1_b) = block_on(network_participant_stream(tcp())); - - block_on(n_a.disconnect(p1_a)).unwrap(); - block_on(n_b.disconnect(p1_b)).unwrap(); - - std::thread::sleep(std::time::Duration::from_millis(30)); - assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed)); - assert_eq!( - block_on(s1_b.recv::()), - Err(StreamError::StreamClosed) - ); -} - -#[test] -fn close_stream() { - let (_, _) = helper::setup(false, 0); - let (_n_a, _, mut s1_a, _n_b, _, _) = block_on(network_participant_stream(tcp())); - - // s1_b is dropped directly while s1_a isn't - std::thread::sleep(std::time::Duration::from_millis(30)); - - assert_eq!(s1_a.send("Hello World"), Err(StreamError::StreamClosed)); - assert_eq!( - block_on(s1_a.recv::()), - Err(StreamError::StreamClosed) - ); -} - #[test] fn stream_simple() { let (_, _) = helper::setup(false, 0); @@ -78,39 +37,6 @@ fn stream_simple_3msg() { assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string())); } -#[test] -fn stream_simple_3msg_then_close() { - let (_, _) = helper::setup(false, 0); - let (_n_a, _, mut s1_a, _n_b, _, mut s1_b) = block_on(network_participant_stream(tcp())); - - s1_a.send(1u8).unwrap(); - s1_a.send(42).unwrap(); - s1_a.send("3rdMessage").unwrap(); - assert_eq!(block_on(s1_b.recv()), Ok(1u8)); - assert_eq!(block_on(s1_b.recv()), Ok(42)); - assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string())); - drop(s1_a); - std::thread::sleep(std::time::Duration::from_millis(30)); - assert_eq!(s1_b.send("Hello World"), Err(StreamError::StreamClosed)); -} - -#[test] -fn stream_send_first_then_receive() { - // recv should still be possible even if stream got closed if they are in queue - let (_, _) = helper::setup(false, 0); - let (_n_a, _, mut s1_a, _n_b, _, mut s1_b) = block_on(network_participant_stream(tcp())); - - s1_a.send(1u8).unwrap(); - s1_a.send(42).unwrap(); - s1_a.send("3rdMessage").unwrap(); - drop(s1_a); - std::thread::sleep(std::time::Duration::from_millis(500)); - assert_eq!(block_on(s1_b.recv()), Ok(1u8)); - assert_eq!(block_on(s1_b.recv()), Ok(42)); - assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string())); - assert_eq!(s1_b.send("Hello World"), Err(StreamError::StreamClosed)); -} - #[test] fn stream_simple_udp() { let (_, _) = helper::setup(false, 0); @@ -133,8 +59,6 @@ fn stream_simple_udp_3msg() { assert_eq!(block_on(s1_b.recv()), Ok("3rdMessage".to_string())); } -use uvth::ThreadPoolBuilder; -use veloren_network::{Address, Network, Pid}; #[test] #[ignore] fn tcp_and_udp_2_connections() -> std::result::Result<(), Box> { @@ -167,7 +91,7 @@ fn failed_listen_on_used_ports() -> std::result::Result<(), Box std::result::Result<(), Box std::result::Result<(), Box> { + let (_, _) = helper::setup(false, 0); + // Create a Network, listen on Port `2200` and wait for a Stream to be opened, + // then answer `Hello World` + let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); + let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); + block_on(async { + network + .listen(Address::Tcp("127.0.0.1:2200".parse().unwrap())) + .await?; + let remote_p = remote + .connect(Address::Tcp("127.0.0.1:2200".parse().unwrap())) + .await?; + remote_p + .open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY) + .await?; + let participant_a = network.connected().await?; + let mut stream_a = participant_a.opened().await?; + //Send Message + stream_a.send("Hello World")?; + Ok(()) + }) +} + +#[test] +fn api_stream_recv_main() -> std::result::Result<(), Box> { + let (_, _) = helper::setup(false, 0); + // Create a Network, listen on Port `2220` and wait for a Stream to be opened, + // then listen on it + let network = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); + let remote = Network::new(Pid::new(), &ThreadPoolBuilder::new().build(), None); + block_on(async { + network + .listen(Address::Tcp("127.0.0.1:2220".parse().unwrap())) + .await?; + let remote_p = remote + .connect(Address::Tcp("127.0.0.1:2220".parse().unwrap())) + .await?; + let mut stream_p = remote_p + .open(16, PROMISES_ORDERED | PROMISES_CONSISTENCY) + .await?; + stream_p.send("Hello World")?; + let participant_a = network.connected().await?; + let mut stream_a = participant_a.opened().await?; + //Send Message + println!("{}", stream_a.recv::().await?); + Ok(()) + }) +}