Bump rand to 0.8, rand_chacha to 0.3, getrandom to 0.2 (#32871)
* sdk: Add concurrent support for rand 0.7 and 0.8 * Update rand, rand_chacha, and getrandom versions * Run command to replace `gen_range` Run `git grep -l gen_range | xargs sed -i'' -e 's/gen_range(\(\S*\), /gen_range(\1../' * sdk: Fix users of older `gen_range` * Replace `hash::new_rand` with `hash::new_with_thread_rng` Run: ``` git grep -l hash::new_rand | xargs sed -i'' -e 's/hash::new_rand([^)]*/hash::new_with_thread_rng(/' ``` * perf: Use `Keypair::new()` instead of `generate` * Use older rand version in zk-token-sdk * program-runtime: Inline random key generation * bloom: Fix clippy warnings in tests * streamer: Scope rng usage correctly * perf: Fix clippy warning * accounts-db: Map to char to generate a random string * Remove `from_secret_key_bytes`, it's just `keypair_from_seed` * ledger: Generate keypairs by hand * ed25519-tests: Use new rand * runtime: Use new rand in all tests * gossip: Clean up clippy and inline keypair generators * core: Inline keypair generation for tests * Push sbf lockfile change * sdk: Sort dependencies correctly * Remove `hash::new_with_thread_rng`, use `Hash::new_unique()` * Use Keypair::new where chacha isn't used * sdk: Fix build by marking rand 0.7 optional * Hardcode secret key length, add static assertion * Unify `getrandom` crate usage to fix linking errors * bloom: Fix tests that require a random hash * Remove some dependencies, try to unify others * Remove unnecessary uses of rand and rand_core * Update lockfiles * Add back some dependencies to reduce rebuilds * Increase max rebuilds from 14 to 15 * frozen-abi: Remove `getrandom` * Bump rebuilds to 17 * Remove getrandom from zk-token-proof
This commit is contained in:
parent
524274d8b5
commit
0fe902ced7
|
@ -69,7 +69,7 @@ version = "0.7.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
|
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
@ -81,7 +81,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
|
checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
@ -518,7 +518,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1"
|
checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
"instant",
|
"instant",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
|
@ -2193,9 +2193,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "getrandom"
|
name = "getrandom"
|
||||||
version = "0.2.8"
|
version = "0.2.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
|
checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
|
@ -4262,7 +4262,7 @@ version = "0.6.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -4369,7 +4369,7 @@ version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
|
checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
"redox_syscall 0.2.10",
|
"redox_syscall 0.2.10",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -5175,7 +5175,7 @@ version = "1.17.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap 2.33.3",
|
"clap 2.33.3",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"solana-account-decoder",
|
"solana-account-decoder",
|
||||||
"solana-accounts-db",
|
"solana-accounts-db",
|
||||||
|
@ -5237,8 +5237,8 @@ dependencies = [
|
||||||
"ouroboros",
|
"ouroboros",
|
||||||
"percentage",
|
"percentage",
|
||||||
"qualifier_attr",
|
"qualifier_attr",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"regex",
|
"regex",
|
||||||
"rustc_version 0.4.0",
|
"rustc_version 0.4.0",
|
||||||
|
@ -5315,7 +5315,7 @@ dependencies = [
|
||||||
"clap 3.2.23",
|
"clap 3.2.23",
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"solana-client",
|
"solana-client",
|
||||||
"solana-core",
|
"solana-core",
|
||||||
|
@ -5394,7 +5394,7 @@ dependencies = [
|
||||||
"clap 2.33.3",
|
"clap 2.33.3",
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_yaml 0.9.25",
|
"serde_yaml 0.9.25",
|
||||||
|
@ -5435,7 +5435,7 @@ dependencies = [
|
||||||
"bv",
|
"bv",
|
||||||
"fnv",
|
"fnv",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"rustc_version 0.4.0",
|
"rustc_version 0.4.0",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -5454,7 +5454,7 @@ dependencies = [
|
||||||
"libsecp256k1",
|
"libsecp256k1",
|
||||||
"log",
|
"log",
|
||||||
"memoffset 0.9.0",
|
"memoffset 0.9.0",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
"solana-program-runtime",
|
"solana-program-runtime",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
|
@ -5484,7 +5484,7 @@ dependencies = [
|
||||||
"memmap2",
|
"memmap2",
|
||||||
"modular-bitfield",
|
"modular-bitfield",
|
||||||
"num_enum 0.6.1",
|
"num_enum 0.6.1",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"solana-logger",
|
"solana-logger",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
|
@ -5681,8 +5681,6 @@ dependencies = [
|
||||||
"indicatif",
|
"indicatif",
|
||||||
"log",
|
"log",
|
||||||
"quinn",
|
"quinn",
|
||||||
"rand 0.7.3",
|
|
||||||
"rand_chacha 0.2.2",
|
|
||||||
"rayon",
|
"rayon",
|
||||||
"solana-connection-cache",
|
"solana-connection-cache",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
|
@ -5761,8 +5759,8 @@ dependencies = [
|
||||||
"indexmap 2.0.0",
|
"indexmap 2.0.0",
|
||||||
"indicatif",
|
"indicatif",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"rcgen",
|
"rcgen",
|
||||||
"solana-logger",
|
"solana-logger",
|
||||||
|
@ -5797,8 +5795,8 @@ dependencies = [
|
||||||
"min-max-heap",
|
"min-max-heap",
|
||||||
"num_enum 0.6.1",
|
"num_enum 0.6.1",
|
||||||
"quinn",
|
"quinn",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"raptorq",
|
"raptorq",
|
||||||
"rayon",
|
"rayon",
|
||||||
"rolling-file",
|
"rolling-file",
|
||||||
|
@ -5887,7 +5885,7 @@ dependencies = [
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
"itertools",
|
"itertools",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"serde",
|
"serde",
|
||||||
"solana-bench-tps",
|
"solana-bench-tps",
|
||||||
"solana-client",
|
"solana-client",
|
||||||
|
@ -5926,7 +5924,7 @@ version = "1.17.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assert_matches",
|
"assert_matches",
|
||||||
"ed25519-dalek",
|
"ed25519-dalek",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"solana-program-test",
|
"solana-program-test",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
]
|
]
|
||||||
|
@ -5941,7 +5939,7 @@ dependencies = [
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
"matches",
|
"matches",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"serde",
|
"serde",
|
||||||
"solana-logger",
|
"solana-logger",
|
||||||
|
@ -5988,13 +5986,11 @@ dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"either",
|
"either",
|
||||||
"generic-array 0.14.7",
|
"generic-array 0.14.7",
|
||||||
"getrandom 0.1.16",
|
|
||||||
"im",
|
"im",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
"memmap2",
|
"memmap2",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"rand_core 0.6.4",
|
|
||||||
"rustc_version 0.4.0",
|
"rustc_version 0.4.0",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_bytes",
|
"serde_bytes",
|
||||||
|
@ -6104,8 +6100,8 @@ dependencies = [
|
||||||
"matches",
|
"matches",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"num_cpus",
|
"num_cpus",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"rustc_version 0.4.0",
|
"rustc_version 0.4.0",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -6212,8 +6208,8 @@ dependencies = [
|
||||||
"num_cpus",
|
"num_cpus",
|
||||||
"num_enum 0.6.1",
|
"num_enum 0.6.1",
|
||||||
"prost 0.11.9",
|
"prost 0.11.9",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"reed-solomon-erasure",
|
"reed-solomon-erasure",
|
||||||
"rocksdb",
|
"rocksdb",
|
||||||
|
@ -6310,7 +6306,7 @@ version = "1.17.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bincode",
|
"bincode",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
"solana-program-runtime",
|
"solana-program-runtime",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
|
@ -6327,7 +6323,7 @@ dependencies = [
|
||||||
"gag",
|
"gag",
|
||||||
"itertools",
|
"itertools",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"serial_test",
|
"serial_test",
|
||||||
"solana-accounts-db",
|
"solana-accounts-db",
|
||||||
|
@ -6420,7 +6416,7 @@ dependencies = [
|
||||||
"gethostname",
|
"gethostname",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serial_test",
|
"serial_test",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
|
@ -6432,7 +6428,7 @@ name = "solana-net-shaper"
|
||||||
version = "1.17.0"
|
version = "1.17.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap 3.2.23",
|
"clap 3.2.23",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"solana-logger",
|
"solana-logger",
|
||||||
|
@ -6447,7 +6443,7 @@ dependencies = [
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
"log",
|
"log",
|
||||||
"nix",
|
"nix",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"socket2 0.5.3",
|
"socket2 0.5.3",
|
||||||
|
@ -6484,8 +6480,8 @@ dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"matches",
|
"matches",
|
||||||
"nix",
|
"nix",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"serde",
|
"serde",
|
||||||
"solana-logger",
|
"solana-logger",
|
||||||
|
@ -6505,7 +6501,7 @@ dependencies = [
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
"log",
|
"log",
|
||||||
"matches",
|
"matches",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"solana-entry",
|
"solana-entry",
|
||||||
"solana-ledger",
|
"solana-ledger",
|
||||||
"solana-logger",
|
"solana-logger",
|
||||||
|
@ -6523,7 +6519,6 @@ version = "1.17.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap 3.2.23",
|
"clap 3.2.23",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
|
||||||
"rayon",
|
"rayon",
|
||||||
"solana-entry",
|
"solana-entry",
|
||||||
"solana-logger",
|
"solana-logger",
|
||||||
|
@ -6557,7 +6552,7 @@ dependencies = [
|
||||||
"console_error_panic_hook",
|
"console_error_panic_hook",
|
||||||
"console_log",
|
"console_log",
|
||||||
"curve25519-dalek",
|
"curve25519-dalek",
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
"itertools",
|
"itertools",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
|
@ -6569,8 +6564,7 @@ dependencies = [
|
||||||
"num-derive",
|
"num-derive",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"parking_lot 0.12.1",
|
"parking_lot 0.12.1",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
|
||||||
"rustc_version 0.4.0",
|
"rustc_version 0.4.0",
|
||||||
"rustversion",
|
"rustversion",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -6605,7 +6599,7 @@ dependencies = [
|
||||||
"num-derive",
|
"num-derive",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"percentage",
|
"percentage",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rustc_version 0.4.0",
|
"rustc_version 0.4.0",
|
||||||
"serde",
|
"serde",
|
||||||
"solana-frozen-abi",
|
"solana-frozen-abi",
|
||||||
|
@ -6912,8 +6906,8 @@ dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"ouroboros",
|
"ouroboros",
|
||||||
"percentage",
|
"percentage",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"regex",
|
"regex",
|
||||||
"rustc_version 0.4.0",
|
"rustc_version 0.4.0",
|
||||||
|
@ -6990,7 +6984,7 @@ dependencies = [
|
||||||
"pbkdf2 0.11.0",
|
"pbkdf2 0.11.0",
|
||||||
"qstring",
|
"qstring",
|
||||||
"rand 0.7.3",
|
"rand 0.7.3",
|
||||||
"rand_chacha 0.2.2",
|
"rand 0.8.5",
|
||||||
"rustc_version 0.4.0",
|
"rustc_version 0.4.0",
|
||||||
"rustversion",
|
"rustversion",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -7150,7 +7144,7 @@ dependencies = [
|
||||||
"pkcs8",
|
"pkcs8",
|
||||||
"quinn",
|
"quinn",
|
||||||
"quinn-proto",
|
"quinn-proto",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rcgen",
|
"rcgen",
|
||||||
"rustls 0.21.6",
|
"rustls 0.21.6",
|
||||||
"solana-logger",
|
"solana-logger",
|
||||||
|
@ -7262,8 +7256,6 @@ dependencies = [
|
||||||
"indexmap 2.0.0",
|
"indexmap 2.0.0",
|
||||||
"indicatif",
|
"indicatif",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
|
||||||
"rand_chacha 0.2.2",
|
|
||||||
"rayon",
|
"rayon",
|
||||||
"solana-connection-cache",
|
"solana-connection-cache",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
|
@ -7283,7 +7275,7 @@ dependencies = [
|
||||||
"bincode",
|
"bincode",
|
||||||
"clap 2.33.3",
|
"clap 2.33.3",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"solana-clap-utils",
|
"solana-clap-utils",
|
||||||
"solana-cli",
|
"solana-cli",
|
||||||
|
@ -7340,8 +7332,8 @@ dependencies = [
|
||||||
"lru",
|
"lru",
|
||||||
"matches",
|
"matches",
|
||||||
"quinn",
|
"quinn",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"rcgen",
|
"rcgen",
|
||||||
"rustls 0.21.6",
|
"rustls 0.21.6",
|
||||||
|
@ -7407,7 +7399,7 @@ dependencies = [
|
||||||
"libloading",
|
"libloading",
|
||||||
"log",
|
"log",
|
||||||
"num_cpus",
|
"num_cpus",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -7530,7 +7522,6 @@ dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"criterion",
|
"criterion",
|
||||||
"curve25519-dalek",
|
"curve25519-dalek",
|
||||||
"getrandom 0.1.16",
|
|
||||||
"num-derive",
|
"num-derive",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"solana-program-runtime",
|
"solana-program-runtime",
|
||||||
|
|
|
@ -197,7 +197,7 @@ futures-util = "0.3.28"
|
||||||
gag = "1.0.0"
|
gag = "1.0.0"
|
||||||
generic-array = { version = "0.14.7", default-features = false }
|
generic-array = { version = "0.14.7", default-features = false }
|
||||||
gethostname = "0.2.3"
|
gethostname = "0.2.3"
|
||||||
getrandom = "0.1.14"
|
getrandom = "0.2.10"
|
||||||
goauth = "0.13.1"
|
goauth = "0.13.1"
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
hidapi = { version = "2.4.1", default-features = false }
|
hidapi = { version = "2.4.1", default-features = false }
|
||||||
|
@ -263,8 +263,8 @@ qualifier_attr = { version = "0.2.2", default-features = false }
|
||||||
quinn = "0.10.2"
|
quinn = "0.10.2"
|
||||||
quinn-proto = "0.10.2"
|
quinn-proto = "0.10.2"
|
||||||
quote = "1.0"
|
quote = "1.0"
|
||||||
rand = "0.7.0"
|
rand = "0.8.5"
|
||||||
rand_chacha = "0.2.2"
|
rand_chacha = "0.3.1"
|
||||||
rand_core = "0.6.4"
|
rand_core = "0.6.4"
|
||||||
raptorq = "1.7.0"
|
raptorq = "1.7.0"
|
||||||
rayon = "1.7.0"
|
rayon = "1.7.0"
|
||||||
|
|
|
@ -136,7 +136,7 @@ fn make_create_message(
|
||||||
maybe_space: Option<u64>,
|
maybe_space: Option<u64>,
|
||||||
mint: Option<Pubkey>,
|
mint: Option<Pubkey>,
|
||||||
) -> Message {
|
) -> Message {
|
||||||
let space = maybe_space.unwrap_or_else(|| thread_rng().gen_range(0, 1000));
|
let space = maybe_space.unwrap_or_else(|| thread_rng().gen_range(0..1000));
|
||||||
|
|
||||||
let instructions: Vec<_> = (0..num_instructions)
|
let instructions: Vec<_> = (0..num_instructions)
|
||||||
.flat_map(|_| {
|
.flat_map(|_| {
|
||||||
|
|
|
@ -4500,7 +4500,7 @@ impl AccountsDb {
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
};
|
};
|
||||||
if is_candidate || (can_randomly_shrink && thread_rng().gen_range(0, 10000) == 0) {
|
if is_candidate || (can_randomly_shrink && thread_rng().gen_range(0..10000) == 0) {
|
||||||
// we are a candidate for shrink, so either append us to the previous append vec
|
// we are a candidate for shrink, so either append us to the previous append vec
|
||||||
// or recreate us as a new append vec and eliminate the dead accounts
|
// or recreate us as a new append vec and eliminate the dead accounts
|
||||||
info!(
|
info!(
|
||||||
|
@ -5712,7 +5712,7 @@ impl AccountsDb {
|
||||||
self.stats
|
self.stats
|
||||||
.create_store_count
|
.create_store_count
|
||||||
.fetch_add(1, Ordering::Relaxed);
|
.fetch_add(1, Ordering::Relaxed);
|
||||||
let path_index = thread_rng().gen_range(0, paths.len());
|
let path_index = thread_rng().gen_range(0..paths.len());
|
||||||
let store = Arc::new(self.new_storage_entry(
|
let store = Arc::new(self.new_storage_entry(
|
||||||
slot,
|
slot,
|
||||||
Path::new(&paths[path_index]),
|
Path::new(&paths[path_index]),
|
||||||
|
@ -9697,7 +9697,7 @@ impl AccountsDb {
|
||||||
pub fn check_accounts(&self, pubkeys: &[Pubkey], slot: Slot, num: usize, count: usize) {
|
pub fn check_accounts(&self, pubkeys: &[Pubkey], slot: Slot, num: usize, count: usize) {
|
||||||
let ancestors = vec![(slot, 0)].into_iter().collect();
|
let ancestors = vec![(slot, 0)].into_iter().collect();
|
||||||
for _ in 0..num {
|
for _ in 0..num {
|
||||||
let idx = thread_rng().gen_range(0, num);
|
let idx = thread_rng().gen_range(0..num);
|
||||||
let account = self.load_without_fixed_root(&ancestors, &pubkeys[idx]);
|
let account = self.load_without_fixed_root(&ancestors, &pubkeys[idx]);
|
||||||
let account1 = Some((
|
let account1 = Some((
|
||||||
AccountSharedData::new(
|
AccountSharedData::new(
|
||||||
|
@ -9904,7 +9904,7 @@ pub mod test_utils {
|
||||||
// accounts cache!
|
// accounts cache!
|
||||||
pub fn update_accounts_bench(accounts: &Accounts, pubkeys: &[Pubkey], slot: u64) {
|
pub fn update_accounts_bench(accounts: &Accounts, pubkeys: &[Pubkey], slot: u64) {
|
||||||
for pubkey in pubkeys {
|
for pubkey in pubkeys {
|
||||||
let amount = thread_rng().gen_range(0, 10);
|
let amount = thread_rng().gen_range(0..10);
|
||||||
let account = AccountSharedData::new(amount, 0, AccountSharedData::default().owner());
|
let account = AccountSharedData::new(amount, 0, AccountSharedData::default().owner());
|
||||||
accounts.store_slow_uncached(slot, pubkey, &account);
|
accounts.store_slow_uncached(slot, pubkey, &account);
|
||||||
}
|
}
|
||||||
|
@ -11405,7 +11405,7 @@ pub mod tests {
|
||||||
let mut pubkeys: Vec<Pubkey> = vec![];
|
let mut pubkeys: Vec<Pubkey> = vec![];
|
||||||
db.create_account(&mut pubkeys, 0, 100, 0, 0);
|
db.create_account(&mut pubkeys, 0, 100, 0, 0);
|
||||||
for _ in 1..100 {
|
for _ in 1..100 {
|
||||||
let idx = thread_rng().gen_range(0, 99);
|
let idx = thread_rng().gen_range(0..99);
|
||||||
let ancestors = vec![(0, 0)].into_iter().collect();
|
let ancestors = vec![(0, 0)].into_iter().collect();
|
||||||
let account = db
|
let account = db
|
||||||
.load_without_fixed_root(&ancestors, &pubkeys[idx])
|
.load_without_fixed_root(&ancestors, &pubkeys[idx])
|
||||||
|
@ -11421,7 +11421,7 @@ pub mod tests {
|
||||||
|
|
||||||
// check that all the accounts appear with a new root
|
// check that all the accounts appear with a new root
|
||||||
for _ in 1..100 {
|
for _ in 1..100 {
|
||||||
let idx = thread_rng().gen_range(0, 99);
|
let idx = thread_rng().gen_range(0..99);
|
||||||
let ancestors = vec![(0, 0)].into_iter().collect();
|
let ancestors = vec![(0, 0)].into_iter().collect();
|
||||||
let account0 = db
|
let account0 = db
|
||||||
.load_without_fixed_root(&ancestors, &pubkeys[idx])
|
.load_without_fixed_root(&ancestors, &pubkeys[idx])
|
||||||
|
@ -11556,7 +11556,7 @@ pub mod tests {
|
||||||
|
|
||||||
fn update_accounts(accounts: &AccountsDb, pubkeys: &[Pubkey], slot: Slot, range: usize) {
|
fn update_accounts(accounts: &AccountsDb, pubkeys: &[Pubkey], slot: Slot, range: usize) {
|
||||||
for _ in 1..1000 {
|
for _ in 1..1000 {
|
||||||
let idx = thread_rng().gen_range(0, range);
|
let idx = thread_rng().gen_range(0..range);
|
||||||
let ancestors = vec![(slot, 0)].into_iter().collect();
|
let ancestors = vec![(slot, 0)].into_iter().collect();
|
||||||
if let Some((mut account, _)) =
|
if let Some((mut account, _)) =
|
||||||
accounts.load_without_fixed_root(&ancestors, &pubkeys[idx])
|
accounts.load_without_fixed_root(&ancestors, &pubkeys[idx])
|
||||||
|
@ -12393,7 +12393,7 @@ pub mod tests {
|
||||||
let mut account = AccountSharedData::new(1, 0, &pubkey);
|
let mut account = AccountSharedData::new(1, 0, &pubkey);
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
loop {
|
loop {
|
||||||
let account_bal = thread_rng().gen_range(1, 99);
|
let account_bal = thread_rng().gen_range(1..99);
|
||||||
account.set_lamports(account_bal);
|
account.set_lamports(account_bal);
|
||||||
db.store_for_tests(slot, &[(&pubkey, &account)]);
|
db.store_for_tests(slot, &[(&pubkey, &account)]);
|
||||||
|
|
||||||
|
@ -15194,7 +15194,7 @@ pub mod tests {
|
||||||
// Ordering::Relaxed is ok because of no data dependencies; the modified field is
|
// Ordering::Relaxed is ok because of no data dependencies; the modified field is
|
||||||
// completely free-standing cfg(test) control-flow knob.
|
// completely free-standing cfg(test) control-flow knob.
|
||||||
db.load_limit
|
db.load_limit
|
||||||
.store(thread_rng().gen_range(0, 10) as u64, Ordering::Relaxed);
|
.store(thread_rng().gen_range(0..10) as u64, Ordering::Relaxed);
|
||||||
|
|
||||||
// Load should never be unable to find this key
|
// Load should never be unable to find this key
|
||||||
let loaded_account = db
|
let loaded_account = db
|
||||||
|
|
|
@ -1619,7 +1619,7 @@ impl<T: IndexValue, U: DiskIndexValue + From<T> + Into<T>> AccountsIndex<T, U> {
|
||||||
let expected_items_per_bin = item_len * 2 / bins;
|
let expected_items_per_bin = item_len * 2 / bins;
|
||||||
// offset bin 0 in the 'binned' array by a random amount.
|
// offset bin 0 in the 'binned' array by a random amount.
|
||||||
// This results in calls to insert_new_entry_if_missing_with_lock from different threads starting at different bins.
|
// This results in calls to insert_new_entry_if_missing_with_lock from different threads starting at different bins.
|
||||||
let random_offset = thread_rng().gen_range(0, bins);
|
let random_offset = thread_rng().gen_range(0..bins);
|
||||||
let use_disk = self.storage.storage.disk.is_some();
|
let use_disk = self.storage.storage.disk.is_some();
|
||||||
let mut binned = (0..bins)
|
let mut binned = (0..bins)
|
||||||
.map(|mut pubkey_bin| {
|
.map(|mut pubkey_bin| {
|
||||||
|
|
|
@ -91,7 +91,7 @@ impl AncientSlotInfos {
|
||||||
let should_shrink = if capacity > 0 {
|
let should_shrink = if capacity > 0 {
|
||||||
let alive_ratio = alive_bytes * 100 / capacity;
|
let alive_ratio = alive_bytes * 100 / capacity;
|
||||||
alive_ratio < 90
|
alive_ratio < 90
|
||||||
|| if can_randomly_shrink && thread_rng().gen_range(0, 10000) == 0 {
|
|| if can_randomly_shrink && thread_rng().gen_range(0..10000) == 0 {
|
||||||
was_randomly_shrunk = true;
|
was_randomly_shrunk = true;
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
|
@ -1202,7 +1202,7 @@ pub mod tests {
|
||||||
let mut data_size = 450;
|
let mut data_size = 450;
|
||||||
// random # of extra accounts here
|
// random # of extra accounts here
|
||||||
let total_accounts_per_storage =
|
let total_accounts_per_storage =
|
||||||
thread_rng().gen_range(0, total_accounts_per_storage);
|
thread_rng().gen_range(0..total_accounts_per_storage);
|
||||||
let _pubkeys_and_accounts = storages
|
let _pubkeys_and_accounts = storages
|
||||||
.iter()
|
.iter()
|
||||||
.map(|storage| {
|
.map(|storage| {
|
||||||
|
|
|
@ -1067,7 +1067,7 @@ pub mod tests {
|
||||||
|
|
||||||
let now = Instant::now();
|
let now = Instant::now();
|
||||||
for _ in 0..size {
|
for _ in 0..size {
|
||||||
let sample = thread_rng().gen_range(0, indexes.len());
|
let sample = thread_rng().gen_range(0..indexes.len());
|
||||||
let account = create_test_account(sample);
|
let account = create_test_account(sample);
|
||||||
assert_eq!(av.get_account_test(indexes[sample]).unwrap(), account);
|
assert_eq!(av.get_account_test(indexes[sample]).unwrap(), account);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ pub fn get_append_vec_path(path: &str) -> TempFile {
|
||||||
let out_dir = get_append_vec_dir();
|
let out_dir = get_append_vec_dir();
|
||||||
let rand_string: String = rand::thread_rng()
|
let rand_string: String = rand::thread_rng()
|
||||||
.sample_iter(&Alphanumeric)
|
.sample_iter(&Alphanumeric)
|
||||||
|
.map(char::from)
|
||||||
.take(30)
|
.take(30)
|
||||||
.collect();
|
.collect();
|
||||||
let dir = format!("{out_dir}/{rand_string}");
|
let dir = format!("{out_dir}/{rand_string}");
|
||||||
|
|
|
@ -497,7 +497,7 @@ pub mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
CalculateHashIntermediate::new(
|
CalculateHashIntermediate::new(
|
||||||
solana_sdk::hash::new_rand(&mut rng),
|
solana_sdk::hash::Hash::new_unique(),
|
||||||
ct as u64,
|
ct as u64,
|
||||||
pk,
|
pk,
|
||||||
)
|
)
|
||||||
|
|
|
@ -381,7 +381,7 @@ where
|
||||||
};
|
};
|
||||||
if let ["accounts", file] = parts {
|
if let ["accounts", file] = parts {
|
||||||
// Randomly distribute the accounts files about the available `account_paths`,
|
// Randomly distribute the accounts files about the available `account_paths`,
|
||||||
let path_index = thread_rng().gen_range(0, account_paths.len());
|
let path_index = thread_rng().gen_range(0..account_paths.len());
|
||||||
match account_paths
|
match account_paths
|
||||||
.get(path_index)
|
.get(path_index)
|
||||||
.map(|path_buf| path_buf.as_path())
|
.map(|path_buf| path_buf.as_path())
|
||||||
|
|
|
@ -179,7 +179,7 @@ impl<T: IndexValue, U: DiskIndexValue + From<T> + Into<T>> InMemAccountsIndex<T,
|
||||||
// Spread out the scanning across all ages within the window.
|
// Spread out the scanning across all ages within the window.
|
||||||
// This causes us to scan 1/N of the bins each 'Age'
|
// This causes us to scan 1/N of the bins each 'Age'
|
||||||
remaining_ages_to_skip_flushing: AtomicU8::new(
|
remaining_ages_to_skip_flushing: AtomicU8::new(
|
||||||
thread_rng().gen_range(0, num_ages_to_distribute_flushes),
|
thread_rng().gen_range(0..num_ages_to_distribute_flushes),
|
||||||
),
|
),
|
||||||
num_ages_to_distribute_flushes,
|
num_ages_to_distribute_flushes,
|
||||||
}
|
}
|
||||||
|
@ -932,7 +932,7 @@ impl<T: IndexValue, U: DiskIndexValue + From<T> + Into<T>> InMemAccountsIndex<T,
|
||||||
// random eviction
|
// random eviction
|
||||||
const N: usize = 1000;
|
const N: usize = 1000;
|
||||||
// 1/N chance of eviction
|
// 1/N chance of eviction
|
||||||
thread_rng().gen_range(0, N) == 0
|
thread_rng().gen_range(0..N) == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
/// assumes 1 entry in the slot list. Ignores overhead of the HashMap and such
|
/// assumes 1 entry in the slot list. Ignores overhead of the HashMap and such
|
||||||
|
|
|
@ -291,7 +291,7 @@ mod tests {
|
||||||
const MAX_CACHE_SIZE: usize = 17 * (CACHE_ENTRY_SIZE + DATA_SIZE);
|
const MAX_CACHE_SIZE: usize = 17 * (CACHE_ENTRY_SIZE + DATA_SIZE);
|
||||||
let mut rng = ChaChaRng::from_seed(SEED);
|
let mut rng = ChaChaRng::from_seed(SEED);
|
||||||
let cache = ReadOnlyAccountsCache::new(MAX_CACHE_SIZE);
|
let cache = ReadOnlyAccountsCache::new(MAX_CACHE_SIZE);
|
||||||
let slots: Vec<Slot> = repeat_with(|| rng.gen_range(0, 1000)).take(5).collect();
|
let slots: Vec<Slot> = repeat_with(|| rng.gen_range(0..1000)).take(5).collect();
|
||||||
let pubkeys: Vec<Pubkey> = repeat_with(|| {
|
let pubkeys: Vec<Pubkey> = repeat_with(|| {
|
||||||
let mut arr = [0u8; 32];
|
let mut arr = [0u8; 32];
|
||||||
rng.fill(&mut arr[..]);
|
rng.fill(&mut arr[..]);
|
||||||
|
|
|
@ -98,7 +98,7 @@ impl StakeReward {
|
||||||
stake_pubkey: Pubkey::new_unique(),
|
stake_pubkey: Pubkey::new_unique(),
|
||||||
stake_reward_info: RewardInfo {
|
stake_reward_info: RewardInfo {
|
||||||
reward_type: RewardType::Staking,
|
reward_type: RewardType::Staking,
|
||||||
lamports: rng.gen_range(1, 200),
|
lamports: rng.gen_range(1..200),
|
||||||
post_balance: 0, /* unused atm */
|
post_balance: 0, /* unused atm */
|
||||||
commission: None, /* unused atm */
|
commission: None, /* unused atm */
|
||||||
},
|
},
|
||||||
|
|
|
@ -127,7 +127,7 @@ mod tests {
|
||||||
.iter()
|
.iter()
|
||||||
.map(|address| AccountIndexWriterEntry {
|
.map(|address| AccountIndexWriterEntry {
|
||||||
address,
|
address,
|
||||||
block_offset: rng.gen_range(128, 2048),
|
block_offset: rng.gen_range(128..2048),
|
||||||
intra_block_offset: 0,
|
intra_block_offset: 0,
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
|
@ -103,7 +103,7 @@ fn bench_sigs_hashmap(bencher: &mut Bencher) {
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_add_hash(bencher: &mut Bencher) {
|
fn bench_add_hash(bencher: &mut Bencher) {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let hash_values: Vec<_> = std::iter::repeat_with(|| solana_sdk::hash::new_rand(&mut rng))
|
let hash_values: Vec<_> = std::iter::repeat_with(Hash::new_unique)
|
||||||
.take(1200)
|
.take(1200)
|
||||||
.collect();
|
.collect();
|
||||||
let mut fail = 0;
|
let mut fail = 0;
|
||||||
|
@ -112,7 +112,7 @@ fn bench_add_hash(bencher: &mut Bencher) {
|
||||||
for hash_value in &hash_values {
|
for hash_value in &hash_values {
|
||||||
bloom.add(hash_value);
|
bloom.add(hash_value);
|
||||||
}
|
}
|
||||||
let index = rng.gen_range(0, hash_values.len());
|
let index = rng.gen_range(0..hash_values.len());
|
||||||
if !bloom.contains(&hash_values[index]) {
|
if !bloom.contains(&hash_values[index]) {
|
||||||
fail += 1;
|
fail += 1;
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ fn bench_add_hash(bencher: &mut Bencher) {
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_add_hash_atomic(bencher: &mut Bencher) {
|
fn bench_add_hash_atomic(bencher: &mut Bencher) {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let hash_values: Vec<_> = std::iter::repeat_with(|| solana_sdk::hash::new_rand(&mut rng))
|
let hash_values: Vec<_> = std::iter::repeat_with(Hash::new_unique)
|
||||||
.take(1200)
|
.take(1200)
|
||||||
.collect();
|
.collect();
|
||||||
let mut fail = 0;
|
let mut fail = 0;
|
||||||
|
@ -136,7 +136,7 @@ fn bench_add_hash_atomic(bencher: &mut Bencher) {
|
||||||
for hash_value in &hash_values {
|
for hash_value in &hash_values {
|
||||||
bloom.add(hash_value);
|
bloom.add(hash_value);
|
||||||
}
|
}
|
||||||
let index = rng.gen_range(0, hash_values.len());
|
let index = rng.gen_range(0..hash_values.len());
|
||||||
if !bloom.contains(&hash_values[index]) {
|
if !bloom.contains(&hash_values[index]) {
|
||||||
fail += 1;
|
fail += 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -308,10 +308,16 @@ mod test {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn generate_random_hash() -> Hash {
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
let mut hash = [0u8; solana_sdk::hash::HASH_BYTES];
|
||||||
|
rng.fill(&mut hash);
|
||||||
|
Hash::new_from_array(hash)
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_atomic_bloom() {
|
fn test_atomic_bloom() {
|
||||||
let mut rng = rand::thread_rng();
|
let hash_values: Vec<_> = std::iter::repeat_with(generate_random_hash)
|
||||||
let hash_values: Vec<_> = std::iter::repeat_with(|| solana_sdk::hash::new_rand(&mut rng))
|
|
||||||
.take(1200)
|
.take(1200)
|
||||||
.collect();
|
.collect();
|
||||||
let bloom: AtomicBloom<_> = Bloom::<Hash>::random(1287, 0.1, 7424).into();
|
let bloom: AtomicBloom<_> = Bloom::<Hash>::random(1287, 0.1, 7424).into();
|
||||||
|
@ -328,7 +334,7 @@ mod test {
|
||||||
for hash_value in hash_values {
|
for hash_value in hash_values {
|
||||||
assert!(bloom.contains(&hash_value));
|
assert!(bloom.contains(&hash_value));
|
||||||
}
|
}
|
||||||
let false_positive = std::iter::repeat_with(|| solana_sdk::hash::new_rand(&mut rng))
|
let false_positive = std::iter::repeat_with(generate_random_hash)
|
||||||
.take(10_000)
|
.take(10_000)
|
||||||
.filter(|hash_value| bloom.contains(hash_value))
|
.filter(|hash_value| bloom.contains(hash_value))
|
||||||
.count();
|
.count();
|
||||||
|
@ -340,7 +346,7 @@ mod test {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let keys: Vec<_> = std::iter::repeat_with(|| rng.gen()).take(5).collect();
|
let keys: Vec<_> = std::iter::repeat_with(|| rng.gen()).take(5).collect();
|
||||||
let mut bloom = Bloom::<Hash>::new(9731, keys.clone());
|
let mut bloom = Bloom::<Hash>::new(9731, keys.clone());
|
||||||
let hash_values: Vec<_> = std::iter::repeat_with(|| solana_sdk::hash::new_rand(&mut rng))
|
let hash_values: Vec<_> = std::iter::repeat_with(generate_random_hash)
|
||||||
.take(1000)
|
.take(1000)
|
||||||
.collect();
|
.collect();
|
||||||
for hash_value in &hash_values {
|
for hash_value in &hash_values {
|
||||||
|
@ -375,8 +381,7 @@ mod test {
|
||||||
assert!(bloom.contains(hash_value));
|
assert!(bloom.contains(hash_value));
|
||||||
}
|
}
|
||||||
// Round trip, inserting new hash values.
|
// Round trip, inserting new hash values.
|
||||||
let more_hash_values: Vec<_> =
|
let more_hash_values: Vec<_> = std::iter::repeat_with(generate_random_hash)
|
||||||
std::iter::repeat_with(|| solana_sdk::hash::new_rand(&mut rng))
|
|
||||||
.take(1000)
|
.take(1000)
|
||||||
.collect();
|
.collect();
|
||||||
let bloom: AtomicBloom<_> = bloom.into();
|
let bloom: AtomicBloom<_> = bloom.into();
|
||||||
|
@ -391,7 +396,7 @@ mod test {
|
||||||
for hash_value in &more_hash_values {
|
for hash_value in &more_hash_values {
|
||||||
assert!(bloom.contains(hash_value));
|
assert!(bloom.contains(hash_value));
|
||||||
}
|
}
|
||||||
let false_positive = std::iter::repeat_with(|| solana_sdk::hash::new_rand(&mut rng))
|
let false_positive = std::iter::repeat_with(generate_random_hash)
|
||||||
.take(10_000)
|
.take(10_000)
|
||||||
.filter(|hash_value| bloom.contains(hash_value))
|
.filter(|hash_value| bloom.contains(hash_value))
|
||||||
.count();
|
.count();
|
||||||
|
@ -410,7 +415,7 @@ mod test {
|
||||||
for hash_value in &more_hash_values {
|
for hash_value in &more_hash_values {
|
||||||
assert!(bloom.contains(hash_value));
|
assert!(bloom.contains(hash_value));
|
||||||
}
|
}
|
||||||
let false_positive = std::iter::repeat_with(|| solana_sdk::hash::new_rand(&mut rng))
|
let false_positive = std::iter::repeat_with(generate_random_hash)
|
||||||
.take(10_000)
|
.take(10_000)
|
||||||
.filter(|hash_value| bloom.contains(hash_value))
|
.filter(|hash_value| bloom.contains(hash_value))
|
||||||
.count();
|
.count();
|
||||||
|
|
|
@ -483,7 +483,7 @@ impl<'b, T: Clone + Copy + 'static> Bucket<T> {
|
||||||
let best_bucket = &mut self.data[best_fit_bucket as usize];
|
let best_bucket = &mut self.data[best_fit_bucket as usize];
|
||||||
let cap_power = best_bucket.contents.capacity_pow2();
|
let cap_power = best_bucket.contents.capacity_pow2();
|
||||||
let cap = best_bucket.capacity();
|
let cap = best_bucket.capacity();
|
||||||
let pos = thread_rng().gen_range(0, cap);
|
let pos = thread_rng().gen_range(0..cap);
|
||||||
let mut success = false;
|
let mut success = false;
|
||||||
// max search is increased here by a lot for this search. The idea is that we just have to find an empty bucket somewhere.
|
// max search is increased here by a lot for this search. The idea is that we just have to find an empty bucket somewhere.
|
||||||
// We don't mind waiting on a new write (by searching longer). Writing is done in the background only.
|
// We don't mind waiting on a new write (by searching longer). Writing is done in the background only.
|
||||||
|
|
|
@ -367,11 +367,11 @@ mod tests {
|
||||||
let all_keys = Mutex::new(vec![]);
|
let all_keys = Mutex::new(vec![]);
|
||||||
|
|
||||||
let gen_rand_value = || {
|
let gen_rand_value = || {
|
||||||
let count = thread_rng().gen_range(0, max_slot_list_len);
|
let count = thread_rng().gen_range(0..max_slot_list_len);
|
||||||
let v = (0..count)
|
let v = (0..count)
|
||||||
.map(|x| (x as usize, x as usize /*thread_rng().gen::<usize>()*/))
|
.map(|x| (x as usize, x as usize /*thread_rng().gen::<usize>()*/))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
let range = thread_rng().gen_range(0, 100);
|
let range = thread_rng().gen_range(0..100);
|
||||||
// pick ref counts that are useful and common
|
// pick ref counts that are useful and common
|
||||||
let rc = if range < 50 {
|
let rc = if range < 50 {
|
||||||
1
|
1
|
||||||
|
@ -380,7 +380,7 @@ mod tests {
|
||||||
} else if range < 70 {
|
} else if range < 70 {
|
||||||
2
|
2
|
||||||
} else {
|
} else {
|
||||||
thread_rng().gen_range(0, MAX_LEGAL_REFCOUNT)
|
thread_rng().gen_range(0..MAX_LEGAL_REFCOUNT)
|
||||||
};
|
};
|
||||||
|
|
||||||
(v, rc)
|
(v, rc)
|
||||||
|
@ -392,7 +392,7 @@ mod tests {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let len = keys.len();
|
let len = keys.len();
|
||||||
Some(keys.remove(thread_rng().gen_range(0, len)))
|
Some(keys.remove(thread_rng().gen_range(0..len)))
|
||||||
};
|
};
|
||||||
let return_key = |key| {
|
let return_key = |key| {
|
||||||
let mut keys = all_keys.lock().unwrap();
|
let mut keys = all_keys.lock().unwrap();
|
||||||
|
@ -445,11 +445,11 @@ mod tests {
|
||||||
// verify consistency between hashmap and all bucket maps
|
// verify consistency between hashmap and all bucket maps
|
||||||
for i in 0..10000 {
|
for i in 0..10000 {
|
||||||
initial = initial.saturating_sub(1);
|
initial = initial.saturating_sub(1);
|
||||||
if initial > 0 || thread_rng().gen_range(0, 5) == 0 {
|
if initial > 0 || thread_rng().gen_range(0..5) == 0 {
|
||||||
// insert
|
// insert
|
||||||
let mut to_add = 1;
|
let mut to_add = 1;
|
||||||
if initial > 1 && use_batch_insert {
|
if initial > 1 && use_batch_insert {
|
||||||
to_add = thread_rng().gen_range(1, (initial / 4).max(2));
|
to_add = thread_rng().gen_range(1..(initial / 4).max(2));
|
||||||
initial -= to_add;
|
initial -= to_add;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -481,12 +481,12 @@ mod tests {
|
||||||
hash_map.write().unwrap().insert(k, v);
|
hash_map.write().unwrap().insert(k, v);
|
||||||
return_key(k);
|
return_key(k);
|
||||||
});
|
});
|
||||||
let insert = thread_rng().gen_range(0, 2) == 0;
|
let insert = thread_rng().gen_range(0..2) == 0;
|
||||||
maps.iter().for_each(|map| {
|
maps.iter().for_each(|map| {
|
||||||
// batch insert can only work for the map with only 1 bucket so that we can batch add to a single bucket
|
// batch insert can only work for the map with only 1 bucket so that we can batch add to a single bucket
|
||||||
let batch_insert_now = map.buckets.len() == 1
|
let batch_insert_now = map.buckets.len() == 1
|
||||||
&& use_batch_insert
|
&& use_batch_insert
|
||||||
&& thread_rng().gen_range(0, 2) == 0;
|
&& thread_rng().gen_range(0..2) == 0;
|
||||||
if batch_insert_now {
|
if batch_insert_now {
|
||||||
// batch insert into the map with 1 bucket 50% of the time
|
// batch insert into the map with 1 bucket 50% of the time
|
||||||
let mut batch_additions = additions
|
let mut batch_additions = additions
|
||||||
|
@ -495,12 +495,12 @@ mod tests {
|
||||||
.map(|(k, mut v)| (k, v.0.pop().unwrap()))
|
.map(|(k, mut v)| (k, v.0.pop().unwrap()))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
let mut duplicates = 0;
|
let mut duplicates = 0;
|
||||||
if batch_additions.len() > 1 && thread_rng().gen_range(0, 2) == 0 {
|
if batch_additions.len() > 1 && thread_rng().gen_range(0..2) == 0 {
|
||||||
// insert a duplicate sometimes
|
// insert a duplicate sometimes
|
||||||
let item_to_duplicate =
|
let item_to_duplicate =
|
||||||
thread_rng().gen_range(0, batch_additions.len());
|
thread_rng().gen_range(0..batch_additions.len());
|
||||||
let where_to_insert_duplicate =
|
let where_to_insert_duplicate =
|
||||||
thread_rng().gen_range(0, batch_additions.len());
|
thread_rng().gen_range(0..batch_additions.len());
|
||||||
batch_additions.insert(
|
batch_additions.insert(
|
||||||
where_to_insert_duplicate,
|
where_to_insert_duplicate,
|
||||||
batch_additions[item_to_duplicate],
|
batch_additions[item_to_duplicate],
|
||||||
|
@ -541,13 +541,13 @@ mod tests {
|
||||||
// if we are using batch insert, it is illegal to update, delete, or addref/unref an account until all batch inserts are complete
|
// if we are using batch insert, it is illegal to update, delete, or addref/unref an account until all batch inserts are complete
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if thread_rng().gen_range(0, 10) == 0 {
|
if thread_rng().gen_range(0..10) == 0 {
|
||||||
// update
|
// update
|
||||||
if let Some(k) = get_key() {
|
if let Some(k) = get_key() {
|
||||||
let hm = hash_map.read().unwrap();
|
let hm = hash_map.read().unwrap();
|
||||||
let (v, rc) = gen_rand_value();
|
let (v, rc) = gen_rand_value();
|
||||||
let v_old = hm.get(&k);
|
let v_old = hm.get(&k);
|
||||||
let insert = thread_rng().gen_range(0, 2) == 0;
|
let insert = thread_rng().gen_range(0..2) == 0;
|
||||||
maps.iter().for_each(|map| {
|
maps.iter().for_each(|map| {
|
||||||
if insert {
|
if insert {
|
||||||
map.insert(&k, (&v, rc))
|
map.insert(&k, (&v, rc))
|
||||||
|
@ -563,7 +563,7 @@ mod tests {
|
||||||
return_key(k);
|
return_key(k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if thread_rng().gen_range(0, 20) == 0 {
|
if thread_rng().gen_range(0..20) == 0 {
|
||||||
// delete
|
// delete
|
||||||
if let Some(k) = get_key() {
|
if let Some(k) = get_key() {
|
||||||
let mut hm = hash_map.write().unwrap();
|
let mut hm = hash_map.write().unwrap();
|
||||||
|
@ -573,10 +573,10 @@ mod tests {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if thread_rng().gen_range(0, 10) == 0 {
|
if thread_rng().gen_range(0..10) == 0 {
|
||||||
// add/unref
|
// add/unref
|
||||||
if let Some(k) = get_key() {
|
if let Some(k) = get_key() {
|
||||||
let mut inc = thread_rng().gen_range(0, 2) == 0;
|
let mut inc = thread_rng().gen_range(0..2) == 0;
|
||||||
let mut hm = hash_map.write().unwrap();
|
let mut hm = hash_map.write().unwrap();
|
||||||
let (v, mut rc) = hm.get(&k).map(|(v, rc)| (v.to_vec(), *rc)).unwrap();
|
let (v, mut rc) = hm.get(&k).map(|(v, rc)| (v.to_vec(), *rc)).unwrap();
|
||||||
if !inc && rc == 0 {
|
if !inc && rc == 0 {
|
||||||
|
|
|
@ -337,9 +337,9 @@ impl<O: BucketOccupied> BucketStorage<O> {
|
||||||
/// allocate a new memory mapped file of size `bytes` on one of `drives`
|
/// allocate a new memory mapped file of size `bytes` on one of `drives`
|
||||||
fn new_map(drives: &[PathBuf], bytes: u64, stats: &BucketStats) -> (MmapMut, PathBuf) {
|
fn new_map(drives: &[PathBuf], bytes: u64, stats: &BucketStats) -> (MmapMut, PathBuf) {
|
||||||
let mut measure_new_file = Measure::start("measure_new_file");
|
let mut measure_new_file = Measure::start("measure_new_file");
|
||||||
let r = thread_rng().gen_range(0, drives.len());
|
let r = thread_rng().gen_range(0..drives.len());
|
||||||
let drive = &drives[r];
|
let drive = &drives[r];
|
||||||
let pos = format!("{}", thread_rng().gen_range(0, u128::MAX),);
|
let pos = format!("{}", thread_rng().gen_range(0..u128::MAX),);
|
||||||
let file = drive.join(pos);
|
let file = drive.join(pos);
|
||||||
let mut data = OpenOptions::new()
|
let mut data = OpenOptions::new()
|
||||||
.read(true)
|
.read(true)
|
||||||
|
|
|
@ -105,7 +105,7 @@ test-stable-sbf)
|
||||||
# latest mainbeta release version.
|
# latest mainbeta release version.
|
||||||
solana_program_count=$(grep -c 'solana-program v' cargo.log)
|
solana_program_count=$(grep -c 'solana-program v' cargo.log)
|
||||||
rm -f cargo.log
|
rm -f cargo.log
|
||||||
if ((solana_program_count > 14)); then
|
if ((solana_program_count > 17)); then
|
||||||
echo "Regression of build redundancy ${solana_program_count}."
|
echo "Regression of build redundancy ${solana_program_count}."
|
||||||
echo "Review dependency features that trigger redundant rebuilds of solana-program."
|
echo "Review dependency features that trigger redundant rebuilds of solana-program."
|
||||||
exit 1
|
exit 1
|
||||||
|
|
|
@ -19,7 +19,6 @@ indexmap = { workspace = true }
|
||||||
indicatif = { workspace = true }
|
indicatif = { workspace = true }
|
||||||
log = { workspace = true }
|
log = { workspace = true }
|
||||||
quinn = { workspace = true }
|
quinn = { workspace = true }
|
||||||
rand = { workspace = true }
|
|
||||||
rayon = { workspace = true }
|
rayon = { workspace = true }
|
||||||
solana-connection-cache = { workspace = true }
|
solana-connection-cache = { workspace = true }
|
||||||
solana-measure = { workspace = true }
|
solana-measure = { workspace = true }
|
||||||
|
@ -39,7 +38,6 @@ tokio = { workspace = true, features = ["full"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
crossbeam-channel = { workspace = true }
|
crossbeam-channel = { workspace = true }
|
||||||
rand_chacha = { workspace = true }
|
|
||||||
|
|
||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
targets = ["x86_64-unknown-linux-gnu"]
|
targets = ["x86_64-unknown-linux-gnu"]
|
||||||
|
|
|
@ -115,7 +115,7 @@ where
|
||||||
let existing_index = map.get_index_of(addr);
|
let existing_index = map.get_index_of(addr);
|
||||||
while map.len() >= MAX_CONNECTIONS {
|
while map.len() >= MAX_CONNECTIONS {
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
let n = rng.gen_range(0, MAX_CONNECTIONS);
|
let n = rng.gen_range(0..MAX_CONNECTIONS);
|
||||||
if let Some(index) = existing_index {
|
if let Some(index) = existing_index {
|
||||||
if n == index {
|
if n == index {
|
||||||
continue;
|
continue;
|
||||||
|
@ -316,7 +316,7 @@ pub trait ConnectionPool {
|
||||||
/// This randomly picks a connection in the pool.
|
/// This randomly picks a connection in the pool.
|
||||||
fn borrow_connection(&self) -> Arc<Self::BaseClientConnection> {
|
fn borrow_connection(&self) -> Arc<Self::BaseClientConnection> {
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
let n = rng.gen_range(0, self.num_connections());
|
let n = rng.gen_range(0..self.num_connections());
|
||||||
self.get(n).expect("index is within num_connections")
|
self.get(n).expect("index is within num_connections")
|
||||||
}
|
}
|
||||||
/// Check if we need to create a new connection. If the count of the connections
|
/// Check if we need to create a new connection. If the count of the connections
|
||||||
|
@ -532,10 +532,10 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_addr(rng: &mut ChaChaRng) -> SocketAddr {
|
fn get_addr(rng: &mut ChaChaRng) -> SocketAddr {
|
||||||
let a = rng.gen_range(1, 255);
|
let a = rng.gen_range(1..255);
|
||||||
let b = rng.gen_range(1, 255);
|
let b = rng.gen_range(1..255);
|
||||||
let c = rng.gen_range(1, 255);
|
let c = rng.gen_range(1..255);
|
||||||
let d = rng.gen_range(1, 255);
|
let d = rng.gen_range(1..255);
|
||||||
|
|
||||||
let addr_str = format!("{a}.{b}.{c}.{d}:80");
|
let addr_str = format!("{a}.{b}.{c}.{d}:80");
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ fn run_bench_packet_discard(num_ips: usize, bencher: &mut Bencher) {
|
||||||
for batch in batches.iter_mut() {
|
for batch in batches.iter_mut() {
|
||||||
total += batch.len();
|
total += batch.len();
|
||||||
for p in batch.iter_mut() {
|
for p in batch.iter_mut() {
|
||||||
let ip_index = thread_rng().gen_range(0, ips.len());
|
let ip_index = thread_rng().gen_range(0..ips.len());
|
||||||
p.meta_mut().addr = ips[ip_index];
|
p.meta_mut().addr = ips[ip_index];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -697,7 +697,7 @@ mod tests {
|
||||||
let vote = from_slots(
|
let vote = from_slots(
|
||||||
vec![(i, 1)],
|
vec![(i, 1)],
|
||||||
VoteSource::Gossip,
|
VoteSource::Gossip,
|
||||||
&keypairs[rng.gen_range(0, 10)],
|
&keypairs[rng.gen_range(0..10)],
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
latest_unprocessed_votes.update_latest_vote(vote);
|
latest_unprocessed_votes.update_latest_vote(vote);
|
||||||
|
@ -712,7 +712,7 @@ mod tests {
|
||||||
let vote = from_slots(
|
let vote = from_slots(
|
||||||
vec![(i, 1)],
|
vec![(i, 1)],
|
||||||
VoteSource::Tpu,
|
VoteSource::Tpu,
|
||||||
&keypairs_tpu[rng.gen_range(0, 10)],
|
&keypairs_tpu[rng.gen_range(0..10)],
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
latest_unprocessed_votes_tpu.update_latest_vote(vote);
|
latest_unprocessed_votes_tpu.update_latest_vote(vote);
|
||||||
|
|
|
@ -4,7 +4,7 @@ use {
|
||||||
rand::{Rng, SeedableRng},
|
rand::{Rng, SeedableRng},
|
||||||
rand_chacha::ChaChaRng,
|
rand_chacha::ChaChaRng,
|
||||||
rayon::prelude::*,
|
rayon::prelude::*,
|
||||||
solana_sdk::signature::Keypair,
|
solana_sdk::{signature::Keypair, signer::keypair::keypair_from_seed},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct GenKeys {
|
pub struct GenKeys {
|
||||||
|
@ -28,13 +28,19 @@ impl GenKeys {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn gen_keypair(&mut self) -> Keypair {
|
pub fn gen_keypair(&mut self) -> Keypair {
|
||||||
Keypair::generate(&mut self.generator)
|
let mut seed = [0u8; Keypair::SECRET_KEY_LENGTH];
|
||||||
|
self.generator.fill(&mut seed[..]);
|
||||||
|
keypair_from_seed(&seed).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn gen_n_keypairs(&mut self, n: u64) -> Vec<Keypair> {
|
pub fn gen_n_keypairs(&mut self, n: u64) -> Vec<Keypair> {
|
||||||
self.gen_n_seeds(n)
|
self.gen_n_seeds(n)
|
||||||
.into_par_iter()
|
.into_par_iter()
|
||||||
.map(|seed| Keypair::generate(&mut ChaChaRng::from_seed(seed)))
|
.map(|seed| {
|
||||||
|
let mut keypair_seed = [0u8; Keypair::SECRET_KEY_LENGTH];
|
||||||
|
ChaChaRng::from_seed(seed).fill(&mut keypair_seed[..]);
|
||||||
|
keypair_from_seed(&keypair_seed).unwrap()
|
||||||
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ where
|
||||||
// the given timestamp to be made
|
// the given timestamp to be made
|
||||||
pub fn add_request(&mut self, request: T, now: u64) -> Nonce {
|
pub fn add_request(&mut self, request: T, now: u64) -> Nonce {
|
||||||
let num_expected_responses = request.num_expected_responses();
|
let num_expected_responses = request.num_expected_responses();
|
||||||
let nonce = thread_rng().gen_range(0, Nonce::MAX);
|
let nonce = thread_rng().gen_range(0..Nonce::MAX);
|
||||||
self.requests.put(
|
self.requests.put(
|
||||||
nonce,
|
nonce,
|
||||||
RequestStatus {
|
RequestStatus {
|
||||||
|
|
|
@ -38,7 +38,7 @@ impl WarmQuicCacheService {
|
||||||
let thread_hdl = Builder::new()
|
let thread_hdl = Builder::new()
|
||||||
.name("solWarmQuicSvc".to_string())
|
.name("solWarmQuicSvc".to_string())
|
||||||
.spawn(move || {
|
.spawn(move || {
|
||||||
let slot_jitter = thread_rng().gen_range(-CACHE_JITTER_SLOT, CACHE_JITTER_SLOT);
|
let slot_jitter = thread_rng().gen_range(-CACHE_JITTER_SLOT..CACHE_JITTER_SLOT);
|
||||||
let mut maybe_last_leader = None;
|
let mut maybe_last_leader = None;
|
||||||
while !exit.load(Ordering::Relaxed) {
|
while !exit.load(Ordering::Relaxed) {
|
||||||
let leader_pubkey = poh_recorder
|
let leader_pubkey = poh_recorder
|
||||||
|
|
|
@ -514,7 +514,7 @@ fn test_with_partitions(
|
||||||
for tower in towers.iter_mut() {
|
for tower in towers.iter_mut() {
|
||||||
let mut fork = tower.last_fork().clone();
|
let mut fork = tower.last_fork().clone();
|
||||||
if fork.id == 0 {
|
if fork.id == 0 {
|
||||||
fork.id = thread_rng().gen_range(1, 1 + num_partitions);
|
fork.id = thread_rng().gen_range(1..1 + num_partitions);
|
||||||
fork_tree.insert(fork.id, fork.clone());
|
fork_tree.insert(fork.id, fork.clone());
|
||||||
}
|
}
|
||||||
let vote = Vote::new(fork, time);
|
let vote = Vote::new(fork, time);
|
||||||
|
@ -526,7 +526,7 @@ fn test_with_partitions(
|
||||||
assert_eq!(tower.votes.len(), warmup);
|
assert_eq!(tower.votes.len(), warmup);
|
||||||
assert_eq!(tower.first_vote().unwrap().lockout, 1 << warmup);
|
assert_eq!(tower.first_vote().unwrap().lockout, 1 << warmup);
|
||||||
assert!(tower.first_vote().unwrap().lock_height() >= 1 << warmup);
|
assert!(tower.first_vote().unwrap().lock_height() >= 1 << warmup);
|
||||||
tower.parasite = parasite_rate > thread_rng().gen_range(0.0, 1.0);
|
tower.parasite = parasite_rate > thread_rng().gen_range(0.0..1.0);
|
||||||
}
|
}
|
||||||
let converge_map = calc_fork_map(&towers, &fork_tree);
|
let converge_map = calc_fork_map(&towers, &fork_tree);
|
||||||
assert_ne!(calc_tip_converged(&towers, &converge_map), len);
|
assert_ne!(calc_tip_converged(&towers, &converge_map), len);
|
||||||
|
@ -548,7 +548,7 @@ fn test_with_partitions(
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
for tower in towers.iter_mut() {
|
for tower in towers.iter_mut() {
|
||||||
if thread_rng().gen_range(0f64, 1.0f64) < fail_rate {
|
if thread_rng().gen_range(0f64..1.0f64) < fail_rate {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
tower.submit_vote(vote.clone(), &fork_tree, &converge_map, &scores);
|
tower.submit_vote(vote.clone(), &fork_tree, &converge_map, &scores);
|
||||||
|
|
|
@ -911,7 +911,7 @@ pub fn create_ticks(num_ticks: u64, hashes_per_tick: u64, mut hash: Hash) -> Vec
|
||||||
|
|
||||||
pub fn create_random_ticks(num_ticks: u64, max_hashes_per_tick: u64, mut hash: Hash) -> Vec<Entry> {
|
pub fn create_random_ticks(num_ticks: u64, max_hashes_per_tick: u64, mut hash: Hash) -> Vec<Entry> {
|
||||||
repeat_with(|| {
|
repeat_with(|| {
|
||||||
let hashes_per_tick = thread_rng().gen_range(1, max_hashes_per_tick);
|
let hashes_per_tick = thread_rng().gen_range(1..max_hashes_per_tick);
|
||||||
next_entry_mut(&mut hash, hashes_per_tick, vec![])
|
next_entry_mut(&mut hash, hashes_per_tick, vec![])
|
||||||
})
|
})
|
||||||
.take(num_ticks as usize)
|
.take(num_ticks as usize)
|
||||||
|
@ -1340,7 +1340,7 @@ mod tests {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
for _ in 0..100 {
|
for _ in 0..100 {
|
||||||
let mut time = Measure::start("ticks");
|
let mut time = Measure::start("ticks");
|
||||||
let num_ticks = thread_rng().gen_range(1, 100);
|
let num_ticks = thread_rng().gen_range(1..100);
|
||||||
info!("create {} ticks:", num_ticks);
|
info!("create {} ticks:", num_ticks);
|
||||||
let mut entries = create_random_ticks(num_ticks, 100, Hash::default());
|
let mut entries = create_random_ticks(num_ticks, 100, Hash::default());
|
||||||
time.stop();
|
time.stop();
|
||||||
|
@ -1348,7 +1348,7 @@ mod tests {
|
||||||
let mut modified = false;
|
let mut modified = false;
|
||||||
if thread_rng().gen_ratio(1, 2) {
|
if thread_rng().gen_ratio(1, 2) {
|
||||||
modified = true;
|
modified = true;
|
||||||
let modify_idx = thread_rng().gen_range(0, num_ticks) as usize;
|
let modify_idx = thread_rng().gen_range(0..num_ticks) as usize;
|
||||||
entries[modify_idx].hash = hash(&[1, 2, 3]);
|
entries[modify_idx].hash = hash(&[1, 2, 3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,11 +30,9 @@ block-buffer = { workspace = true }
|
||||||
byteorder = { workspace = true, features = ["i128"] }
|
byteorder = { workspace = true, features = ["i128"] }
|
||||||
either = { workspace = true, features = ["use_std"] }
|
either = { workspace = true, features = ["use_std"] }
|
||||||
generic-array = { workspace = true, features = ["serde", "more_lengths"] }
|
generic-array = { workspace = true, features = ["serde", "more_lengths"] }
|
||||||
getrandom = { workspace = true, features = ["dummy"] }
|
|
||||||
im = { workspace = true, features = ["rayon", "serde"] }
|
im = { workspace = true, features = ["rayon", "serde"] }
|
||||||
memmap2 = { workspace = true }
|
memmap2 = { workspace = true }
|
||||||
once_cell = { workspace = true, features = ["alloc", "race"] }
|
once_cell = { workspace = true, features = ["alloc", "race"] }
|
||||||
rand_core = { workspace = true, features = ["std"] }
|
|
||||||
subtle = { workspace = true }
|
subtle = { workspace = true }
|
||||||
|
|
||||||
[target.'cfg(any(unix, windows))'.dependencies]
|
[target.'cfg(any(unix, windows))'.dependencies]
|
||||||
|
|
|
@ -21,7 +21,7 @@ fn bench_find_old_labels(bencher: &mut Bencher) {
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
let mut crds = Crds::default();
|
let mut crds = Crds::default();
|
||||||
let now = CRDS_GOSSIP_PULL_CRDS_TIMEOUT_MS + CRDS_GOSSIP_PULL_CRDS_TIMEOUT_MS / 1000;
|
let now = CRDS_GOSSIP_PULL_CRDS_TIMEOUT_MS + CRDS_GOSSIP_PULL_CRDS_TIMEOUT_MS / 1000;
|
||||||
std::iter::repeat_with(|| (CrdsValue::new_rand(&mut rng, None), rng.gen_range(0, now)))
|
std::iter::repeat_with(|| (CrdsValue::new_rand(&mut rng, None), rng.gen_range(0..now)))
|
||||||
.take(50_000)
|
.take(50_000)
|
||||||
.for_each(|(v, ts)| assert!(crds.insert(v, ts, GossipRoute::LocalMessage).is_ok()));
|
.for_each(|(v, ts)| assert!(crds.insert(v, ts, GossipRoute::LocalMessage).is_ok()));
|
||||||
let stakes = HashMap::from([(Pubkey::new_unique(), 1u64)]);
|
let stakes = HashMap::from([(Pubkey::new_unique(), 1u64)]);
|
||||||
|
|
|
@ -11,15 +11,14 @@ use {
|
||||||
crds_gossip_pull::{CrdsFilter, CrdsGossipPull},
|
crds_gossip_pull::{CrdsFilter, CrdsGossipPull},
|
||||||
crds_value::CrdsValue,
|
crds_value::CrdsValue,
|
||||||
},
|
},
|
||||||
solana_sdk::hash,
|
solana_sdk::hash::Hash,
|
||||||
std::sync::RwLock,
|
std::sync::RwLock,
|
||||||
test::Bencher,
|
test::Bencher,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[bench]
|
#[bench]
|
||||||
fn bench_hash_as_u64(bencher: &mut Bencher) {
|
fn bench_hash_as_u64(bencher: &mut Bencher) {
|
||||||
let mut rng = thread_rng();
|
let hashes: Vec<_> = std::iter::repeat_with(Hash::new_unique)
|
||||||
let hashes: Vec<_> = std::iter::repeat_with(|| hash::new_rand(&mut rng))
|
|
||||||
.take(1000)
|
.take(1000)
|
||||||
.collect();
|
.collect();
|
||||||
bencher.iter(|| {
|
bencher.iter(|| {
|
||||||
|
|
|
@ -11,7 +11,7 @@ use {
|
||||||
};
|
};
|
||||||
|
|
||||||
fn make_weights<R: Rng>(rng: &mut R) -> Vec<u64> {
|
fn make_weights<R: Rng>(rng: &mut R) -> Vec<u64> {
|
||||||
repeat_with(|| rng.gen_range(1, 100)).take(1000).collect()
|
repeat_with(|| rng.gen_range(1..100)).take(1000).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[bench]
|
#[bench]
|
||||||
|
|
|
@ -198,7 +198,7 @@ impl PruneData {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
fn new_rand<R: Rng>(rng: &mut R, self_keypair: &Keypair, num_nodes: Option<usize>) -> Self {
|
fn new_rand<R: Rng>(rng: &mut R, self_keypair: &Keypair, num_nodes: Option<usize>) -> Self {
|
||||||
let wallclock = crds_value::new_rand_timestamp(rng);
|
let wallclock = crds_value::new_rand_timestamp(rng);
|
||||||
let num_nodes = num_nodes.unwrap_or_else(|| rng.gen_range(0, MAX_PRUNE_DATA_NODES + 1));
|
let num_nodes = num_nodes.unwrap_or_else(|| rng.gen_range(0..MAX_PRUNE_DATA_NODES + 1));
|
||||||
let prunes = std::iter::repeat_with(Pubkey::new_unique)
|
let prunes = std::iter::repeat_with(Pubkey::new_unique)
|
||||||
.take(num_nodes)
|
.take(num_nodes)
|
||||||
.collect();
|
.collect();
|
||||||
|
@ -3511,7 +3511,7 @@ mod tests {
|
||||||
let keypair = Keypair::new();
|
let keypair = Keypair::new();
|
||||||
let (slot, parent_slot, reference_tick, version) = (53084024, 53084023, 0, 0);
|
let (slot, parent_slot, reference_tick, version) = (53084024, 53084023, 0, 0);
|
||||||
let shredder = Shredder::new(slot, parent_slot, reference_tick, version).unwrap();
|
let shredder = Shredder::new(slot, parent_slot, reference_tick, version).unwrap();
|
||||||
let next_shred_index = rng.gen_range(0, 32_000);
|
let next_shred_index = rng.gen_range(0..32_000);
|
||||||
let shred = new_rand_shred(&mut rng, next_shred_index, &shredder, &leader);
|
let shred = new_rand_shred(&mut rng, next_shred_index, &shredder, &leader);
|
||||||
let other_payload = {
|
let other_payload = {
|
||||||
let other_shred = new_rand_shred(&mut rng, next_shred_index, &shredder, &leader);
|
let other_shred = new_rand_shred(&mut rng, next_shred_index, &shredder, &leader);
|
||||||
|
@ -3835,7 +3835,6 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_push_vote() {
|
fn test_push_vote() {
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
let keypair = Arc::new(Keypair::new());
|
let keypair = Arc::new(Keypair::new());
|
||||||
let contact_info = ContactInfo::new_localhost(&keypair.pubkey(), 0);
|
let contact_info = ContactInfo::new_localhost(&keypair.pubkey(), 0);
|
||||||
let cluster_info =
|
let cluster_info =
|
||||||
|
@ -3849,7 +3848,7 @@ mod tests {
|
||||||
// add a vote
|
// add a vote
|
||||||
let vote = Vote::new(
|
let vote = Vote::new(
|
||||||
vec![1, 3, 7], // slots
|
vec![1, 3, 7], // slots
|
||||||
solana_sdk::hash::new_rand(&mut rng),
|
Hash::new_unique(),
|
||||||
);
|
);
|
||||||
let ix = vote_instruction::vote(
|
let ix = vote_instruction::vote(
|
||||||
&Pubkey::new_unique(), // vote_pubkey
|
&Pubkey::new_unique(), // vote_pubkey
|
||||||
|
@ -3878,8 +3877,8 @@ mod tests {
|
||||||
assert_eq!(votes, vec![]);
|
assert_eq!(votes, vec![]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_vote_transaction<R: Rng>(rng: &mut R, slots: Vec<Slot>) -> Transaction {
|
fn new_vote_transaction(slots: Vec<Slot>) -> Transaction {
|
||||||
let vote = Vote::new(slots, solana_sdk::hash::new_rand(rng));
|
let vote = Vote::new(slots, Hash::new_unique());
|
||||||
let ix = vote_instruction::vote(
|
let ix = vote_instruction::vote(
|
||||||
&Pubkey::new_unique(), // vote_pubkey
|
&Pubkey::new_unique(), // vote_pubkey
|
||||||
&Pubkey::new_unique(), // authorized_voter_pubkey
|
&Pubkey::new_unique(), // authorized_voter_pubkey
|
||||||
|
@ -3907,7 +3906,6 @@ mod tests {
|
||||||
}
|
}
|
||||||
vote_slots.into_iter().collect()
|
vote_slots.into_iter().collect()
|
||||||
};
|
};
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
let keypair = Arc::new(Keypair::new());
|
let keypair = Arc::new(Keypair::new());
|
||||||
let contact_info = ContactInfo::new_localhost(&keypair.pubkey(), 0);
|
let contact_info = ContactInfo::new_localhost(&keypair.pubkey(), 0);
|
||||||
let cluster_info = ClusterInfo::new(contact_info, keypair, SocketAddrSpace::Unspecified);
|
let cluster_info = ClusterInfo::new(contact_info, keypair, SocketAddrSpace::Unspecified);
|
||||||
|
@ -3915,7 +3913,7 @@ mod tests {
|
||||||
for k in 0..MAX_LOCKOUT_HISTORY {
|
for k in 0..MAX_LOCKOUT_HISTORY {
|
||||||
let slot = k as Slot;
|
let slot = k as Slot;
|
||||||
tower.push(slot);
|
tower.push(slot);
|
||||||
let vote = new_vote_transaction(&mut rng, vec![slot]);
|
let vote = new_vote_transaction(vec![slot]);
|
||||||
cluster_info.push_vote(&tower, vote);
|
cluster_info.push_vote(&tower, vote);
|
||||||
}
|
}
|
||||||
let vote_slots = get_vote_slots(&cluster_info);
|
let vote_slots = get_vote_slots(&cluster_info);
|
||||||
|
@ -3927,7 +3925,7 @@ mod tests {
|
||||||
let slot = MAX_LOCKOUT_HISTORY as Slot;
|
let slot = MAX_LOCKOUT_HISTORY as Slot;
|
||||||
tower.push(slot);
|
tower.push(slot);
|
||||||
tower.remove(23);
|
tower.remove(23);
|
||||||
let vote = new_vote_transaction(&mut rng, vec![slot]);
|
let vote = new_vote_transaction(vec![slot]);
|
||||||
// New versioned-crds-value should have wallclock later than existing
|
// New versioned-crds-value should have wallclock later than existing
|
||||||
// entries, otherwise might not get inserted into the table.
|
// entries, otherwise might not get inserted into the table.
|
||||||
sleep(Duration::from_millis(5));
|
sleep(Duration::from_millis(5));
|
||||||
|
@ -3944,7 +3942,7 @@ mod tests {
|
||||||
tower.push(slot);
|
tower.push(slot);
|
||||||
tower.remove(17);
|
tower.remove(17);
|
||||||
tower.remove(5);
|
tower.remove(5);
|
||||||
let vote = new_vote_transaction(&mut rng, vec![slot]);
|
let vote = new_vote_transaction(vec![slot]);
|
||||||
cluster_info.push_vote(&tower, vote);
|
cluster_info.push_vote(&tower, vote);
|
||||||
let vote_slots = get_vote_slots(&cluster_info);
|
let vote_slots = get_vote_slots(&cluster_info);
|
||||||
assert_eq!(vote_slots.len(), MAX_LOCKOUT_HISTORY);
|
assert_eq!(vote_slots.len(), MAX_LOCKOUT_HISTORY);
|
||||||
|
@ -4349,7 +4347,7 @@ mod tests {
|
||||||
);
|
);
|
||||||
//random should be hard to compress
|
//random should be hard to compress
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let range: Vec<Slot> = repeat_with(|| rng.gen_range(1, 32))
|
let range: Vec<Slot> = repeat_with(|| rng.gen_range(1..32))
|
||||||
.scan(0, |slot, step| {
|
.scan(0, |slot, step| {
|
||||||
*slot += step;
|
*slot += step;
|
||||||
Some(*slot)
|
Some(*slot)
|
||||||
|
|
|
@ -611,7 +611,7 @@ mod tests {
|
||||||
fn new_rand_port<R: Rng>(rng: &mut R) -> u16 {
|
fn new_rand_port<R: Rng>(rng: &mut R) -> u16 {
|
||||||
let port = rng.gen::<u16>();
|
let port = rng.gen::<u16>();
|
||||||
let bits = u16::BITS - port.leading_zeros();
|
let bits = u16::BITS - port.leading_zeros();
|
||||||
let shift = rng.gen_range(0u32, bits + 1u32);
|
let shift = rng.gen_range(0u32..bits + 1u32);
|
||||||
port.checked_shr(shift).unwrap_or_default()
|
port.checked_shr(shift).unwrap_or_default()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -679,8 +679,8 @@ mod tests {
|
||||||
.iter()
|
.iter()
|
||||||
.map(|&key| SocketEntry {
|
.map(|&key| SocketEntry {
|
||||||
key,
|
key,
|
||||||
index: rng.gen_range(0u8, addrs.len() as u8),
|
index: rng.gen_range(0u8..addrs.len() as u8),
|
||||||
offset: rng.gen_range(0u16, u16::MAX / 64),
|
offset: rng.gen_range(0u16..u16::MAX / 64),
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
assert_matches!(
|
assert_matches!(
|
||||||
|
@ -693,8 +693,8 @@ mod tests {
|
||||||
.iter()
|
.iter()
|
||||||
.map(|&key| SocketEntry {
|
.map(|&key| SocketEntry {
|
||||||
key,
|
key,
|
||||||
index: rng.gen_range(0u8, addrs.len() as u8),
|
index: rng.gen_range(0u8..addrs.len() as u8),
|
||||||
offset: rng.gen_range(0u16, u16::MAX / 256),
|
offset: rng.gen_range(0u16..u16::MAX / 256),
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
assert_matches!(sanitize_entries(&addrs, &sockets), Ok(()));
|
assert_matches!(sanitize_entries(&addrs, &sockets), Ok(()));
|
||||||
|
@ -721,7 +721,7 @@ mod tests {
|
||||||
for _ in 0..1 << 14 {
|
for _ in 0..1 << 14 {
|
||||||
let addr = addrs.choose(&mut rng).unwrap();
|
let addr = addrs.choose(&mut rng).unwrap();
|
||||||
let socket = SocketAddr::new(*addr, new_rand_port(&mut rng));
|
let socket = SocketAddr::new(*addr, new_rand_port(&mut rng));
|
||||||
let key = rng.gen_range(KEYS.start, KEYS.end);
|
let key = rng.gen_range(KEYS.start..KEYS.end);
|
||||||
if sanitize_socket(&socket).is_ok() {
|
if sanitize_socket(&socket).is_ok() {
|
||||||
sockets.insert(key, socket);
|
sockets.insert(key, socket);
|
||||||
assert_matches!(node.set_socket(key, socket), Ok(()));
|
assert_matches!(node.set_socket(key, socket), Ok(()));
|
||||||
|
|
|
@ -1091,7 +1091,7 @@ mod tests {
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
let mut num_inserts = 0;
|
let mut num_inserts = 0;
|
||||||
for _ in 0..4096 {
|
for _ in 0..4096 {
|
||||||
let keypair = &keypairs[rng.gen_range(0, keypairs.len())];
|
let keypair = &keypairs[rng.gen_range(0..keypairs.len())];
|
||||||
let value = CrdsValue::new_rand(&mut rng, Some(keypair));
|
let value = CrdsValue::new_rand(&mut rng, Some(keypair));
|
||||||
let local_timestamp = new_rand_timestamp(&mut rng);
|
let local_timestamp = new_rand_timestamp(&mut rng);
|
||||||
if let Ok(()) = crds.insert(value, local_timestamp, GossipRoute::LocalMessage) {
|
if let Ok(()) = crds.insert(value, local_timestamp, GossipRoute::LocalMessage) {
|
||||||
|
@ -1108,7 +1108,7 @@ mod tests {
|
||||||
check_crds_shards(&crds);
|
check_crds_shards(&crds);
|
||||||
// Remove values one by one and assert that shards stay valid.
|
// Remove values one by one and assert that shards stay valid.
|
||||||
while !crds.table.is_empty() {
|
while !crds.table.is_empty() {
|
||||||
let index = rng.gen_range(0, crds.table.len());
|
let index = rng.gen_range(0..crds.table.len());
|
||||||
let key = crds.table.get_index(index).unwrap().0.clone();
|
let key = crds.table.get_index(index).unwrap().0.clone();
|
||||||
crds.remove(&key, /*now=*/ 0);
|
crds.remove(&key, /*now=*/ 0);
|
||||||
check_crds_shards(&crds);
|
check_crds_shards(&crds);
|
||||||
|
@ -1125,9 +1125,9 @@ mod tests {
|
||||||
) {
|
) {
|
||||||
let size = crds.table.len();
|
let size = crds.table.len();
|
||||||
let since = if size == 0 || rng.gen() {
|
let since = if size == 0 || rng.gen() {
|
||||||
rng.gen_range(0, crds.cursor.0 + 1)
|
rng.gen_range(0..crds.cursor.0 + 1)
|
||||||
} else {
|
} else {
|
||||||
crds.table[rng.gen_range(0, size)].ordinal
|
crds.table[rng.gen_range(0..size)].ordinal
|
||||||
};
|
};
|
||||||
let num_epoch_slots = crds
|
let num_epoch_slots = crds
|
||||||
.table
|
.table
|
||||||
|
@ -1245,7 +1245,7 @@ mod tests {
|
||||||
let mut crds = Crds::default();
|
let mut crds = Crds::default();
|
||||||
let mut num_inserts = 0;
|
let mut num_inserts = 0;
|
||||||
for k in 0..4096 {
|
for k in 0..4096 {
|
||||||
let keypair = &keypairs[rng.gen_range(0, keypairs.len())];
|
let keypair = &keypairs[rng.gen_range(0..keypairs.len())];
|
||||||
let value = CrdsValue::new_rand(&mut rng, Some(keypair));
|
let value = CrdsValue::new_rand(&mut rng, Some(keypair));
|
||||||
let local_timestamp = new_rand_timestamp(&mut rng);
|
let local_timestamp = new_rand_timestamp(&mut rng);
|
||||||
if let Ok(()) = crds.insert(value, local_timestamp, GossipRoute::LocalMessage) {
|
if let Ok(()) = crds.insert(value, local_timestamp, GossipRoute::LocalMessage) {
|
||||||
|
@ -1268,7 +1268,7 @@ mod tests {
|
||||||
assert!(num_epoch_slots > 100, "num epoch slots: {num_epoch_slots}");
|
assert!(num_epoch_slots > 100, "num epoch slots: {num_epoch_slots}");
|
||||||
// Remove values one by one and assert that nodes indices stay valid.
|
// Remove values one by one and assert that nodes indices stay valid.
|
||||||
while !crds.table.is_empty() {
|
while !crds.table.is_empty() {
|
||||||
let index = rng.gen_range(0, crds.table.len());
|
let index = rng.gen_range(0..crds.table.len());
|
||||||
let key = crds.table.get_index(index).unwrap().0.clone();
|
let key = crds.table.get_index(index).unwrap().0.clone();
|
||||||
crds.remove(&key, /*now=*/ 0);
|
crds.remove(&key, /*now=*/ 0);
|
||||||
if crds.table.len() % 16 == 0 {
|
if crds.table.len() % 16 == 0 {
|
||||||
|
@ -1295,7 +1295,7 @@ mod tests {
|
||||||
let keypairs: Vec<_> = repeat_with(Keypair::new).take(128).collect();
|
let keypairs: Vec<_> = repeat_with(Keypair::new).take(128).collect();
|
||||||
let mut crds = Crds::default();
|
let mut crds = Crds::default();
|
||||||
for k in 0..4096 {
|
for k in 0..4096 {
|
||||||
let keypair = &keypairs[rng.gen_range(0, keypairs.len())];
|
let keypair = &keypairs[rng.gen_range(0..keypairs.len())];
|
||||||
let value = CrdsValue::new_rand(&mut rng, Some(keypair));
|
let value = CrdsValue::new_rand(&mut rng, Some(keypair));
|
||||||
let local_timestamp = new_rand_timestamp(&mut rng);
|
let local_timestamp = new_rand_timestamp(&mut rng);
|
||||||
let _ = crds.insert(value, local_timestamp, GossipRoute::LocalMessage);
|
let _ = crds.insert(value, local_timestamp, GossipRoute::LocalMessage);
|
||||||
|
@ -1307,7 +1307,7 @@ mod tests {
|
||||||
assert!(crds.records.len() <= keypairs.len());
|
assert!(crds.records.len() <= keypairs.len());
|
||||||
// Remove values one by one and assert that records stay valid.
|
// Remove values one by one and assert that records stay valid.
|
||||||
while !crds.table.is_empty() {
|
while !crds.table.is_empty() {
|
||||||
let index = rng.gen_range(0, crds.table.len());
|
let index = rng.gen_range(0..crds.table.len());
|
||||||
let key = crds.table.get_index(index).unwrap().0.clone();
|
let key = crds.table.get_index(index).unwrap().0.clone();
|
||||||
crds.remove(&key, /*now=*/ 0);
|
crds.remove(&key, /*now=*/ 0);
|
||||||
if crds.table.len() % 64 == 0 {
|
if crds.table.len() % 64 == 0 {
|
||||||
|
@ -1393,11 +1393,11 @@ mod tests {
|
||||||
let keypairs: Vec<_> = repeat_with(Keypair::new).take(64).collect();
|
let keypairs: Vec<_> = repeat_with(Keypair::new).take(64).collect();
|
||||||
let stakes = keypairs
|
let stakes = keypairs
|
||||||
.iter()
|
.iter()
|
||||||
.map(|k| (k.pubkey(), rng.gen_range(0, 1000)))
|
.map(|k| (k.pubkey(), rng.gen_range(0..1000)))
|
||||||
.collect();
|
.collect();
|
||||||
let mut crds = Crds::default();
|
let mut crds = Crds::default();
|
||||||
for _ in 0..2048 {
|
for _ in 0..2048 {
|
||||||
let keypair = &keypairs[rng.gen_range(0, keypairs.len())];
|
let keypair = &keypairs[rng.gen_range(0..keypairs.len())];
|
||||||
let value = CrdsValue::new_rand(&mut rng, Some(keypair));
|
let value = CrdsValue::new_rand(&mut rng, Some(keypair));
|
||||||
let local_timestamp = new_rand_timestamp(&mut rng);
|
let local_timestamp = new_rand_timestamp(&mut rng);
|
||||||
let _ = crds.insert(value, local_timestamp, GossipRoute::LocalMessage);
|
let _ = crds.insert(value, local_timestamp, GossipRoute::LocalMessage);
|
||||||
|
|
|
@ -89,7 +89,7 @@ impl CrdsFilter {
|
||||||
let max_items = Self::max_items(max_bits, FALSE_RATE, KEYS);
|
let max_items = Self::max_items(max_bits, FALSE_RATE, KEYS);
|
||||||
let mask_bits = Self::mask_bits(num_items as f64, max_items);
|
let mask_bits = Self::mask_bits(num_items as f64, max_items);
|
||||||
let filter = Bloom::random(max_items as usize, FALSE_RATE, max_bits as usize);
|
let filter = Bloom::random(max_items as usize, FALSE_RATE, max_bits as usize);
|
||||||
let seed: u64 = rand::thread_rng().gen_range(0, 2u64.pow(mask_bits));
|
let seed: u64 = rand::thread_rng().gen_range(0..2u64.pow(mask_bits));
|
||||||
let mask = Self::compute_mask(seed, mask_bits);
|
let mask = Self::compute_mask(seed, mask_bits);
|
||||||
CrdsFilter {
|
CrdsFilter {
|
||||||
filter,
|
filter,
|
||||||
|
@ -272,7 +272,7 @@ impl CrdsGossipPull {
|
||||||
let mut filters = self.build_crds_filters(thread_pool, crds, bloom_size);
|
let mut filters = self.build_crds_filters(thread_pool, crds, bloom_size);
|
||||||
if filters.len() > MAX_NUM_PULL_REQUESTS {
|
if filters.len() > MAX_NUM_PULL_REQUESTS {
|
||||||
for i in 0..MAX_NUM_PULL_REQUESTS {
|
for i in 0..MAX_NUM_PULL_REQUESTS {
|
||||||
let j = rng.gen_range(i, filters.len());
|
let j = rng.gen_range(i..filters.len());
|
||||||
filters.swap(i, j);
|
filters.swap(i, j);
|
||||||
}
|
}
|
||||||
filters.truncate(MAX_NUM_PULL_REQUESTS);
|
filters.truncate(MAX_NUM_PULL_REQUESTS);
|
||||||
|
@ -456,7 +456,7 @@ impl CrdsGossipPull {
|
||||||
stats: &GossipStats,
|
stats: &GossipStats,
|
||||||
) -> Vec<Vec<CrdsValue>> {
|
) -> Vec<Vec<CrdsValue>> {
|
||||||
let msg_timeout = CRDS_GOSSIP_PULL_CRDS_TIMEOUT_MS;
|
let msg_timeout = CRDS_GOSSIP_PULL_CRDS_TIMEOUT_MS;
|
||||||
let jitter = rand::thread_rng().gen_range(0, msg_timeout / 4);
|
let jitter = rand::thread_rng().gen_range(0..msg_timeout / 4);
|
||||||
//skip filters from callers that are too old
|
//skip filters from callers that are too old
|
||||||
let caller_wallclock_window =
|
let caller_wallclock_window =
|
||||||
now.saturating_sub(msg_timeout)..now.saturating_add(msg_timeout);
|
now.saturating_sub(msg_timeout)..now.saturating_add(msg_timeout);
|
||||||
|
@ -620,13 +620,14 @@ pub(crate) mod tests {
|
||||||
crds_value::{CrdsData, Vote},
|
crds_value::{CrdsData, Vote},
|
||||||
},
|
},
|
||||||
itertools::Itertools,
|
itertools::Itertools,
|
||||||
rand::{seq::SliceRandom, thread_rng, SeedableRng},
|
rand::{seq::SliceRandom, SeedableRng},
|
||||||
rand_chacha::ChaChaRng,
|
rand_chacha::ChaChaRng,
|
||||||
rayon::ThreadPoolBuilder,
|
rayon::ThreadPoolBuilder,
|
||||||
solana_perf::test_tx::new_test_vote_tx,
|
solana_perf::test_tx::new_test_vote_tx,
|
||||||
solana_sdk::{
|
solana_sdk::{
|
||||||
hash::{hash, HASH_BYTES},
|
hash::{hash, HASH_BYTES},
|
||||||
packet::PACKET_DATA_SIZE,
|
packet::PACKET_DATA_SIZE,
|
||||||
|
signer::keypair::keypair_from_seed,
|
||||||
timing::timestamp,
|
timing::timestamp,
|
||||||
},
|
},
|
||||||
std::time::Instant,
|
std::time::Instant,
|
||||||
|
@ -653,9 +654,8 @@ pub(crate) mod tests {
|
||||||
}
|
}
|
||||||
out
|
out
|
||||||
}
|
}
|
||||||
let mut rng = thread_rng();
|
|
||||||
for _ in 0..100 {
|
for _ in 0..100 {
|
||||||
let hash = solana_sdk::hash::new_rand(&mut rng);
|
let hash = Hash::new_unique();
|
||||||
assert_eq!(CrdsFilter::hash_as_u64(&hash), hash_as_u64_bitops(&hash));
|
assert_eq!(CrdsFilter::hash_as_u64(&hash), hash_as_u64_bitops(&hash));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -665,21 +665,17 @@ pub(crate) mod tests {
|
||||||
let filter = CrdsFilter::default();
|
let filter = CrdsFilter::default();
|
||||||
let mask = CrdsFilter::compute_mask(0, filter.mask_bits);
|
let mask = CrdsFilter::compute_mask(0, filter.mask_bits);
|
||||||
assert_eq!(filter.mask, mask);
|
assert_eq!(filter.mask, mask);
|
||||||
let mut rng = thread_rng();
|
|
||||||
for _ in 0..10 {
|
for _ in 0..10 {
|
||||||
let hash = solana_sdk::hash::new_rand(&mut rng);
|
let hash = Hash::new_unique();
|
||||||
assert!(filter.test_mask(&hash));
|
assert!(filter.test_mask(&hash));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_crds_filter_set_add() {
|
fn test_crds_filter_set_add() {
|
||||||
let mut rng = thread_rng();
|
|
||||||
let crds_filter_set =
|
let crds_filter_set =
|
||||||
CrdsFilterSet::new(/*num_items=*/ 9672788, /*max_bytes=*/ 8196);
|
CrdsFilterSet::new(/*num_items=*/ 9672788, /*max_bytes=*/ 8196);
|
||||||
let hash_values: Vec<_> = repeat_with(|| solana_sdk::hash::new_rand(&mut rng))
|
let hash_values: Vec<_> = repeat_with(Hash::new_unique).take(1024).collect();
|
||||||
.take(1024)
|
|
||||||
.collect();
|
|
||||||
for hash_value in &hash_values {
|
for hash_value in &hash_values {
|
||||||
crds_filter_set.add(*hash_value);
|
crds_filter_set.add(*hash_value);
|
||||||
}
|
}
|
||||||
|
@ -727,7 +723,11 @@ pub(crate) mod tests {
|
||||||
let thread_pool = ThreadPoolBuilder::new().build().unwrap();
|
let thread_pool = ThreadPoolBuilder::new().build().unwrap();
|
||||||
let crds_gossip_pull = CrdsGossipPull::default();
|
let crds_gossip_pull = CrdsGossipPull::default();
|
||||||
let mut crds = Crds::default();
|
let mut crds = Crds::default();
|
||||||
let keypairs: Vec<_> = repeat_with(|| Keypair::generate(&mut rng))
|
let keypairs: Vec<_> = repeat_with(|| {
|
||||||
|
let mut seed = [0u8; Keypair::SECRET_KEY_LENGTH];
|
||||||
|
rng.fill(&mut seed[..]);
|
||||||
|
keypair_from_seed(&seed).unwrap()
|
||||||
|
})
|
||||||
.take(10_000)
|
.take(10_000)
|
||||||
.collect();
|
.collect();
|
||||||
let mut num_inserts = 0;
|
let mut num_inserts = 0;
|
||||||
|
|
|
@ -194,7 +194,7 @@ mod test {
|
||||||
shards.check(&values);
|
shards.check(&values);
|
||||||
// Remove some of the values.
|
// Remove some of the values.
|
||||||
for _ in 0..512 {
|
for _ in 0..512 {
|
||||||
let index = rng.gen_range(0, values.len());
|
let index = rng.gen_range(0..values.len());
|
||||||
let value = values.swap_remove(index);
|
let value = values.swap_remove(index);
|
||||||
assert!(shards.remove(index, &value));
|
assert!(shards.remove(index, &value));
|
||||||
if index < values.len() {
|
if index < values.len() {
|
||||||
|
@ -223,7 +223,7 @@ mod test {
|
||||||
}
|
}
|
||||||
// Remove everything.
|
// Remove everything.
|
||||||
while !values.is_empty() {
|
while !values.is_empty() {
|
||||||
let index = rng.gen_range(0, values.len());
|
let index = rng.gen_range(0..values.len());
|
||||||
let value = values.swap_remove(index);
|
let value = values.swap_remove(index);
|
||||||
assert!(shards.remove(index, &value));
|
assert!(shards.remove(index, &value));
|
||||||
if index < values.len() {
|
if index < values.len() {
|
||||||
|
|
|
@ -139,13 +139,13 @@ impl Sanitize for CrdsData {
|
||||||
/// Random timestamp for tests and benchmarks.
|
/// Random timestamp for tests and benchmarks.
|
||||||
pub(crate) fn new_rand_timestamp<R: Rng>(rng: &mut R) -> u64 {
|
pub(crate) fn new_rand_timestamp<R: Rng>(rng: &mut R) -> u64 {
|
||||||
const DELAY: u64 = 10 * 60 * 1000; // 10 minutes
|
const DELAY: u64 = 10 * 60 * 1000; // 10 minutes
|
||||||
timestamp() - DELAY + rng.gen_range(0, 2 * DELAY)
|
timestamp() - DELAY + rng.gen_range(0..2 * DELAY)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CrdsData {
|
impl CrdsData {
|
||||||
/// New random CrdsData for tests and benchmarks.
|
/// New random CrdsData for tests and benchmarks.
|
||||||
fn new_rand<R: Rng>(rng: &mut R, pubkey: Option<Pubkey>) -> CrdsData {
|
fn new_rand<R: Rng>(rng: &mut R, pubkey: Option<Pubkey>) -> CrdsData {
|
||||||
let kind = rng.gen_range(0, 7);
|
let kind = rng.gen_range(0..7);
|
||||||
// TODO: Implement other kinds of CrdsData here.
|
// TODO: Implement other kinds of CrdsData here.
|
||||||
// TODO: Assign ranges to each arm proportional to their frequency in
|
// TODO: Assign ranges to each arm proportional to their frequency in
|
||||||
// the mainnet crds table.
|
// the mainnet crds table.
|
||||||
|
@ -156,9 +156,9 @@ impl CrdsData {
|
||||||
2 => CrdsData::LegacySnapshotHashes(LegacySnapshotHashes::new_rand(rng, pubkey)),
|
2 => CrdsData::LegacySnapshotHashes(LegacySnapshotHashes::new_rand(rng, pubkey)),
|
||||||
3 => CrdsData::AccountsHashes(AccountsHashes::new_rand(rng, pubkey)),
|
3 => CrdsData::AccountsHashes(AccountsHashes::new_rand(rng, pubkey)),
|
||||||
4 => CrdsData::Version(Version::new_rand(rng, pubkey)),
|
4 => CrdsData::Version(Version::new_rand(rng, pubkey)),
|
||||||
5 => CrdsData::Vote(rng.gen_range(0, MAX_VOTES), Vote::new_rand(rng, pubkey)),
|
5 => CrdsData::Vote(rng.gen_range(0..MAX_VOTES), Vote::new_rand(rng, pubkey)),
|
||||||
_ => CrdsData::EpochSlots(
|
_ => CrdsData::EpochSlots(
|
||||||
rng.gen_range(0, MAX_EPOCH_SLOTS),
|
rng.gen_range(0..MAX_EPOCH_SLOTS),
|
||||||
EpochSlots::new_rand(rng, pubkey),
|
EpochSlots::new_rand(rng, pubkey),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
@ -195,10 +195,10 @@ impl AccountsHashes {
|
||||||
|
|
||||||
/// New random AccountsHashes for tests and benchmarks.
|
/// New random AccountsHashes for tests and benchmarks.
|
||||||
pub(crate) fn new_rand<R: Rng>(rng: &mut R, pubkey: Option<Pubkey>) -> Self {
|
pub(crate) fn new_rand<R: Rng>(rng: &mut R, pubkey: Option<Pubkey>) -> Self {
|
||||||
let num_hashes = rng.gen_range(0, MAX_LEGACY_SNAPSHOT_HASHES) + 1;
|
let num_hashes = rng.gen_range(0..MAX_LEGACY_SNAPSHOT_HASHES) + 1;
|
||||||
let hashes = std::iter::repeat_with(|| {
|
let hashes = std::iter::repeat_with(|| {
|
||||||
let slot = 47825632 + rng.gen_range(0, 512);
|
let slot = 47825632 + rng.gen_range(0..512);
|
||||||
let hash = solana_sdk::hash::new_rand(rng);
|
let hash = Hash::new_unique();
|
||||||
(slot, hash)
|
(slot, hash)
|
||||||
})
|
})
|
||||||
.take(num_hashes)
|
.take(num_hashes)
|
||||||
|
@ -801,7 +801,7 @@ mod test {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let vote = vote_state::Vote::new(
|
let vote = vote_state::Vote::new(
|
||||||
vec![1, 3, 7], // slots
|
vec![1, 3, 7], // slots
|
||||||
solana_sdk::hash::new_rand(&mut rng),
|
Hash::new_unique(),
|
||||||
);
|
);
|
||||||
let ix = vote_instruction::vote(
|
let ix = vote_instruction::vote(
|
||||||
&Pubkey::new_unique(), // vote_pubkey
|
&Pubkey::new_unique(), // vote_pubkey
|
||||||
|
@ -878,7 +878,7 @@ mod test {
|
||||||
let mut rng = ChaChaRng::from_seed(seed);
|
let mut rng = ChaChaRng::from_seed(seed);
|
||||||
let keys: Vec<_> = repeat_with(Keypair::new).take(16).collect();
|
let keys: Vec<_> = repeat_with(Keypair::new).take(16).collect();
|
||||||
let values: Vec<_> = repeat_with(|| {
|
let values: Vec<_> = repeat_with(|| {
|
||||||
let index = rng.gen_range(0, keys.len());
|
let index = rng.gen_range(0..keys.len());
|
||||||
CrdsValue::new_rand(&mut rng, Some(&keys[index]))
|
CrdsValue::new_rand(&mut rng, Some(&keys[index]))
|
||||||
})
|
})
|
||||||
.take(1 << 12)
|
.take(1 << 12)
|
||||||
|
|
|
@ -262,7 +262,7 @@ pub(crate) mod tests {
|
||||||
solana_entry::entry::Entry,
|
solana_entry::entry::Entry,
|
||||||
solana_ledger::shred::{ProcessShredsStats, ReedSolomonCache, Shredder},
|
solana_ledger::shred::{ProcessShredsStats, ReedSolomonCache, Shredder},
|
||||||
solana_sdk::{
|
solana_sdk::{
|
||||||
hash,
|
hash::Hash,
|
||||||
signature::{Keypair, Signer},
|
signature::{Keypair, Signer},
|
||||||
system_transaction,
|
system_transaction,
|
||||||
},
|
},
|
||||||
|
@ -302,10 +302,10 @@ pub(crate) mod tests {
|
||||||
&Keypair::new(), // from
|
&Keypair::new(), // from
|
||||||
&Pubkey::new_unique(), // to
|
&Pubkey::new_unique(), // to
|
||||||
rng.gen(), // lamports
|
rng.gen(), // lamports
|
||||||
hash::new_rand(rng), // recent blockhash
|
Hash::new_unique(), // recent blockhash
|
||||||
);
|
);
|
||||||
Entry::new(
|
Entry::new(
|
||||||
&hash::new_rand(rng), // prev_hash
|
&Hash::new_unique(), // prev_hash
|
||||||
1, // num_hashes,
|
1, // num_hashes,
|
||||||
vec![tx], // transactions
|
vec![tx], // transactions
|
||||||
)
|
)
|
||||||
|
@ -331,7 +331,7 @@ pub(crate) mod tests {
|
||||||
let leader = Arc::new(Keypair::new());
|
let leader = Arc::new(Keypair::new());
|
||||||
let (slot, parent_slot, reference_tick, version) = (53084024, 53084023, 0, 0);
|
let (slot, parent_slot, reference_tick, version) = (53084024, 53084023, 0, 0);
|
||||||
let shredder = Shredder::new(slot, parent_slot, reference_tick, version).unwrap();
|
let shredder = Shredder::new(slot, parent_slot, reference_tick, version).unwrap();
|
||||||
let next_shred_index = rng.gen_range(0, 32_000);
|
let next_shred_index = rng.gen_range(0..32_000);
|
||||||
let shred1 = new_rand_shred(&mut rng, next_shred_index, &shredder, &leader);
|
let shred1 = new_rand_shred(&mut rng, next_shred_index, &shredder, &leader);
|
||||||
let shred2 = new_rand_shred(&mut rng, next_shred_index, &shredder, &leader);
|
let shred2 = new_rand_shred(&mut rng, next_shred_index, &shredder, &leader);
|
||||||
let leader_schedule = |s| {
|
let leader_schedule = |s| {
|
||||||
|
|
|
@ -326,8 +326,8 @@ impl EpochSlots {
|
||||||
let now = crds_value::new_rand_timestamp(rng);
|
let now = crds_value::new_rand_timestamp(rng);
|
||||||
let pubkey = pubkey.unwrap_or_else(solana_sdk::pubkey::new_rand);
|
let pubkey = pubkey.unwrap_or_else(solana_sdk::pubkey::new_rand);
|
||||||
let mut epoch_slots = Self::new(pubkey, now);
|
let mut epoch_slots = Self::new(pubkey, now);
|
||||||
let num_slots = rng.gen_range(0, 20);
|
let num_slots = rng.gen_range(0..20);
|
||||||
let slots: Vec<_> = std::iter::repeat_with(|| 47825632 + rng.gen_range(0, 512))
|
let slots: Vec<_> = std::iter::repeat_with(|| 47825632 + rng.gen_range(0..512))
|
||||||
.take(num_slots)
|
.take(num_slots)
|
||||||
.collect();
|
.collect();
|
||||||
epoch_slots.add(&slots);
|
epoch_slots.add(&slots);
|
||||||
|
@ -486,7 +486,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_rand_slots<R: Rng>(rng: &mut R) -> impl Iterator<Item = Slot> + '_ {
|
fn make_rand_slots<R: Rng>(rng: &mut R) -> impl Iterator<Item = Slot> + '_ {
|
||||||
repeat_with(|| rng.gen_range(1, 5)).scan(0, |slot, step| {
|
repeat_with(|| rng.gen_range(1..5)).scan(0, |slot, step| {
|
||||||
*slot += step;
|
*slot += step;
|
||||||
Some(*slot)
|
Some(*slot)
|
||||||
})
|
})
|
||||||
|
|
|
@ -203,7 +203,7 @@ pub fn get_client(
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|node| node.valid_client_facing_addr(protocol, socket_addr_space))
|
.filter_map(|node| node.valid_client_facing_addr(protocol, socket_addr_space))
|
||||||
.collect();
|
.collect();
|
||||||
let select = thread_rng().gen_range(0, nodes.len());
|
let select = thread_rng().gen_range(0..nodes.len());
|
||||||
let (rpc, tpu) = nodes[select];
|
let (rpc, tpu) = nodes[select];
|
||||||
ThinClient::new(rpc, tpu, connection_cache)
|
ThinClient::new(rpc, tpu, connection_cache)
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,10 +159,10 @@ impl LegacyContactInfo {
|
||||||
/// New random LegacyContactInfo for tests and simulations.
|
/// New random LegacyContactInfo for tests and simulations.
|
||||||
pub fn new_rand<R: rand::Rng>(rng: &mut R, pubkey: Option<Pubkey>) -> Self {
|
pub fn new_rand<R: rand::Rng>(rng: &mut R, pubkey: Option<Pubkey>) -> Self {
|
||||||
let delay = 10 * 60 * 1000; // 10 minutes
|
let delay = 10 * 60 * 1000; // 10 minutes
|
||||||
let now = timestamp() - delay + rng.gen_range(0, 2 * delay);
|
let now = timestamp() - delay + rng.gen_range(0..2 * delay);
|
||||||
let pubkey = pubkey.unwrap_or_else(solana_sdk::pubkey::new_rand);
|
let pubkey = pubkey.unwrap_or_else(solana_sdk::pubkey::new_rand);
|
||||||
let mut node = LegacyContactInfo::new_localhost(&pubkey, now);
|
let mut node = LegacyContactInfo::new_localhost(&pubkey, now);
|
||||||
node.gossip.set_port(rng.gen_range(1024, u16::MAX));
|
node.gossip.set_port(rng.gen_range(1024..u16::MAX));
|
||||||
node
|
node
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use {
|
use {
|
||||||
bincode::{serialize, Error},
|
bincode::{serialize, Error},
|
||||||
lru::LruCache,
|
lru::LruCache,
|
||||||
rand::{AsByteSliceMut, CryptoRng, Rng},
|
rand::{CryptoRng, Fill, Rng},
|
||||||
serde::Serialize,
|
serde::Serialize,
|
||||||
solana_sdk::{
|
solana_sdk::{
|
||||||
hash::{self, Hash},
|
hash::{self, Hash},
|
||||||
|
@ -64,7 +64,7 @@ impl<T: Serialize> Ping<T> {
|
||||||
|
|
||||||
impl<T> Ping<T>
|
impl<T> Ping<T>
|
||||||
where
|
where
|
||||||
T: Serialize + AsByteSliceMut + Default,
|
T: Serialize + Fill + Default,
|
||||||
{
|
{
|
||||||
pub fn new_rand<R>(rng: &mut R, keypair: &Keypair) -> Result<Self, Error>
|
pub fn new_rand<R>(rng: &mut R, keypair: &Keypair) -> Result<Self, Error>
|
||||||
where
|
where
|
||||||
|
@ -296,8 +296,8 @@ mod tests {
|
||||||
.take(8)
|
.take(8)
|
||||||
.collect();
|
.collect();
|
||||||
let remote_nodes: Vec<(&Keypair, SocketAddr)> = repeat_with(|| {
|
let remote_nodes: Vec<(&Keypair, SocketAddr)> = repeat_with(|| {
|
||||||
let keypair = &keypairs[rng.gen_range(0, keypairs.len())];
|
let keypair = &keypairs[rng.gen_range(0..keypairs.len())];
|
||||||
let socket = sockets[rng.gen_range(0, sockets.len())];
|
let socket = sockets[rng.gen_range(0..sockets.len())];
|
||||||
(keypair, socket)
|
(keypair, socket)
|
||||||
})
|
})
|
||||||
.take(128)
|
.take(128)
|
||||||
|
|
|
@ -207,9 +207,9 @@ mod tests {
|
||||||
let mut rng = ChaChaRng::from_seed([189u8; 32]);
|
let mut rng = ChaChaRng::from_seed([189u8; 32]);
|
||||||
let pubkey = Pubkey::new_unique();
|
let pubkey = Pubkey::new_unique();
|
||||||
let nodes: Vec<_> = repeat_with(Pubkey::new_unique).take(20).collect();
|
let nodes: Vec<_> = repeat_with(Pubkey::new_unique).take(20).collect();
|
||||||
let stakes = repeat_with(|| rng.gen_range(1, MAX_STAKE));
|
let stakes = repeat_with(|| rng.gen_range(1..MAX_STAKE));
|
||||||
let mut stakes: HashMap<_, _> = nodes.iter().copied().zip(stakes).collect();
|
let mut stakes: HashMap<_, _> = nodes.iter().copied().zip(stakes).collect();
|
||||||
stakes.insert(pubkey, rng.gen_range(1, MAX_STAKE));
|
stakes.insert(pubkey, rng.gen_range(1..MAX_STAKE));
|
||||||
let mut active_set = PushActiveSet::default();
|
let mut active_set = PushActiveSet::default();
|
||||||
assert!(active_set.0.iter().all(|entry| entry.0.is_empty()));
|
assert!(active_set.0.iter().all(|entry| entry.0.is_empty()));
|
||||||
active_set.rotate(&mut rng, 5, CLUSTER_SIZE, &nodes, &stakes);
|
active_set.rotate(&mut rng, 5, CLUSTER_SIZE, &nodes, &stakes);
|
||||||
|
@ -262,7 +262,7 @@ mod tests {
|
||||||
const NUM_BLOOM_FILTER_ITEMS: usize = 100;
|
const NUM_BLOOM_FILTER_ITEMS: usize = 100;
|
||||||
let mut rng = ChaChaRng::from_seed([147u8; 32]);
|
let mut rng = ChaChaRng::from_seed([147u8; 32]);
|
||||||
let nodes: Vec<_> = repeat_with(Pubkey::new_unique).take(20).collect();
|
let nodes: Vec<_> = repeat_with(Pubkey::new_unique).take(20).collect();
|
||||||
let weights: Vec<_> = repeat_with(|| rng.gen_range(1, 1000)).take(20).collect();
|
let weights: Vec<_> = repeat_with(|| rng.gen_range(1..1000)).take(20).collect();
|
||||||
let mut entry = PushActiveSetEntry::default();
|
let mut entry = PushActiveSetEntry::default();
|
||||||
entry.rotate(
|
entry.rotate(
|
||||||
&mut rng,
|
&mut rng,
|
||||||
|
|
|
@ -198,7 +198,7 @@ mod tests {
|
||||||
.map(|(i, _)| i)
|
.map(|(i, _)| i)
|
||||||
.collect();
|
.collect();
|
||||||
while high != 0 {
|
while high != 0 {
|
||||||
let sample = rng.gen_range(0, high);
|
let sample = rng.gen_range(0..high);
|
||||||
let index = weights
|
let index = weights
|
||||||
.iter()
|
.iter()
|
||||||
.scan(0, |acc, &w| {
|
.scan(0, |acc, &w| {
|
||||||
|
@ -342,7 +342,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_weighted_shuffle_match_slow() {
|
fn test_weighted_shuffle_match_slow() {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let weights: Vec<u64> = repeat_with(|| rng.gen_range(0, 1000)).take(997).collect();
|
let weights: Vec<u64> = repeat_with(|| rng.gen_range(0..1000)).take(997).collect();
|
||||||
for _ in 0..10 {
|
for _ in 0..10 {
|
||||||
let mut seed = [0u8; 32];
|
let mut seed = [0u8; 32];
|
||||||
rng.fill(&mut seed[..]);
|
rng.fill(&mut seed[..]);
|
||||||
|
|
|
@ -93,7 +93,7 @@ fn bench_read_sequential(bench: &mut Bencher) {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
bench.iter(move || {
|
bench.iter(move || {
|
||||||
// Generate random starting point in the range [0, total_shreds - 1], read num_reads shreds sequentially
|
// Generate random starting point in the range [0, total_shreds - 1], read num_reads shreds sequentially
|
||||||
let start_index = rng.gen_range(0, num_small_shreds + num_large_shreds);
|
let start_index = rng.gen_range(0..num_small_shreds + num_large_shreds);
|
||||||
for i in start_index..start_index + num_reads {
|
for i in start_index..start_index + num_reads {
|
||||||
let _ = blockstore.get_data_shred(slot, i % total_shreds);
|
let _ = blockstore.get_data_shred(slot, i % total_shreds);
|
||||||
}
|
}
|
||||||
|
@ -122,7 +122,7 @@ fn bench_read_random(bench: &mut Bencher) {
|
||||||
// simulating random reads
|
// simulating random reads
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let indexes: Vec<usize> = (0..num_reads)
|
let indexes: Vec<usize> = (0..num_reads)
|
||||||
.map(|_| rng.gen_range(0, total_shreds) as usize)
|
.map(|_| rng.gen_range(0..total_shreds) as usize)
|
||||||
.collect();
|
.collect();
|
||||||
bench.iter(move || {
|
bench.iter(move || {
|
||||||
for i in indexes.iter() {
|
for i in indexes.iter() {
|
||||||
|
|
|
@ -3753,7 +3753,7 @@ pub mod tests {
|
||||||
}
|
}
|
||||||
i += 1;
|
i += 1;
|
||||||
|
|
||||||
let slot = bank.slot() + thread_rng().gen_range(1, 3);
|
let slot = bank.slot() + thread_rng().gen_range(1..3);
|
||||||
bank = Arc::new(Bank::new_from_parent(bank, &Pubkey::default(), slot));
|
bank = Arc::new(Bank::new_from_parent(bank, &Pubkey::default(), slot));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,7 +200,7 @@ mod tests {
|
||||||
const NUM_SLOTS: usize = 97;
|
const NUM_SLOTS: usize = 97;
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let pubkeys: Vec<_> = repeat_with(Pubkey::new_unique).take(4).collect();
|
let pubkeys: Vec<_> = repeat_with(Pubkey::new_unique).take(4).collect();
|
||||||
let schedule: Vec<_> = repeat_with(|| pubkeys[rng.gen_range(0, 3)])
|
let schedule: Vec<_> = repeat_with(|| pubkeys[rng.gen_range(0..3)])
|
||||||
.take(19)
|
.take(19)
|
||||||
.collect();
|
.collect();
|
||||||
let schedule = LeaderSchedule::new_from_schedule(schedule);
|
let schedule = LeaderSchedule::new_from_schedule(schedule);
|
||||||
|
|
|
@ -1042,7 +1042,7 @@ mod tests {
|
||||||
matches::assert_matches,
|
matches::assert_matches,
|
||||||
rand::Rng,
|
rand::Rng,
|
||||||
rand_chacha::{rand_core::SeedableRng, ChaChaRng},
|
rand_chacha::{rand_core::SeedableRng, ChaChaRng},
|
||||||
solana_sdk::{shred_version, signature::Signer},
|
solana_sdk::{shred_version, signature::Signer, signer::keypair::keypair_from_seed},
|
||||||
};
|
};
|
||||||
|
|
||||||
const SIZE_OF_SHRED_INDEX: usize = 4;
|
const SIZE_OF_SHRED_INDEX: usize = 4;
|
||||||
|
@ -1525,7 +1525,10 @@ mod tests {
|
||||||
};
|
};
|
||||||
let mut data = [0u8; legacy::ShredData::CAPACITY];
|
let mut data = [0u8; legacy::ShredData::CAPACITY];
|
||||||
rng.fill(&mut data[..]);
|
rng.fill(&mut data[..]);
|
||||||
let keypair = Keypair::generate(&mut rng);
|
|
||||||
|
let mut seed = [0u8; Keypair::SECRET_KEY_LENGTH];
|
||||||
|
rng.fill(&mut seed[..]);
|
||||||
|
let keypair = keypair_from_seed(&seed).unwrap();
|
||||||
let mut shred = Shred::new_from_data(
|
let mut shred = Shred::new_from_data(
|
||||||
141939602, // slot
|
141939602, // slot
|
||||||
28685, // index
|
28685, // index
|
||||||
|
@ -1562,7 +1565,9 @@ mod tests {
|
||||||
let seed = <[u8; 32]>::try_from(bs58_decode(SEED)).unwrap();
|
let seed = <[u8; 32]>::try_from(bs58_decode(SEED)).unwrap();
|
||||||
ChaChaRng::from_seed(seed)
|
ChaChaRng::from_seed(seed)
|
||||||
};
|
};
|
||||||
let keypair = Keypair::generate(&mut rng);
|
let mut seed = [0u8; Keypair::SECRET_KEY_LENGTH];
|
||||||
|
rng.fill(&mut seed[..]);
|
||||||
|
let keypair = keypair_from_seed(&seed).unwrap();
|
||||||
let mut shred = Shred::new_from_data(
|
let mut shred = Shred::new_from_data(
|
||||||
142076266, // slot
|
142076266, // slot
|
||||||
21443, // index
|
21443, // index
|
||||||
|
@ -1598,7 +1603,9 @@ mod tests {
|
||||||
};
|
};
|
||||||
let mut parity_shard = vec![0u8; legacy::SIZE_OF_ERASURE_ENCODED_SLICE];
|
let mut parity_shard = vec![0u8; legacy::SIZE_OF_ERASURE_ENCODED_SLICE];
|
||||||
rng.fill(&mut parity_shard[..]);
|
rng.fill(&mut parity_shard[..]);
|
||||||
let keypair = Keypair::generate(&mut rng);
|
let mut seed = [0u8; Keypair::SECRET_KEY_LENGTH];
|
||||||
|
rng.fill(&mut seed[..]);
|
||||||
|
let keypair = keypair_from_seed(&seed).unwrap();
|
||||||
let mut shred = Shred::new_from_parity_shard(
|
let mut shred = Shred::new_from_parity_shard(
|
||||||
141945197, // slot
|
141945197, // slot
|
||||||
23418, // index
|
23418, // index
|
||||||
|
|
|
@ -1173,7 +1173,7 @@ mod test {
|
||||||
num_coding_shreds: usize,
|
num_coding_shreds: usize,
|
||||||
reed_solomon_cache: &ReedSolomonCache,
|
reed_solomon_cache: &ReedSolomonCache,
|
||||||
) {
|
) {
|
||||||
let keypair = Keypair::generate(rng);
|
let keypair = Keypair::new();
|
||||||
let num_shreds = num_data_shreds + num_coding_shreds;
|
let num_shreds = num_data_shreds + num_coding_shreds;
|
||||||
let proof_size = get_proof_size(num_shreds);
|
let proof_size = get_proof_size(num_shreds);
|
||||||
let capacity = ShredData::capacity(proof_size).unwrap();
|
let capacity = ShredData::capacity(proof_size).unwrap();
|
||||||
|
@ -1186,7 +1186,7 @@ mod test {
|
||||||
fec_set_index: 1835,
|
fec_set_index: 1835,
|
||||||
};
|
};
|
||||||
let data_header = {
|
let data_header = {
|
||||||
let reference_tick = rng.gen_range(0, 0x40);
|
let reference_tick = rng.gen_range(0..0x40);
|
||||||
DataShredHeader {
|
DataShredHeader {
|
||||||
parent_offset: rng.gen::<u16>().max(1),
|
parent_offset: rng.gen::<u16>().max(1),
|
||||||
flags: ShredFlags::from_bits_retain(reference_tick),
|
flags: ShredFlags::from_bits_retain(reference_tick),
|
||||||
|
@ -1204,7 +1204,7 @@ mod test {
|
||||||
index: common_header.index + i as u32,
|
index: common_header.index + i as u32,
|
||||||
..common_header
|
..common_header
|
||||||
};
|
};
|
||||||
let size = ShredData::SIZE_OF_HEADERS + rng.gen_range(0, capacity);
|
let size = ShredData::SIZE_OF_HEADERS + rng.gen_range(0..capacity);
|
||||||
let data_header = DataShredHeader {
|
let data_header = DataShredHeader {
|
||||||
size: size as u16,
|
size: size as u16,
|
||||||
..data_header
|
..data_header
|
||||||
|
@ -1345,7 +1345,7 @@ mod test {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let reed_solomon_cache = ReedSolomonCache::default();
|
let reed_solomon_cache = ReedSolomonCache::default();
|
||||||
for _ in 0..32 {
|
for _ in 0..32 {
|
||||||
let data_size = rng.gen_range(0, 31200 * 7);
|
let data_size = rng.gen_range(0..31200 * 7);
|
||||||
run_make_shreds_from_data(&mut rng, data_size, &reed_solomon_cache);
|
run_make_shreds_from_data(&mut rng, data_size, &reed_solomon_cache);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1358,11 +1358,11 @@ mod test {
|
||||||
let thread_pool = ThreadPoolBuilder::new().num_threads(2).build().unwrap();
|
let thread_pool = ThreadPoolBuilder::new().num_threads(2).build().unwrap();
|
||||||
let keypair = Keypair::new();
|
let keypair = Keypair::new();
|
||||||
let slot = 149_745_689;
|
let slot = 149_745_689;
|
||||||
let parent_slot = slot - rng.gen_range(1, 65536);
|
let parent_slot = slot - rng.gen_range(1..65536);
|
||||||
let shred_version = rng.gen();
|
let shred_version = rng.gen();
|
||||||
let reference_tick = rng.gen_range(1, 64);
|
let reference_tick = rng.gen_range(1..64);
|
||||||
let next_shred_index = rng.gen_range(0, 671);
|
let next_shred_index = rng.gen_range(0..671);
|
||||||
let next_code_index = rng.gen_range(0, 781);
|
let next_code_index = rng.gen_range(0..781);
|
||||||
let mut data = vec![0u8; data_size];
|
let mut data = vec![0u8; data_size];
|
||||||
rng.fill(&mut data[..]);
|
rng.fill(&mut data[..]);
|
||||||
let shreds = make_shreds_from_data(
|
let shreds = make_shreds_from_data(
|
||||||
|
|
|
@ -476,7 +476,7 @@ mod tests {
|
||||||
matches::assert_matches,
|
matches::assert_matches,
|
||||||
rand::{seq::SliceRandom, Rng},
|
rand::{seq::SliceRandom, Rng},
|
||||||
solana_sdk::{
|
solana_sdk::{
|
||||||
hash::{self, hash, Hash},
|
hash::{hash, Hash},
|
||||||
pubkey::Pubkey,
|
pubkey::Pubkey,
|
||||||
shred_version,
|
shred_version,
|
||||||
signature::{Signature, Signer},
|
signature::{Signature, Signer},
|
||||||
|
@ -994,20 +994,20 @@ mod tests {
|
||||||
.take(num_tx)
|
.take(num_tx)
|
||||||
.collect();
|
.collect();
|
||||||
let entry = Entry::new(
|
let entry = Entry::new(
|
||||||
&hash::new_rand(&mut rng), // prev hash
|
&Hash::new_unique(), // prev hash
|
||||||
rng.gen_range(1, 64), // num hashes
|
rng.gen_range(1..64), // num hashes
|
||||||
txs,
|
txs,
|
||||||
);
|
);
|
||||||
let keypair = Arc::new(Keypair::new());
|
let keypair = Arc::new(Keypair::new());
|
||||||
let slot = 71489660;
|
let slot = 71489660;
|
||||||
let shredder = Shredder::new(
|
let shredder = Shredder::new(
|
||||||
slot,
|
slot,
|
||||||
slot - rng.gen_range(1, 27), // parent slot
|
slot - rng.gen_range(1..27), // parent slot
|
||||||
0, // reference tick
|
0, // reference tick
|
||||||
rng.gen(), // version
|
rng.gen(), // version
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let next_shred_index = rng.gen_range(1, 1024);
|
let next_shred_index = rng.gen_range(1..1024);
|
||||||
let reed_solomon_cache = ReedSolomonCache::default();
|
let reed_solomon_cache = ReedSolomonCache::default();
|
||||||
let (data_shreds, coding_shreds) = shredder.entries_to_shreds(
|
let (data_shreds, coding_shreds) = shredder.entries_to_shreds(
|
||||||
&keypair,
|
&keypair,
|
||||||
|
|
|
@ -708,11 +708,11 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_entry<R: Rng>(rng: &mut R, prev_hash: &Hash) -> Entry {
|
fn make_entry<R: Rng>(rng: &mut R, prev_hash: &Hash) -> Entry {
|
||||||
let size = rng.gen_range(16, 32);
|
let size = rng.gen_range(16..32);
|
||||||
let txs = repeat_with(|| make_transaction(rng)).take(size).collect();
|
let txs = repeat_with(|| make_transaction(rng)).take(size).collect();
|
||||||
Entry::new(
|
Entry::new(
|
||||||
prev_hash,
|
prev_hash,
|
||||||
rng.gen_range(1, 64), // num_hashes
|
rng.gen_range(1..64), // num_hashes
|
||||||
txs,
|
txs,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -731,11 +731,11 @@ mod tests {
|
||||||
.iter()
|
.iter()
|
||||||
.flat_map(|(&slot, keypair)| {
|
.flat_map(|(&slot, keypair)| {
|
||||||
let parent_slot = slot - rng.gen::<u16>().max(1) as Slot;
|
let parent_slot = slot - rng.gen::<u16>().max(1) as Slot;
|
||||||
let num_entries = rng.gen_range(64, 128);
|
let num_entries = rng.gen_range(64..128);
|
||||||
let (data_shreds, coding_shreds) = Shredder::new(
|
let (data_shreds, coding_shreds) = Shredder::new(
|
||||||
slot,
|
slot,
|
||||||
parent_slot,
|
parent_slot,
|
||||||
rng.gen_range(0, 0x40), // reference_tick
|
rng.gen_range(0..0x40), // reference_tick
|
||||||
rng.gen(), // version
|
rng.gen(), // version
|
||||||
)
|
)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
@ -743,8 +743,8 @@ mod tests {
|
||||||
keypair,
|
keypair,
|
||||||
&make_entries(rng, num_entries),
|
&make_entries(rng, num_entries),
|
||||||
rng.gen(), // is_last_in_slot
|
rng.gen(), // is_last_in_slot
|
||||||
rng.gen_range(0, 2671), // next_shred_index
|
rng.gen_range(0..2671), // next_shred_index
|
||||||
rng.gen_range(0, 2781), // next_code_index
|
rng.gen_range(0..2781), // next_code_index
|
||||||
rng.gen(), // merkle_variant,
|
rng.gen(), // merkle_variant,
|
||||||
&reed_solomon_cache,
|
&reed_solomon_cache,
|
||||||
&mut ProcessShredsStats::default(),
|
&mut ProcessShredsStats::default(),
|
||||||
|
@ -782,7 +782,7 @@ mod tests {
|
||||||
packet
|
packet
|
||||||
});
|
});
|
||||||
let packets: Vec<_> = repeat_with(|| {
|
let packets: Vec<_> = repeat_with(|| {
|
||||||
let size = rng.gen_range(0, 16);
|
let size = rng.gen_range(0..16);
|
||||||
let packets = packets.by_ref().take(size).collect();
|
let packets = packets.by_ref().take(size).collect();
|
||||||
let batch = PacketBatch::new(packets);
|
let batch = PacketBatch::new(packets);
|
||||||
(size == 0 || !batch.is_empty()).then_some(batch)
|
(size == 0 || !batch.is_empty()).then_some(batch)
|
||||||
|
@ -802,7 +802,7 @@ mod tests {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let thread_pool = ThreadPoolBuilder::new().num_threads(3).build().unwrap();
|
let thread_pool = ThreadPoolBuilder::new().num_threads(3).build().unwrap();
|
||||||
let recycler_cache = RecyclerCache::default();
|
let recycler_cache = RecyclerCache::default();
|
||||||
let keypairs = repeat_with(|| rng.gen_range(169_367_809, 169_906_789))
|
let keypairs = repeat_with(|| rng.gen_range(169_367_809..169_906_789))
|
||||||
.map(|slot| (slot, Keypair::new()))
|
.map(|slot| (slot, Keypair::new()))
|
||||||
.take(3)
|
.take(3)
|
||||||
.collect();
|
.collect();
|
||||||
|
@ -848,7 +848,7 @@ mod tests {
|
||||||
let thread_pool = ThreadPoolBuilder::new().num_threads(3).build().unwrap();
|
let thread_pool = ThreadPoolBuilder::new().num_threads(3).build().unwrap();
|
||||||
let recycler_cache = RecyclerCache::default();
|
let recycler_cache = RecyclerCache::default();
|
||||||
let shreds = {
|
let shreds = {
|
||||||
let keypairs = repeat_with(|| rng.gen_range(169_367_809, 169_906_789))
|
let keypairs = repeat_with(|| rng.gen_range(169_367_809..169_906_789))
|
||||||
.map(|slot| (slot, Keypair::new()))
|
.map(|slot| (slot, Keypair::new()))
|
||||||
.take(3)
|
.take(3)
|
||||||
.collect();
|
.collect();
|
||||||
|
|
|
@ -156,7 +156,7 @@ pub fn send_many_transactions(
|
||||||
let (blockhash, _) = client
|
let (blockhash, _) = client
|
||||||
.get_latest_blockhash_with_commitment(CommitmentConfig::processed())
|
.get_latest_blockhash_with_commitment(CommitmentConfig::processed())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let transfer_amount = thread_rng().gen_range(1, max_tokens_per_transfer);
|
let transfer_amount = thread_rng().gen_range(1..max_tokens_per_transfer);
|
||||||
|
|
||||||
let mut transaction = system_transaction::transfer(
|
let mut transaction = system_transaction::transfer(
|
||||||
funding_keypair,
|
funding_keypair,
|
||||||
|
|
|
@ -98,7 +98,7 @@ impl NetworkTopology {
|
||||||
|
|
||||||
fn new_random(max_partitions: usize, max_packet_drop: u8, max_packet_delay: u32) -> Self {
|
fn new_random(max_partitions: usize, max_packet_drop: u8, max_packet_delay: u32) -> Self {
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
let num_partitions = rng.gen_range(0, max_partitions + 1);
|
let num_partitions = rng.gen_range(0..max_partitions + 1);
|
||||||
|
|
||||||
if num_partitions == 0 {
|
if num_partitions == 0 {
|
||||||
return NetworkTopology::default();
|
return NetworkTopology::default();
|
||||||
|
@ -110,7 +110,7 @@ impl NetworkTopology {
|
||||||
let partition = if i == num_partitions - 1 {
|
let partition = if i == num_partitions - 1 {
|
||||||
100 - used_partition
|
100 - used_partition
|
||||||
} else {
|
} else {
|
||||||
rng.gen_range(0, 100 - used_partition - num_partitions + i)
|
rng.gen_range(0..100 - used_partition - num_partitions + i)
|
||||||
};
|
};
|
||||||
used_partition += partition;
|
used_partition += partition;
|
||||||
partitions.push(partition as u8);
|
partitions.push(partition as u8);
|
||||||
|
@ -120,14 +120,14 @@ impl NetworkTopology {
|
||||||
for i in 0..partitions.len() - 1 {
|
for i in 0..partitions.len() - 1 {
|
||||||
for j in i + 1..partitions.len() {
|
for j in i + 1..partitions.len() {
|
||||||
let drop_config = if max_packet_drop > 0 {
|
let drop_config = if max_packet_drop > 0 {
|
||||||
let packet_drop = rng.gen_range(0, max_packet_drop + 1);
|
let packet_drop = rng.gen_range(0..max_packet_drop + 1);
|
||||||
format!("loss {packet_drop}% 25% ")
|
format!("loss {packet_drop}% 25% ")
|
||||||
} else {
|
} else {
|
||||||
String::default()
|
String::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
let config = if max_packet_delay > 0 {
|
let config = if max_packet_delay > 0 {
|
||||||
let packet_delay = rng.gen_range(0, max_packet_delay + 1);
|
let packet_delay = rng.gen_range(0..max_packet_delay + 1);
|
||||||
format!("{drop_config}delay {packet_delay}ms 10ms")
|
format!("{drop_config}delay {packet_delay}ms 10ms")
|
||||||
} else {
|
} else {
|
||||||
drop_config
|
drop_config
|
||||||
|
|
|
@ -558,7 +558,7 @@ pub fn bind_two_in_range_with_offset(
|
||||||
pub fn find_available_port_in_range(ip_addr: IpAddr, range: PortRange) -> io::Result<u16> {
|
pub fn find_available_port_in_range(ip_addr: IpAddr, range: PortRange) -> io::Result<u16> {
|
||||||
let (start, end) = range;
|
let (start, end) = range;
|
||||||
let mut tries_left = end - start;
|
let mut tries_left = end - start;
|
||||||
let mut rand_port = thread_rng().gen_range(start, end);
|
let mut rand_port = thread_rng().gen_range(start..end);
|
||||||
loop {
|
loop {
|
||||||
match bind_common(ip_addr, rand_port, false) {
|
match bind_common(ip_addr, rand_port, false) {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
|
|
|
@ -36,7 +36,7 @@ name = "solana_perf"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
matches = { workspace = true }
|
matches = { workspace = true }
|
||||||
rand_chacha = "0.2.2"
|
rand_chacha = { workspace = true }
|
||||||
solana-logger = { workspace = true }
|
solana-logger = { workspace = true }
|
||||||
test-case = { workspace = true }
|
test-case = { workspace = true }
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,7 @@ fn bench_sigverify_uneven(bencher: &mut Bencher) {
|
||||||
// generate packet vector
|
// generate packet vector
|
||||||
let mut batches = vec![];
|
let mut batches = vec![];
|
||||||
while current_packets < num_packets {
|
while current_packets < num_packets {
|
||||||
let mut len: usize = thread_rng().gen_range(1, 128);
|
let mut len: usize = thread_rng().gen_range(1..128);
|
||||||
current_packets += len;
|
current_packets += len;
|
||||||
if current_packets > num_packets {
|
if current_packets > num_packets {
|
||||||
len -= current_packets - num_packets;
|
len -= current_packets - num_packets;
|
||||||
|
|
|
@ -262,7 +262,7 @@ mod tests {
|
||||||
let mut packet = Packet::new([0u8; PACKET_DATA_SIZE], Meta::default());
|
let mut packet = Packet::new([0u8; PACKET_DATA_SIZE], Meta::default());
|
||||||
let mut dup_count = 0usize;
|
let mut dup_count = 0usize;
|
||||||
for _ in 0..num_packets {
|
for _ in 0..num_packets {
|
||||||
let size = rng.gen_range(0, PACKET_DATA_SIZE);
|
let size = rng.gen_range(0..PACKET_DATA_SIZE);
|
||||||
packet.meta_mut().size = size;
|
packet.meta_mut().size = size;
|
||||||
rng.fill(&mut packet.buffer_mut()[0..size]);
|
rng.fill(&mut packet.buffer_mut()[0..size]);
|
||||||
if deduper.dedup(packet.data(..).unwrap()) {
|
if deduper.dedup(packet.data(..).unwrap()) {
|
||||||
|
|
|
@ -9,7 +9,7 @@ pub fn discard_batches_randomly(
|
||||||
mut total_packets: usize,
|
mut total_packets: usize,
|
||||||
) -> usize {
|
) -> usize {
|
||||||
while total_packets > max_packets {
|
while total_packets > max_packets {
|
||||||
let index = thread_rng().gen_range(0, batches.len());
|
let index = thread_rng().gen_range(0..batches.len());
|
||||||
let removed = batches.swap_remove(index);
|
let removed = batches.swap_remove(index);
|
||||||
total_packets = total_packets.saturating_sub(removed.len());
|
total_packets = total_packets.saturating_sub(removed.len());
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ pub struct RecyclerX<T> {
|
||||||
|
|
||||||
impl<T: Default> Default for RecyclerX<T> {
|
impl<T: Default> Default for RecyclerX<T> {
|
||||||
fn default() -> RecyclerX<T> {
|
fn default() -> RecyclerX<T> {
|
||||||
let id = thread_rng().gen_range(0, 1000);
|
let id = thread_rng().gen_range(0..1000);
|
||||||
trace!("new recycler..{}", id);
|
trace!("new recycler..{}", id);
|
||||||
RecyclerX {
|
RecyclerX {
|
||||||
gc: Mutex::default(),
|
gc: Mutex::default(),
|
||||||
|
@ -229,7 +229,7 @@ mod tests {
|
||||||
assert_eq!(recycler.recycler.gc.lock().unwrap().len(), NUM_PACKETS);
|
assert_eq!(recycler.recycler.gc.lock().unwrap().len(), NUM_PACKETS);
|
||||||
// Process a normal load of packets for a while.
|
// Process a normal load of packets for a while.
|
||||||
for _ in 0..RECYCLER_SHRINK_WINDOW / 16 {
|
for _ in 0..RECYCLER_SHRINK_WINDOW / 16 {
|
||||||
let count = rng.gen_range(1, 128);
|
let count = rng.gen_range(1..128);
|
||||||
let _packets: Vec<_> = repeat_with(|| recycler.allocate("")).take(count).collect();
|
let _packets: Vec<_> = repeat_with(|| recycler.allocate("")).take(count).collect();
|
||||||
}
|
}
|
||||||
// Assert that the gc size has shrinked.
|
// Assert that the gc size has shrinked.
|
||||||
|
|
|
@ -710,10 +710,10 @@ mod tests {
|
||||||
fn test_copy_return_values() {
|
fn test_copy_return_values() {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let sig_lens: Vec<Vec<u32>> = {
|
let sig_lens: Vec<Vec<u32>> = {
|
||||||
let size = rng.gen_range(0, 64);
|
let size = rng.gen_range(0..64);
|
||||||
repeat_with(|| {
|
repeat_with(|| {
|
||||||
let size = rng.gen_range(0, 16);
|
let size = rng.gen_range(0..16);
|
||||||
repeat_with(|| rng.gen_range(0, 5)).take(size).collect()
|
repeat_with(|| rng.gen_range(0..5)).take(size).collect()
|
||||||
})
|
})
|
||||||
.take(size)
|
.take(size)
|
||||||
.collect()
|
.collect()
|
||||||
|
@ -1060,7 +1060,7 @@ mod tests {
|
||||||
// generate packet vector
|
// generate packet vector
|
||||||
let batches: Vec<_> = (0..num_batches)
|
let batches: Vec<_> = (0..num_batches)
|
||||||
.map(|_| {
|
.map(|_| {
|
||||||
let num_packets_per_batch = thread_rng().gen_range(1, max_packets_per_batch);
|
let num_packets_per_batch = thread_rng().gen_range(1..max_packets_per_batch);
|
||||||
let mut packet_batch = PacketBatch::with_capacity(num_packets_per_batch);
|
let mut packet_batch = PacketBatch::with_capacity(num_packets_per_batch);
|
||||||
for _ in 0..num_packets_per_batch {
|
for _ in 0..num_packets_per_batch {
|
||||||
packet_batch.push(packet.clone());
|
packet_batch.push(packet.clone());
|
||||||
|
@ -1221,22 +1221,22 @@ mod tests {
|
||||||
let recycler = Recycler::default();
|
let recycler = Recycler::default();
|
||||||
let recycler_out = Recycler::default();
|
let recycler_out = Recycler::default();
|
||||||
for _ in 0..50 {
|
for _ in 0..50 {
|
||||||
let num_batches = thread_rng().gen_range(2, 30);
|
let num_batches = thread_rng().gen_range(2..30);
|
||||||
let mut batches = generate_packet_batches_random_size(&packet, 128, num_batches);
|
let mut batches = generate_packet_batches_random_size(&packet, 128, num_batches);
|
||||||
|
|
||||||
let num_modifications = thread_rng().gen_range(0, 5);
|
let num_modifications = thread_rng().gen_range(0..5);
|
||||||
for _ in 0..num_modifications {
|
for _ in 0..num_modifications {
|
||||||
let batch = thread_rng().gen_range(0, batches.len());
|
let batch = thread_rng().gen_range(0..batches.len());
|
||||||
let packet = thread_rng().gen_range(0, batches[batch].len());
|
let packet = thread_rng().gen_range(0..batches[batch].len());
|
||||||
let offset = thread_rng().gen_range(0, batches[batch][packet].meta().size);
|
let offset = thread_rng().gen_range(0..batches[batch][packet].meta().size);
|
||||||
let add = thread_rng().gen_range(0, 255);
|
let add = thread_rng().gen_range(0..255);
|
||||||
batches[batch][packet].buffer_mut()[offset] = batches[batch][packet]
|
batches[batch][packet].buffer_mut()[offset] = batches[batch][packet]
|
||||||
.data(offset)
|
.data(offset)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.wrapping_add(add);
|
.wrapping_add(add);
|
||||||
}
|
}
|
||||||
|
|
||||||
let batch_to_disable = thread_rng().gen_range(0, batches.len());
|
let batch_to_disable = thread_rng().gen_range(0..batches.len());
|
||||||
for p in batches[batch_to_disable].iter_mut() {
|
for p in batches[batch_to_disable].iter_mut() {
|
||||||
p.meta_mut().set_discard(true);
|
p.meta_mut().set_discard(true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,14 +59,14 @@ where
|
||||||
let mut slots: Vec<Slot> = std::iter::repeat_with(|| rng.gen()).take(5).collect();
|
let mut slots: Vec<Slot> = std::iter::repeat_with(|| rng.gen()).take(5).collect();
|
||||||
slots.sort_unstable();
|
slots.sort_unstable();
|
||||||
slots.dedup();
|
slots.dedup();
|
||||||
let switch_proof_hash = rng.gen_bool(0.5).then(|| solana_sdk::hash::new_rand(rng));
|
let switch_proof_hash = rng.gen_bool(0.5).then(Hash::new_unique);
|
||||||
vote_transaction::new_vote_transaction(
|
vote_transaction::new_vote_transaction(
|
||||||
slots,
|
slots,
|
||||||
solana_sdk::hash::new_rand(rng), // bank_hash
|
Hash::new_unique(), // bank_hash
|
||||||
solana_sdk::hash::new_rand(rng), // blockhash
|
Hash::new_unique(), // blockhash
|
||||||
&Keypair::generate(rng), // node_keypair
|
&Keypair::new(), // node_keypair
|
||||||
&Keypair::generate(rng), // vote_keypair
|
&Keypair::new(), // vote_keypair
|
||||||
&Keypair::generate(rng), // authorized_voter_keypair
|
&Keypair::new(), // authorized_voter_keypair
|
||||||
switch_proof_hash,
|
switch_proof_hash,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ edition = { workspace = true }
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = { version = "3.1.5", features = ["cargo"] }
|
clap = { version = "3.1.5", features = ["cargo"] }
|
||||||
log = { workspace = true }
|
log = { workspace = true }
|
||||||
rand = { workspace = true }
|
|
||||||
rayon = { workspace = true }
|
rayon = { workspace = true }
|
||||||
solana-entry = { workspace = true }
|
solana-entry = { workspace = true }
|
||||||
solana-logger = { workspace = true }
|
solana-logger = { workspace = true }
|
||||||
|
|
|
@ -670,12 +670,23 @@ mod tests {
|
||||||
let mut transaction_context =
|
let mut transaction_context =
|
||||||
TransactionContext::new(accounts, Some(Rent::default()), 1, 2);
|
TransactionContext::new(accounts, Some(Rent::default()), 1, 2);
|
||||||
|
|
||||||
|
// Since libsecp256k1 is still using the old version of rand, this test
|
||||||
|
// copies the `random` implementation at:
|
||||||
|
// https://docs.rs/libsecp256k1/latest/src/libsecp256k1/lib.rs.html#430
|
||||||
|
let secret_key = {
|
||||||
|
use rand::RngCore;
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
loop {
|
||||||
|
let mut ret = [0u8; libsecp256k1::util::SECRET_KEY_SIZE];
|
||||||
|
rng.fill_bytes(&mut ret);
|
||||||
|
if let Ok(key) = libsecp256k1::SecretKey::parse(&ret) {
|
||||||
|
break key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
let message = SanitizedMessage::Legacy(LegacyMessage::new(Message::new(
|
let message = SanitizedMessage::Legacy(LegacyMessage::new(Message::new(
|
||||||
&[
|
&[
|
||||||
new_secp256k1_instruction(
|
new_secp256k1_instruction(&secret_key, b"hello"),
|
||||||
&libsecp256k1::SecretKey::random(&mut rand::thread_rng()),
|
|
||||||
b"hello",
|
|
||||||
),
|
|
||||||
Instruction::new_with_bytes(mock_program_id, &[], vec![]),
|
Instruction::new_with_bytes(mock_program_id, &[], vec![]),
|
||||||
],
|
],
|
||||||
None,
|
None,
|
||||||
|
|
|
@ -3958,8 +3958,8 @@ mod tests {
|
||||||
for _ in 0..outer_iters {
|
for _ in 0..outer_iters {
|
||||||
let mut mangled_bytes = bytes.to_vec();
|
let mut mangled_bytes = bytes.to_vec();
|
||||||
for _ in 0..inner_iters {
|
for _ in 0..inner_iters {
|
||||||
let offset = rng.gen_range(offset.start, offset.end);
|
let offset = rng.gen_range(offset.start..offset.end);
|
||||||
let value = rng.gen_range(value.start, value.end);
|
let value = rng.gen_range(value.start..value.end);
|
||||||
*mangled_bytes.get_mut(offset).unwrap() = value;
|
*mangled_bytes.get_mut(offset).unwrap() = value;
|
||||||
work(&mut mangled_bytes);
|
work(&mut mangled_bytes);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
use {
|
use {
|
||||||
assert_matches::assert_matches,
|
assert_matches::assert_matches,
|
||||||
rand::thread_rng,
|
|
||||||
solana_program_test::*,
|
solana_program_test::*,
|
||||||
solana_sdk::{
|
solana_sdk::{
|
||||||
ed25519_instruction::new_ed25519_instruction,
|
ed25519_instruction::new_ed25519_instruction,
|
||||||
|
@ -9,6 +8,20 @@ use {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Since ed25519_dalek is still using the old version of rand, this test
|
||||||
|
// copies the `generate` implementation at:
|
||||||
|
// https://docs.rs/ed25519-dalek/1.0.1/src/ed25519_dalek/secret.rs.html#167
|
||||||
|
fn generate_keypair() -> ed25519_dalek::Keypair {
|
||||||
|
use rand::RngCore;
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
let mut seed = [0u8; ed25519_dalek::SECRET_KEY_LENGTH];
|
||||||
|
rng.fill_bytes(&mut seed);
|
||||||
|
let secret =
|
||||||
|
ed25519_dalek::SecretKey::from_bytes(&seed[..ed25519_dalek::SECRET_KEY_LENGTH]).unwrap();
|
||||||
|
let public = ed25519_dalek::PublicKey::from(&secret);
|
||||||
|
ed25519_dalek::Keypair { secret, public }
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_success() {
|
async fn test_success() {
|
||||||
let mut context = ProgramTest::default().start_with_context().await;
|
let mut context = ProgramTest::default().start_with_context().await;
|
||||||
|
@ -17,7 +30,7 @@ async fn test_success() {
|
||||||
let payer = &context.payer;
|
let payer = &context.payer;
|
||||||
let recent_blockhash = context.last_blockhash;
|
let recent_blockhash = context.last_blockhash;
|
||||||
|
|
||||||
let privkey = ed25519_dalek::Keypair::generate(&mut thread_rng());
|
let privkey = generate_keypair();
|
||||||
let message_arr = b"hello";
|
let message_arr = b"hello";
|
||||||
let instruction = new_ed25519_instruction(&privkey, message_arr);
|
let instruction = new_ed25519_instruction(&privkey, message_arr);
|
||||||
|
|
||||||
|
@ -39,7 +52,7 @@ async fn test_failure() {
|
||||||
let payer = &context.payer;
|
let payer = &context.payer;
|
||||||
let recent_blockhash = context.last_blockhash;
|
let recent_blockhash = context.last_blockhash;
|
||||||
|
|
||||||
let privkey = ed25519_dalek::Keypair::generate(&mut thread_rng());
|
let privkey = generate_keypair();
|
||||||
let message_arr = b"hello";
|
let message_arr = b"hello";
|
||||||
let mut instruction = new_ed25519_instruction(&privkey, message_arr);
|
let mut instruction = new_ed25519_instruction(&privkey, message_arr);
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ version = "0.7.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
|
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
@ -81,7 +81,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
|
checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
@ -492,7 +492,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1"
|
checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
"instant",
|
"instant",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
|
@ -1823,9 +1823,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "getrandom"
|
name = "getrandom"
|
||||||
version = "0.2.8"
|
version = "0.2.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
|
checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
|
@ -3719,7 +3719,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"rand_chacha 0.3.0",
|
"rand_chacha 0.3.1",
|
||||||
"rand_core 0.6.4",
|
"rand_core 0.6.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -3735,9 +3735,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_chacha"
|
name = "rand_chacha"
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"
|
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ppv-lite86",
|
"ppv-lite86",
|
||||||
"rand_core 0.6.4",
|
"rand_core 0.6.4",
|
||||||
|
@ -3758,7 +3758,7 @@ version = "0.6.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -3843,7 +3843,7 @@ version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
|
checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
"redox_syscall 0.2.10",
|
"redox_syscall 0.2.10",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -4572,7 +4572,7 @@ dependencies = [
|
||||||
"ouroboros",
|
"ouroboros",
|
||||||
"percentage",
|
"percentage",
|
||||||
"qualifier_attr",
|
"qualifier_attr",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"regex",
|
"regex",
|
||||||
"rustc_version",
|
"rustc_version",
|
||||||
|
@ -4677,7 +4677,7 @@ dependencies = [
|
||||||
"bv",
|
"bv",
|
||||||
"fnv",
|
"fnv",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"rustc_version",
|
"rustc_version",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -4695,7 +4695,7 @@ dependencies = [
|
||||||
"byteorder 1.4.3",
|
"byteorder 1.4.3",
|
||||||
"libsecp256k1 0.6.0",
|
"libsecp256k1 0.6.0",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
"solana-program-runtime",
|
"solana-program-runtime",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
|
@ -4723,7 +4723,7 @@ dependencies = [
|
||||||
"memmap2",
|
"memmap2",
|
||||||
"modular-bitfield",
|
"modular-bitfield",
|
||||||
"num_enum 0.6.1",
|
"num_enum 0.6.1",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
|
@ -4796,7 +4796,6 @@ dependencies = [
|
||||||
"indicatif",
|
"indicatif",
|
||||||
"log",
|
"log",
|
||||||
"quinn",
|
"quinn",
|
||||||
"rand 0.7.3",
|
|
||||||
"rayon",
|
"rayon",
|
||||||
"solana-connection-cache",
|
"solana-connection-cache",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
|
@ -4844,7 +4843,7 @@ dependencies = [
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"indexmap 2.0.0",
|
"indexmap 2.0.0",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"rcgen",
|
"rcgen",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
|
@ -4875,8 +4874,8 @@ dependencies = [
|
||||||
"min-max-heap",
|
"min-max-heap",
|
||||||
"num_enum 0.6.1",
|
"num_enum 0.6.1",
|
||||||
"quinn",
|
"quinn",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"rolling-file",
|
"rolling-file",
|
||||||
"rustc_version",
|
"rustc_version",
|
||||||
|
@ -4965,7 +4964,7 @@ dependencies = [
|
||||||
"dlopen2",
|
"dlopen2",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"serde",
|
"serde",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
|
@ -5011,13 +5010,11 @@ dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"either",
|
"either",
|
||||||
"generic-array 0.14.7",
|
"generic-array 0.14.7",
|
||||||
"getrandom 0.1.14",
|
|
||||||
"im",
|
"im",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
"memmap2",
|
"memmap2",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"rand_core 0.6.4",
|
|
||||||
"rustc_version",
|
"rustc_version",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_bytes",
|
"serde_bytes",
|
||||||
|
@ -5100,8 +5097,8 @@ dependencies = [
|
||||||
"lru",
|
"lru",
|
||||||
"matches",
|
"matches",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"rustc_version",
|
"rustc_version",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -5153,8 +5150,8 @@ dependencies = [
|
||||||
"num_cpus",
|
"num_cpus",
|
||||||
"num_enum 0.6.1",
|
"num_enum 0.6.1",
|
||||||
"prost 0.11.9",
|
"prost 0.11.9",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"reed-solomon-erasure",
|
"reed-solomon-erasure",
|
||||||
"rocksdb",
|
"rocksdb",
|
||||||
|
@ -5199,7 +5196,7 @@ name = "solana-loader-v4-program"
|
||||||
version = "1.17.0"
|
version = "1.17.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
"solana-program-runtime",
|
"solana-program-runtime",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
|
@ -5254,7 +5251,7 @@ dependencies = [
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
"log",
|
"log",
|
||||||
"nix",
|
"nix",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"socket2 0.5.3",
|
"socket2 0.5.3",
|
||||||
|
@ -5280,7 +5277,7 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"nix",
|
"nix",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"serde",
|
"serde",
|
||||||
"solana-metrics",
|
"solana-metrics",
|
||||||
|
@ -5327,7 +5324,7 @@ dependencies = [
|
||||||
"console_error_panic_hook",
|
"console_error_panic_hook",
|
||||||
"console_log",
|
"console_log",
|
||||||
"curve25519-dalek",
|
"curve25519-dalek",
|
||||||
"getrandom 0.2.8",
|
"getrandom 0.2.10",
|
||||||
"itertools",
|
"itertools",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
|
@ -5339,8 +5336,7 @@ dependencies = [
|
||||||
"num-derive",
|
"num-derive",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"parking_lot 0.12.1",
|
"parking_lot 0.12.1",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
|
||||||
"rustc_version",
|
"rustc_version",
|
||||||
"rustversion",
|
"rustversion",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -5372,7 +5368,7 @@ dependencies = [
|
||||||
"num-derive",
|
"num-derive",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"percentage",
|
"percentage",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rustc_version",
|
"rustc_version",
|
||||||
"serde",
|
"serde",
|
||||||
"solana-frozen-abi",
|
"solana-frozen-abi",
|
||||||
|
@ -5626,7 +5622,7 @@ dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"ouroboros",
|
"ouroboros",
|
||||||
"percentage",
|
"percentage",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"regex",
|
"regex",
|
||||||
"rustc_version",
|
"rustc_version",
|
||||||
|
@ -5938,8 +5934,8 @@ dependencies = [
|
||||||
name = "solana-sbf-rust-rand"
|
name = "solana-sbf-rust-rand"
|
||||||
version = "1.17.0"
|
version = "1.17.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom 0.1.14",
|
"getrandom 0.2.10",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"solana-program",
|
"solana-program",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -6092,7 +6088,7 @@ dependencies = [
|
||||||
"pbkdf2 0.11.0",
|
"pbkdf2 0.11.0",
|
||||||
"qstring",
|
"qstring",
|
||||||
"rand 0.7.3",
|
"rand 0.7.3",
|
||||||
"rand_chacha 0.2.2",
|
"rand 0.8.5",
|
||||||
"rustc_version",
|
"rustc_version",
|
||||||
"rustversion",
|
"rustversion",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -6216,7 +6212,7 @@ dependencies = [
|
||||||
"pkcs8",
|
"pkcs8",
|
||||||
"quinn",
|
"quinn",
|
||||||
"quinn-proto",
|
"quinn-proto",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rcgen",
|
"rcgen",
|
||||||
"rustls 0.21.6",
|
"rustls 0.21.6",
|
||||||
"solana-metrics",
|
"solana-metrics",
|
||||||
|
@ -6292,7 +6288,6 @@ dependencies = [
|
||||||
"indexmap 2.0.0",
|
"indexmap 2.0.0",
|
||||||
"indicatif",
|
"indicatif",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.7.3",
|
|
||||||
"rayon",
|
"rayon",
|
||||||
"solana-connection-cache",
|
"solana-connection-cache",
|
||||||
"solana-measure",
|
"solana-measure",
|
||||||
|
@ -6341,8 +6336,8 @@ dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"lru",
|
"lru",
|
||||||
"quinn",
|
"quinn",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rand_chacha 0.2.2",
|
"rand_chacha 0.3.1",
|
||||||
"rayon",
|
"rayon",
|
||||||
"rcgen",
|
"rcgen",
|
||||||
"rustls 0.21.6",
|
"rustls 0.21.6",
|
||||||
|
@ -6399,7 +6394,7 @@ dependencies = [
|
||||||
"libloading",
|
"libloading",
|
||||||
"log",
|
"log",
|
||||||
"num_cpus",
|
"num_cpus",
|
||||||
"rand 0.7.3",
|
"rand 0.8.5",
|
||||||
"rayon",
|
"rayon",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -6478,7 +6473,6 @@ name = "solana-zk-token-proof-program"
|
||||||
version = "1.17.0"
|
version = "1.17.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"getrandom 0.1.14",
|
|
||||||
"num-derive",
|
"num-derive",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
"solana-program-runtime",
|
"solana-program-runtime",
|
||||||
|
|
|
@ -13,7 +13,7 @@ bincode = { version = "1.1.4", default-features = false }
|
||||||
blake3 = "1.0.0"
|
blake3 = "1.0.0"
|
||||||
byteorder = "1.3.2"
|
byteorder = "1.3.2"
|
||||||
elf = "0.0.10"
|
elf = "0.0.10"
|
||||||
getrandom = { version = "0.1.14" }
|
getrandom = "0.2.10"
|
||||||
itertools = "0.10.1"
|
itertools = "0.10.1"
|
||||||
libsecp256k1 = { version = "0.7.0", default-features = false }
|
libsecp256k1 = { version = "0.7.0", default-features = false }
|
||||||
log = "0.4.11"
|
log = "0.4.11"
|
||||||
|
@ -21,7 +21,7 @@ miow = "0.3.6"
|
||||||
net2 = "0.2.37"
|
net2 = "0.2.37"
|
||||||
num-derive = "0.3"
|
num-derive = "0.3"
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
rand = "0.7"
|
rand = "0.8"
|
||||||
serde = "1.0.112"
|
serde = "1.0.112"
|
||||||
serde_json = "1.0.56"
|
serde_json = "1.0.56"
|
||||||
solana_rbpf = "=0.6.0"
|
solana_rbpf = "=0.6.0"
|
||||||
|
|
|
@ -10,7 +10,7 @@ license = { workspace = true }
|
||||||
edition = { workspace = true }
|
edition = { workspace = true }
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
getrandom = { workspace = true, features = ["dummy"] }
|
getrandom = { workspace = true, features = ["custom"] }
|
||||||
rand = { workspace = true }
|
rand = { workspace = true }
|
||||||
solana-program = { workspace = true }
|
solana-program = { workspace = true }
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@ edition = { workspace = true }
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bytemuck = { workspace = true, features = ["derive"] }
|
bytemuck = { workspace = true, features = ["derive"] }
|
||||||
getrandom = { workspace = true, features = ["dummy"] }
|
|
||||||
num-derive = { workspace = true }
|
num-derive = { workspace = true }
|
||||||
num-traits = { workspace = true }
|
num-traits = { workspace = true }
|
||||||
solana-program-runtime = { workspace = true }
|
solana-program-runtime = { workspace = true }
|
||||||
|
|
|
@ -248,7 +248,7 @@ fn bench_concurrent_read_write(bencher: &mut Bencher) {
|
||||||
|accounts, pubkeys| {
|
|accounts, pubkeys| {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
loop {
|
loop {
|
||||||
let i = rng.gen_range(0, pubkeys.len());
|
let i = rng.gen_range(0..pubkeys.len());
|
||||||
test::black_box(
|
test::black_box(
|
||||||
accounts
|
accounts
|
||||||
.load_without_fixed_root(&Ancestors::default(), &pubkeys[i])
|
.load_without_fixed_root(&Ancestors::default(), &pubkeys[i])
|
||||||
|
|
|
@ -47,7 +47,7 @@ fn bench_accounts_index(bencher: &mut Bencher) {
|
||||||
let mut root = 0;
|
let mut root = 0;
|
||||||
bencher.iter(|| {
|
bencher.iter(|| {
|
||||||
for _p in 0..NUM_PUBKEYS {
|
for _p in 0..NUM_PUBKEYS {
|
||||||
let pubkey = thread_rng().gen_range(0, NUM_PUBKEYS);
|
let pubkey = thread_rng().gen_range(0..NUM_PUBKEYS);
|
||||||
index.upsert(
|
index.upsert(
|
||||||
fork,
|
fork,
|
||||||
fork,
|
fork,
|
||||||
|
|
|
@ -92,7 +92,7 @@ fn append_vec_random_read(bencher: &mut Bencher) {
|
||||||
let size = 1_000;
|
let size = 1_000;
|
||||||
let indexes = add_test_accounts(&vec, size);
|
let indexes = add_test_accounts(&vec, size);
|
||||||
bencher.iter(|| {
|
bencher.iter(|| {
|
||||||
let random_index: usize = thread_rng().gen_range(0, indexes.len());
|
let random_index: usize = thread_rng().gen_range(0..indexes.len());
|
||||||
let (sample, pos) = &indexes[random_index];
|
let (sample, pos) = &indexes[random_index];
|
||||||
let (account, _next) = vec.get_account(*pos).unwrap();
|
let (account, _next) = vec.get_account(*pos).unwrap();
|
||||||
let (_meta, test) = create_test_account(*sample);
|
let (_meta, test) = create_test_account(*sample);
|
||||||
|
@ -121,7 +121,7 @@ fn append_vec_concurrent_append_read(bencher: &mut Bencher) {
|
||||||
}
|
}
|
||||||
bencher.iter(|| {
|
bencher.iter(|| {
|
||||||
let len = indexes.lock().unwrap().len();
|
let len = indexes.lock().unwrap().len();
|
||||||
let random_index: usize = thread_rng().gen_range(0, len);
|
let random_index: usize = thread_rng().gen_range(0..len);
|
||||||
let (sample, pos) = *indexes.lock().unwrap().get(random_index).unwrap();
|
let (sample, pos) = *indexes.lock().unwrap().get(random_index).unwrap();
|
||||||
let (account, _next) = vec.get_account(pos).unwrap();
|
let (account, _next) = vec.get_account(pos).unwrap();
|
||||||
let (_meta, test) = create_test_account(sample);
|
let (_meta, test) = create_test_account(sample);
|
||||||
|
@ -141,14 +141,14 @@ fn append_vec_concurrent_read_append(bencher: &mut Bencher) {
|
||||||
if len == 0 {
|
if len == 0 {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let random_index: usize = thread_rng().gen_range(0, len + 1);
|
let random_index: usize = thread_rng().gen_range(0..len + 1);
|
||||||
let (sample, pos) = *indexes1.lock().unwrap().get(random_index % len).unwrap();
|
let (sample, pos) = *indexes1.lock().unwrap().get(random_index % len).unwrap();
|
||||||
let (account, _next) = vec1.get_account(pos).unwrap();
|
let (account, _next) = vec1.get_account(pos).unwrap();
|
||||||
let (_meta, test) = create_test_account(sample);
|
let (_meta, test) = create_test_account(sample);
|
||||||
assert_eq!(account.data(), test.data());
|
assert_eq!(account.data(), test.data());
|
||||||
});
|
});
|
||||||
bencher.iter(|| {
|
bencher.iter(|| {
|
||||||
let sample: usize = thread_rng().gen_range(0, 256);
|
let sample: usize = thread_rng().gen_range(0..256);
|
||||||
let (meta, account) = create_test_account(sample);
|
let (meta, account) = create_test_account(sample);
|
||||||
if let Some(info) = append_account(&vec, meta, &account, Hash::default()) {
|
if let Some(info) = append_account(&vec, meta, &account, Hash::default()) {
|
||||||
indexes.lock().unwrap().push((sample, info.offset))
|
indexes.lock().unwrap().push((sample, info.offset))
|
||||||
|
|
|
@ -85,7 +85,7 @@ fn process_transactions_multiple_slots(banks: &[Arc<Bank>], num_slots: usize, nu
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let index = thread_rng().gen_range(0, num_slots);
|
let index = thread_rng().gen_range(0..num_slots);
|
||||||
|
|
||||||
prioritization_fee_cache.update(&banks[index], transactions.iter());
|
prioritization_fee_cache.update(&banks[index], transactions.iter());
|
||||||
})
|
})
|
||||||
|
|
|
@ -674,7 +674,7 @@ impl AccountsBackgroundService {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if bank.block_height() - last_cleaned_block_height
|
if bank.block_height() - last_cleaned_block_height
|
||||||
> (CLEAN_INTERVAL_BLOCKS + thread_rng().gen_range(0, 10))
|
> (CLEAN_INTERVAL_BLOCKS + thread_rng().gen_range(0..10))
|
||||||
{
|
{
|
||||||
// Note that the flush will do an internal clean of the
|
// Note that the flush will do an internal clean of the
|
||||||
// cache up to bank.slot(), so should be safe as long
|
// cache up to bank.slot(), so should be safe as long
|
||||||
|
|
|
@ -66,7 +66,7 @@ use {
|
||||||
fee::FeeStructure,
|
fee::FeeStructure,
|
||||||
fee_calculator::FeeRateGovernor,
|
fee_calculator::FeeRateGovernor,
|
||||||
genesis_config::{create_genesis_config, ClusterType, GenesisConfig},
|
genesis_config::{create_genesis_config, ClusterType, GenesisConfig},
|
||||||
hash::{self, hash, Hash},
|
hash::{hash, Hash},
|
||||||
incinerator,
|
incinerator,
|
||||||
instruction::{AccountMeta, CompiledInstruction, Instruction, InstructionError},
|
instruction::{AccountMeta, CompiledInstruction, Instruction, InstructionError},
|
||||||
loader_upgradeable_instruction::UpgradeableLoaderInstruction,
|
loader_upgradeable_instruction::UpgradeableLoaderInstruction,
|
||||||
|
@ -130,21 +130,21 @@ impl VoteReward {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
|
|
||||||
let validator_pubkey = solana_sdk::pubkey::new_rand();
|
let validator_pubkey = solana_sdk::pubkey::new_rand();
|
||||||
let validator_stake_lamports = rng.gen_range(1, 200);
|
let validator_stake_lamports = rng.gen_range(1..200);
|
||||||
let validator_voting_keypair = Keypair::new();
|
let validator_voting_keypair = Keypair::new();
|
||||||
|
|
||||||
let validator_vote_account = vote_state::create_account(
|
let validator_vote_account = vote_state::create_account(
|
||||||
&validator_voting_keypair.pubkey(),
|
&validator_voting_keypair.pubkey(),
|
||||||
&validator_pubkey,
|
&validator_pubkey,
|
||||||
rng.gen_range(1, 20),
|
rng.gen_range(1..20),
|
||||||
validator_stake_lamports,
|
validator_stake_lamports,
|
||||||
);
|
);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
vote_account: validator_vote_account,
|
vote_account: validator_vote_account,
|
||||||
commission: rng.gen_range(1, 20),
|
commission: rng.gen_range(1..20),
|
||||||
vote_rewards: rng.gen_range(1, 200),
|
vote_rewards: rng.gen_range(1..200),
|
||||||
vote_needs_store: rng.gen_range(1, 20) > 10,
|
vote_needs_store: rng.gen_range(1..20) > 10,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6396,11 +6396,11 @@ fn test_fuzz_instructions() {
|
||||||
let key = solana_sdk::pubkey::new_rand();
|
let key = solana_sdk::pubkey::new_rand();
|
||||||
let balance = if thread_rng().gen_ratio(9, 10) {
|
let balance = if thread_rng().gen_ratio(9, 10) {
|
||||||
let lamports = if thread_rng().gen_ratio(1, 5) {
|
let lamports = if thread_rng().gen_ratio(1, 5) {
|
||||||
thread_rng().gen_range(0, 10)
|
thread_rng().gen_range(0..10)
|
||||||
} else {
|
} else {
|
||||||
thread_rng().gen_range(20, 100)
|
thread_rng().gen_range(20..100)
|
||||||
};
|
};
|
||||||
let space = thread_rng().gen_range(0, 10);
|
let space = thread_rng().gen_range(0..10);
|
||||||
let owner = Pubkey::default();
|
let owner = Pubkey::default();
|
||||||
let account = AccountSharedData::new(lamports, space, &owner);
|
let account = AccountSharedData::new(lamports, space, &owner);
|
||||||
bank.store_account(&key, &account);
|
bank.store_account(&key, &account);
|
||||||
|
@ -6414,16 +6414,16 @@ fn test_fuzz_instructions() {
|
||||||
let mut results = HashMap::new();
|
let mut results = HashMap::new();
|
||||||
for _ in 0..2_000 {
|
for _ in 0..2_000 {
|
||||||
let num_keys = if thread_rng().gen_ratio(1, 5) {
|
let num_keys = if thread_rng().gen_ratio(1, 5) {
|
||||||
thread_rng().gen_range(0, max_keys)
|
thread_rng().gen_range(0..max_keys)
|
||||||
} else {
|
} else {
|
||||||
thread_rng().gen_range(1, 4)
|
thread_rng().gen_range(1..4)
|
||||||
};
|
};
|
||||||
let num_instructions = thread_rng().gen_range(0, max_keys - num_keys);
|
let num_instructions = thread_rng().gen_range(0..max_keys - num_keys);
|
||||||
|
|
||||||
let mut account_keys: Vec<_> = if thread_rng().gen_ratio(1, 5) {
|
let mut account_keys: Vec<_> = if thread_rng().gen_ratio(1, 5) {
|
||||||
(0..num_keys)
|
(0..num_keys)
|
||||||
.map(|_| {
|
.map(|_| {
|
||||||
let idx = thread_rng().gen_range(0, keys.len());
|
let idx = thread_rng().gen_range(0..keys.len());
|
||||||
keys[idx].0
|
keys[idx].0
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
|
@ -6433,7 +6433,7 @@ fn test_fuzz_instructions() {
|
||||||
.map(|_| {
|
.map(|_| {
|
||||||
let mut idx;
|
let mut idx;
|
||||||
loop {
|
loop {
|
||||||
idx = thread_rng().gen_range(0, keys.len());
|
idx = thread_rng().gen_range(0..keys.len());
|
||||||
if !inserted.contains(&idx) {
|
if !inserted.contains(&idx) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -6447,13 +6447,13 @@ fn test_fuzz_instructions() {
|
||||||
let instructions: Vec<_> = if num_keys > 0 {
|
let instructions: Vec<_> = if num_keys > 0 {
|
||||||
(0..num_instructions)
|
(0..num_instructions)
|
||||||
.map(|_| {
|
.map(|_| {
|
||||||
let num_accounts_to_pass = thread_rng().gen_range(0, num_keys);
|
let num_accounts_to_pass = thread_rng().gen_range(0..num_keys);
|
||||||
let account_indexes = (0..num_accounts_to_pass)
|
let account_indexes = (0..num_accounts_to_pass)
|
||||||
.map(|_| thread_rng().gen_range(0, num_keys))
|
.map(|_| thread_rng().gen_range(0..num_keys))
|
||||||
.collect();
|
.collect();
|
||||||
let program_index: u8 = thread_rng().gen_range(0, num_keys);
|
let program_index: u8 = thread_rng().gen_range(0..num_keys);
|
||||||
if thread_rng().gen_ratio(4, 5) {
|
if thread_rng().gen_ratio(4, 5) {
|
||||||
let programs_index = thread_rng().gen_range(0, program_keys.len());
|
let programs_index = thread_rng().gen_range(0..program_keys.len());
|
||||||
account_keys[program_index as usize] = program_keys[programs_index].0;
|
account_keys[program_index as usize] = program_keys[programs_index].0;
|
||||||
}
|
}
|
||||||
CompiledInstruction::new(program_index, &10, account_indexes)
|
CompiledInstruction::new(program_index, &10, account_indexes)
|
||||||
|
@ -6465,33 +6465,33 @@ fn test_fuzz_instructions() {
|
||||||
|
|
||||||
let account_keys_len = std::cmp::max(account_keys.len(), 2);
|
let account_keys_len = std::cmp::max(account_keys.len(), 2);
|
||||||
let num_signatures = if thread_rng().gen_ratio(1, 5) {
|
let num_signatures = if thread_rng().gen_ratio(1, 5) {
|
||||||
thread_rng().gen_range(0, account_keys_len + 10)
|
thread_rng().gen_range(0..account_keys_len + 10)
|
||||||
} else {
|
} else {
|
||||||
thread_rng().gen_range(1, account_keys_len)
|
thread_rng().gen_range(1..account_keys_len)
|
||||||
};
|
};
|
||||||
|
|
||||||
let num_required_signatures = if thread_rng().gen_ratio(1, 5) {
|
let num_required_signatures = if thread_rng().gen_ratio(1, 5) {
|
||||||
thread_rng().gen_range(0, account_keys_len + 10) as u8
|
thread_rng().gen_range(0..account_keys_len + 10) as u8
|
||||||
} else {
|
} else {
|
||||||
thread_rng().gen_range(1, std::cmp::max(2, num_signatures)) as u8
|
thread_rng().gen_range(1..std::cmp::max(2, num_signatures)) as u8
|
||||||
};
|
};
|
||||||
let num_readonly_signed_accounts = if thread_rng().gen_ratio(1, 5) {
|
let num_readonly_signed_accounts = if thread_rng().gen_ratio(1, 5) {
|
||||||
thread_rng().gen_range(0, account_keys_len) as u8
|
thread_rng().gen_range(0..account_keys_len) as u8
|
||||||
} else {
|
} else {
|
||||||
let max = if num_required_signatures > 1 {
|
let max = if num_required_signatures > 1 {
|
||||||
num_required_signatures - 1
|
num_required_signatures - 1
|
||||||
} else {
|
} else {
|
||||||
1
|
1
|
||||||
};
|
};
|
||||||
thread_rng().gen_range(0, max)
|
thread_rng().gen_range(0..max)
|
||||||
};
|
};
|
||||||
|
|
||||||
let num_readonly_unsigned_accounts = if thread_rng().gen_ratio(1, 5)
|
let num_readonly_unsigned_accounts = if thread_rng().gen_ratio(1, 5)
|
||||||
|| (num_required_signatures as usize) >= account_keys_len
|
|| (num_required_signatures as usize) >= account_keys_len
|
||||||
{
|
{
|
||||||
thread_rng().gen_range(0, account_keys_len) as u8
|
thread_rng().gen_range(0..account_keys_len) as u8
|
||||||
} else {
|
} else {
|
||||||
thread_rng().gen_range(0, account_keys_len - num_required_signatures as usize) as u8
|
thread_rng().gen_range(0..account_keys_len - num_required_signatures as usize) as u8
|
||||||
};
|
};
|
||||||
|
|
||||||
let header = MessageHeader {
|
let header = MessageHeader {
|
||||||
|
@ -9909,8 +9909,7 @@ fn test_verify_and_hash_transaction_sig_len() {
|
||||||
.remove(&feature_set::verify_tx_signatures_len::id());
|
.remove(&feature_set::verify_tx_signatures_len::id());
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
|
|
||||||
let mut rng = rand::thread_rng();
|
let recent_blockhash = Hash::new_unique();
|
||||||
let recent_blockhash = hash::new_rand(&mut rng);
|
|
||||||
let from_keypair = Keypair::new();
|
let from_keypair = Keypair::new();
|
||||||
let to_keypair = Keypair::new();
|
let to_keypair = Keypair::new();
|
||||||
let from_pubkey = from_keypair.pubkey();
|
let from_pubkey = from_keypair.pubkey();
|
||||||
|
@ -9966,8 +9965,7 @@ fn test_verify_transactions_packet_data_size() {
|
||||||
create_genesis_config_with_leader(42, &solana_sdk::pubkey::new_rand(), 42);
|
create_genesis_config_with_leader(42, &solana_sdk::pubkey::new_rand(), 42);
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
|
|
||||||
let mut rng = rand::thread_rng();
|
let recent_blockhash = Hash::new_unique();
|
||||||
let recent_blockhash = hash::new_rand(&mut rng);
|
|
||||||
let keypair = Keypair::new();
|
let keypair = Keypair::new();
|
||||||
let pubkey = keypair.pubkey();
|
let pubkey = keypair.pubkey();
|
||||||
let make_transaction = |size| {
|
let make_transaction = |size| {
|
||||||
|
@ -10020,7 +10018,20 @@ fn test_call_precomiled_program() {
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
|
|
||||||
// libsecp256k1
|
// libsecp256k1
|
||||||
let secp_privkey = libsecp256k1::SecretKey::random(&mut rand::thread_rng());
|
// Since libsecp256k1 is still using the old version of rand, this test
|
||||||
|
// copies the `random` implementation at:
|
||||||
|
// https://docs.rs/libsecp256k1/latest/src/libsecp256k1/lib.rs.html#430
|
||||||
|
let secp_privkey = {
|
||||||
|
use rand::RngCore;
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
loop {
|
||||||
|
let mut ret = [0u8; libsecp256k1::util::SECRET_KEY_SIZE];
|
||||||
|
rng.fill_bytes(&mut ret);
|
||||||
|
if let Ok(key) = libsecp256k1::SecretKey::parse(&ret) {
|
||||||
|
break key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
let message_arr = b"hello";
|
let message_arr = b"hello";
|
||||||
let instruction =
|
let instruction =
|
||||||
solana_sdk::secp256k1_instruction::new_secp256k1_instruction(&secp_privkey, message_arr);
|
solana_sdk::secp256k1_instruction::new_secp256k1_instruction(&secp_privkey, message_arr);
|
||||||
|
@ -10035,7 +10046,20 @@ fn test_call_precomiled_program() {
|
||||||
bank.process_transaction(&tx).unwrap();
|
bank.process_transaction(&tx).unwrap();
|
||||||
|
|
||||||
// ed25519
|
// ed25519
|
||||||
let privkey = ed25519_dalek::Keypair::generate(&mut rand::thread_rng());
|
// Since ed25519_dalek is still using the old version of rand, this test
|
||||||
|
// copies the `generate` implementation at:
|
||||||
|
// https://docs.rs/ed25519-dalek/1.0.1/src/ed25519_dalek/secret.rs.html#167
|
||||||
|
let privkey = {
|
||||||
|
use rand::RngCore;
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
let mut seed = [0u8; ed25519_dalek::SECRET_KEY_LENGTH];
|
||||||
|
rng.fill_bytes(&mut seed);
|
||||||
|
let secret =
|
||||||
|
ed25519_dalek::SecretKey::from_bytes(&seed[..ed25519_dalek::SECRET_KEY_LENGTH])
|
||||||
|
.unwrap();
|
||||||
|
let public = ed25519_dalek::PublicKey::from(&secret);
|
||||||
|
ed25519_dalek::Keypair { secret, public }
|
||||||
|
};
|
||||||
let message_arr = b"hello";
|
let message_arr = b"hello";
|
||||||
let instruction =
|
let instruction =
|
||||||
solana_sdk::ed25519_instruction::new_ed25519_instruction(&privkey, message_arr);
|
solana_sdk::ed25519_instruction::new_ed25519_instruction(&privkey, message_arr);
|
||||||
|
@ -11156,9 +11180,9 @@ fn test_update_accounts_data_size() {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
for _ in 0..100 {
|
for _ in 0..100 {
|
||||||
let initial = bank.load_accounts_data_size() as i64;
|
let initial = bank.load_accounts_data_size() as i64;
|
||||||
let delta1 = rng.gen_range(-500, 500);
|
let delta1 = rng.gen_range(-500..500);
|
||||||
bank.update_accounts_data_size_delta_on_chain(delta1);
|
bank.update_accounts_data_size_delta_on_chain(delta1);
|
||||||
let delta2 = rng.gen_range(-500, 500);
|
let delta2 = rng.gen_range(-500..500);
|
||||||
bank.update_accounts_data_size_delta_off_chain(delta2);
|
bank.update_accounts_data_size_delta_off_chain(delta2);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
bank.load_accounts_data_size() as i64,
|
bank.load_accounts_data_size() as i64,
|
||||||
|
@ -11573,15 +11597,13 @@ fn test_accounts_data_size_and_resize_transactions() {
|
||||||
{
|
{
|
||||||
let account_pubkey = Pubkey::new_unique();
|
let account_pubkey = Pubkey::new_unique();
|
||||||
let account_balance = LAMPORTS_PER_SOL;
|
let account_balance = LAMPORTS_PER_SOL;
|
||||||
let account_size = rng.gen_range(
|
let account_size =
|
||||||
1,
|
rng.gen_range(1..MAX_PERMITTED_DATA_LENGTH as usize - MAX_PERMITTED_DATA_INCREASE);
|
||||||
MAX_PERMITTED_DATA_LENGTH as usize - MAX_PERMITTED_DATA_INCREASE,
|
|
||||||
);
|
|
||||||
let account_data = AccountSharedData::new(account_balance, account_size, &mock_program_id);
|
let account_data = AccountSharedData::new(account_balance, account_size, &mock_program_id);
|
||||||
bank.store_account(&account_pubkey, &account_data);
|
bank.store_account(&account_pubkey, &account_data);
|
||||||
|
|
||||||
let accounts_data_size_before = bank.load_accounts_data_size();
|
let accounts_data_size_before = bank.load_accounts_data_size();
|
||||||
let account_grow_size = rng.gen_range(1, MAX_PERMITTED_DATA_INCREASE);
|
let account_grow_size = rng.gen_range(1..MAX_PERMITTED_DATA_INCREASE);
|
||||||
let transaction = create_mock_realloc_tx(
|
let transaction = create_mock_realloc_tx(
|
||||||
&mint_keypair,
|
&mint_keypair,
|
||||||
&funding_keypair,
|
&funding_keypair,
|
||||||
|
@ -11605,12 +11627,12 @@ fn test_accounts_data_size_and_resize_transactions() {
|
||||||
let account_pubkey = Pubkey::new_unique();
|
let account_pubkey = Pubkey::new_unique();
|
||||||
let account_balance = LAMPORTS_PER_SOL;
|
let account_balance = LAMPORTS_PER_SOL;
|
||||||
let account_size =
|
let account_size =
|
||||||
rng.gen_range(MAX_PERMITTED_DATA_LENGTH / 2, MAX_PERMITTED_DATA_LENGTH) as usize;
|
rng.gen_range(MAX_PERMITTED_DATA_LENGTH / 2..MAX_PERMITTED_DATA_LENGTH) as usize;
|
||||||
let account_data = AccountSharedData::new(account_balance, account_size, &mock_program_id);
|
let account_data = AccountSharedData::new(account_balance, account_size, &mock_program_id);
|
||||||
bank.store_account(&account_pubkey, &account_data);
|
bank.store_account(&account_pubkey, &account_data);
|
||||||
|
|
||||||
let accounts_data_size_before = bank.load_accounts_data_size();
|
let accounts_data_size_before = bank.load_accounts_data_size();
|
||||||
let account_shrink_size = rng.gen_range(1, account_size);
|
let account_shrink_size = rng.gen_range(1..account_size);
|
||||||
let transaction = create_mock_realloc_tx(
|
let transaction = create_mock_realloc_tx(
|
||||||
&mint_keypair,
|
&mint_keypair,
|
||||||
&funding_keypair,
|
&funding_keypair,
|
||||||
|
@ -11772,7 +11794,7 @@ fn test_accounts_data_size_from_genesis() {
|
||||||
bank = Arc::new(Bank::new_from_parent(bank, &Pubkey::default(), slot));
|
bank = Arc::new(Bank::new_from_parent(bank, &Pubkey::default(), slot));
|
||||||
|
|
||||||
// Store an account into the bank that is rent-exempt and has data
|
// Store an account into the bank that is rent-exempt and has data
|
||||||
let data_size = rand::thread_rng().gen_range(3333, 4444);
|
let data_size = rand::thread_rng().gen_range(3333..4444);
|
||||||
let transaction = system_transaction::create_account(
|
let transaction = system_transaction::create_account(
|
||||||
&mint_keypair,
|
&mint_keypair,
|
||||||
&Keypair::new(),
|
&Keypair::new(),
|
||||||
|
@ -12978,7 +13000,7 @@ fn test_update_reward_history_in_partition() {
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let i_zero = rng.gen_range(0, expected_num);
|
let i_zero = rng.gen_range(0..expected_num);
|
||||||
if zero_reward {
|
if zero_reward {
|
||||||
// pick one entry to have zero rewards so it gets ignored
|
// pick one entry to have zero rewards so it gets ignored
|
||||||
stake_rewards[i_zero].stake_reward_info.lamports = 0;
|
stake_rewards[i_zero].stake_reward_info.lamports = 0;
|
||||||
|
|
|
@ -209,7 +209,7 @@ mod serde_snapshot_tests {
|
||||||
|
|
||||||
fn check_accounts_local(accounts: &Accounts, pubkeys: &[Pubkey], num: usize) {
|
fn check_accounts_local(accounts: &Accounts, pubkeys: &[Pubkey], num: usize) {
|
||||||
for _ in 1..num {
|
for _ in 1..num {
|
||||||
let idx = thread_rng().gen_range(0, num - 1);
|
let idx = thread_rng().gen_range(0..num - 1);
|
||||||
let ancestors = vec![(0, 0)].into_iter().collect();
|
let ancestors = vec![(0, 0)].into_iter().collect();
|
||||||
let account = accounts.load_without_fixed_root(&ancestors, &pubkeys[idx]);
|
let account = accounts.load_without_fixed_root(&ancestors, &pubkeys[idx]);
|
||||||
let account1 = Some((
|
let account1 = Some((
|
||||||
|
|
|
@ -1056,16 +1056,16 @@ pub(crate) mod tests {
|
||||||
epoch: rng.gen(),
|
epoch: rng.gen(),
|
||||||
..Stakes::default()
|
..Stakes::default()
|
||||||
});
|
});
|
||||||
for _ in 0..rng.gen_range(5usize, 10) {
|
for _ in 0..rng.gen_range(5usize..10) {
|
||||||
let vote_pubkey = solana_sdk::pubkey::new_rand();
|
let vote_pubkey = solana_sdk::pubkey::new_rand();
|
||||||
let vote_account = vote_state::create_account(
|
let vote_account = vote_state::create_account(
|
||||||
&vote_pubkey,
|
&vote_pubkey,
|
||||||
&solana_sdk::pubkey::new_rand(), // node_pubkey
|
&solana_sdk::pubkey::new_rand(), // node_pubkey
|
||||||
rng.gen_range(0, 101), // commission
|
rng.gen_range(0..101), // commission
|
||||||
rng.gen_range(0, 1_000_000), // lamports
|
rng.gen_range(0..1_000_000), // lamports
|
||||||
);
|
);
|
||||||
stakes_cache.check_and_store(&vote_pubkey, &vote_account, None);
|
stakes_cache.check_and_store(&vote_pubkey, &vote_account, None);
|
||||||
for _ in 0..rng.gen_range(10usize, 20) {
|
for _ in 0..rng.gen_range(10usize..20) {
|
||||||
let stake_pubkey = solana_sdk::pubkey::new_rand();
|
let stake_pubkey = solana_sdk::pubkey::new_rand();
|
||||||
let rent = Rent::with_slots_per_epoch(rng.gen());
|
let rent = Rent::with_slots_per_epoch(rng.gen());
|
||||||
let stake_account = stake_state::create_account(
|
let stake_account = stake_state::create_account(
|
||||||
|
@ -1073,7 +1073,7 @@ pub(crate) mod tests {
|
||||||
&vote_pubkey,
|
&vote_pubkey,
|
||||||
&vote_account,
|
&vote_account,
|
||||||
&rent,
|
&rent,
|
||||||
rng.gen_range(0, 1_000_000), // lamports
|
rng.gen_range(0..1_000_000), // lamports
|
||||||
);
|
);
|
||||||
stakes_cache.check_and_store(&stake_pubkey, &stake_account, None);
|
stakes_cache.check_and_store(&stake_pubkey, &stake_account, None);
|
||||||
}
|
}
|
||||||
|
|
|
@ -183,7 +183,7 @@ impl<T: Serialize + Clone> StatusCache<T> {
|
||||||
) {
|
) {
|
||||||
let max_key_index = key.as_ref().len().saturating_sub(CACHED_KEY_SIZE + 1);
|
let max_key_index = key.as_ref().len().saturating_sub(CACHED_KEY_SIZE + 1);
|
||||||
let hash_map = self.cache.entry(*transaction_blockhash).or_insert_with(|| {
|
let hash_map = self.cache.entry(*transaction_blockhash).or_insert_with(|| {
|
||||||
let key_index = thread_rng().gen_range(0, max_key_index + 1);
|
let key_index = thread_rng().gen_range(0..max_key_index + 1);
|
||||||
(slot, key_index, HashMap::new())
|
(slot, key_index, HashMap::new())
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -360,9 +360,9 @@ mod tests {
|
||||||
) -> impl Iterator<Item = (Pubkey, (/*stake:*/ u64, VoteAccount))> + '_ {
|
) -> impl Iterator<Item = (Pubkey, (/*stake:*/ u64, VoteAccount))> + '_ {
|
||||||
let nodes: Vec<_> = repeat_with(Pubkey::new_unique).take(num_nodes).collect();
|
let nodes: Vec<_> = repeat_with(Pubkey::new_unique).take(num_nodes).collect();
|
||||||
repeat_with(move || {
|
repeat_with(move || {
|
||||||
let node = nodes[rng.gen_range(0, nodes.len())];
|
let node = nodes[rng.gen_range(0..nodes.len())];
|
||||||
let (account, _) = new_rand_vote_account(rng, Some(node));
|
let (account, _) = new_rand_vote_account(rng, Some(node));
|
||||||
let stake = rng.gen_range(0, 997);
|
let stake = rng.gen_range(0..997);
|
||||||
let vote_account = VoteAccount::try_from(account).unwrap();
|
let vote_account = VoteAccount::try_from(account).unwrap();
|
||||||
(Pubkey::new_unique(), (stake, vote_account))
|
(Pubkey::new_unique(), (stake, vote_account))
|
||||||
})
|
})
|
||||||
|
@ -489,7 +489,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
// Remove some of the vote accounts.
|
// Remove some of the vote accounts.
|
||||||
for k in 0..256 {
|
for k in 0..256 {
|
||||||
let index = rng.gen_range(0, accounts.len());
|
let index = rng.gen_range(0..accounts.len());
|
||||||
let (pubkey, (_, _)) = accounts.swap_remove(index);
|
let (pubkey, (_, _)) = accounts.swap_remove(index);
|
||||||
vote_accounts.remove(&pubkey);
|
vote_accounts.remove(&pubkey);
|
||||||
if (k + 1) % 32 == 0 {
|
if (k + 1) % 32 == 0 {
|
||||||
|
@ -498,9 +498,9 @@ mod tests {
|
||||||
}
|
}
|
||||||
// Modify the stakes for some of the accounts.
|
// Modify the stakes for some of the accounts.
|
||||||
for k in 0..2048 {
|
for k in 0..2048 {
|
||||||
let index = rng.gen_range(0, accounts.len());
|
let index = rng.gen_range(0..accounts.len());
|
||||||
let (pubkey, (stake, _)) = &mut accounts[index];
|
let (pubkey, (stake, _)) = &mut accounts[index];
|
||||||
let new_stake = rng.gen_range(0, 997);
|
let new_stake = rng.gen_range(0..997);
|
||||||
if new_stake < *stake {
|
if new_stake < *stake {
|
||||||
vote_accounts.sub_stake(pubkey, *stake - new_stake);
|
vote_accounts.sub_stake(pubkey, *stake - new_stake);
|
||||||
} else {
|
} else {
|
||||||
|
@ -513,7 +513,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
// Remove everything.
|
// Remove everything.
|
||||||
while !accounts.is_empty() {
|
while !accounts.is_empty() {
|
||||||
let index = rng.gen_range(0, accounts.len());
|
let index = rng.gen_range(0..accounts.len());
|
||||||
let (pubkey, (_, _)) = accounts.swap_remove(index);
|
let (pubkey, (_, _)) = accounts.swap_remove(index);
|
||||||
vote_accounts.remove(&pubkey);
|
vote_accounts.remove(&pubkey);
|
||||||
if accounts.len() % 32 == 0 {
|
if accounts.len() % 32 == 0 {
|
||||||
|
|
|
@ -51,7 +51,7 @@ fn test_shrink_and_clean() {
|
||||||
while alive_accounts.len() <= 10 {
|
while alive_accounts.len() <= 10 {
|
||||||
alive_accounts.push((
|
alive_accounts.push((
|
||||||
solana_sdk::pubkey::new_rand(),
|
solana_sdk::pubkey::new_rand(),
|
||||||
AccountSharedData::new(thread_rng().gen_range(0, 50), 0, &owner),
|
AccountSharedData::new(thread_rng().gen_range(0..50), 0, &owner),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,8 +96,8 @@ fn test_bad_bank_hash() {
|
||||||
.into_par_iter()
|
.into_par_iter()
|
||||||
.map(|_| {
|
.map(|_| {
|
||||||
let key = solana_sdk::pubkey::new_rand();
|
let key = solana_sdk::pubkey::new_rand();
|
||||||
let lamports = thread_rng().gen_range(0, 100);
|
let lamports = thread_rng().gen_range(0..100);
|
||||||
let some_data_len = thread_rng().gen_range(0, 1000);
|
let some_data_len = thread_rng().gen_range(0..1000);
|
||||||
let account = AccountSharedData::new(lamports, some_data_len, &key);
|
let account = AccountSharedData::new(lamports, some_data_len, &key);
|
||||||
(key, account)
|
(key, account)
|
||||||
})
|
})
|
||||||
|
@ -113,11 +113,11 @@ fn test_bad_bank_hash() {
|
||||||
info!("i: {}", i);
|
info!("i: {}", i);
|
||||||
last_print = Instant::now();
|
last_print = Instant::now();
|
||||||
}
|
}
|
||||||
let num_accounts = thread_rng().gen_range(0, 100);
|
let num_accounts = thread_rng().gen_range(0..100);
|
||||||
(0..num_accounts).for_each(|_| {
|
(0..num_accounts).for_each(|_| {
|
||||||
let mut idx;
|
let mut idx;
|
||||||
loop {
|
loop {
|
||||||
idx = thread_rng().gen_range(0, max_accounts);
|
idx = thread_rng().gen_range(0..max_accounts);
|
||||||
if existing.contains(&idx) {
|
if existing.contains(&idx) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -126,7 +126,7 @@ fn test_bad_bank_hash() {
|
||||||
}
|
}
|
||||||
accounts_keys[idx]
|
accounts_keys[idx]
|
||||||
.1
|
.1
|
||||||
.set_lamports(thread_rng().gen_range(0, 1000));
|
.set_lamports(thread_rng().gen_range(0..1000));
|
||||||
});
|
});
|
||||||
|
|
||||||
let account_refs: Vec<_> = existing
|
let account_refs: Vec<_> = existing
|
||||||
|
|
|
@ -26,7 +26,7 @@ full = [
|
||||||
"generic-array",
|
"generic-array",
|
||||||
"memmap2",
|
"memmap2",
|
||||||
"rand",
|
"rand",
|
||||||
"rand_chacha",
|
"rand0-7",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"ed25519-dalek",
|
"ed25519-dalek",
|
||||||
"ed25519-dalek-bip32",
|
"ed25519-dalek-bip32",
|
||||||
|
@ -65,7 +65,7 @@ num_enum = { workspace = true }
|
||||||
pbkdf2 = { workspace = true }
|
pbkdf2 = { workspace = true }
|
||||||
qstring = { workspace = true }
|
qstring = { workspace = true }
|
||||||
rand = { workspace = true, optional = true }
|
rand = { workspace = true, optional = true }
|
||||||
rand_chacha = { workspace = true, optional = true }
|
rand0-7 = { package = "rand", version = "0.7", optional = true }
|
||||||
rustversion = { workspace = true }
|
rustversion = { workspace = true }
|
||||||
serde = { workspace = true }
|
serde = { workspace = true }
|
||||||
serde_bytes = { workspace = true }
|
serde_bytes = { workspace = true }
|
||||||
|
|
|
@ -44,7 +44,7 @@ thiserror = { workspace = true }
|
||||||
# Remove this once borsh 0.11 or 1.0 is released, which correctly declares the
|
# Remove this once borsh 0.11 or 1.0 is released, which correctly declares the
|
||||||
# hashbrown dependency as optional.
|
# hashbrown dependency as optional.
|
||||||
[target.'cfg(target_os = "solana")'.dependencies]
|
[target.'cfg(target_os = "solana")'.dependencies]
|
||||||
getrandom = { version = "0.2", features = ["custom"] }
|
getrandom = { workspace = true, features = ["custom"] }
|
||||||
|
|
||||||
[target.'cfg(not(target_os = "solana"))'.dependencies]
|
[target.'cfg(not(target_os = "solana"))'.dependencies]
|
||||||
ark-bn254 = { workspace = true }
|
ark-bn254 = { workspace = true }
|
||||||
|
@ -60,7 +60,6 @@ libc = { workspace = true, features = ["extra_traits"] }
|
||||||
libsecp256k1 = { workspace = true }
|
libsecp256k1 = { workspace = true }
|
||||||
num-bigint = { workspace = true }
|
num-bigint = { workspace = true }
|
||||||
rand = { workspace = true }
|
rand = { workspace = true }
|
||||||
rand_chacha = { workspace = true }
|
|
||||||
tiny-bip39 = { workspace = true }
|
tiny-bip39 = { workspace = true }
|
||||||
wasm-bindgen = { workspace = true }
|
wasm-bindgen = { workspace = true }
|
||||||
zeroize = { workspace = true, features = ["default", "zeroize_derive"] }
|
zeroize = { workspace = true, features = ["default", "zeroize_derive"] }
|
||||||
|
@ -72,7 +71,7 @@ solana-logger = { workspace = true }
|
||||||
console_error_panic_hook = { workspace = true }
|
console_error_panic_hook = { workspace = true }
|
||||||
console_log = { workspace = true }
|
console_log = { workspace = true }
|
||||||
js-sys = { workspace = true }
|
js-sys = { workspace = true }
|
||||||
getrandom = { version = "0.2", features = ["js", "wasm-bindgen"] }
|
getrandom = { workspace = true, features = ["js", "wasm-bindgen"] }
|
||||||
|
|
||||||
[target.'cfg(not(target_pointer_width = "64"))'.dependencies]
|
[target.'cfg(not(target_pointer_width = "64"))'.dependencies]
|
||||||
parking_lot = { workspace = true }
|
parking_lot = { workspace = true }
|
||||||
|
|
|
@ -181,10 +181,10 @@ mod tests {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
for _ in 0..100_000 {
|
for _ in 0..100_000 {
|
||||||
let dummy = Dummy {
|
let dummy = Dummy {
|
||||||
a: rng.gen::<u32>() >> rng.gen_range(0, u32::BITS),
|
a: rng.gen::<u32>() >> rng.gen_range(0..u32::BITS),
|
||||||
b: rng.gen::<u64>() >> rng.gen_range(0, u64::BITS),
|
b: rng.gen::<u64>() >> rng.gen_range(0..u64::BITS),
|
||||||
c: rng.gen::<u64>() >> rng.gen_range(0, u64::BITS),
|
c: rng.gen::<u64>() >> rng.gen_range(0..u64::BITS),
|
||||||
d: rng.gen::<u32>() >> rng.gen_range(0, u32::BITS),
|
d: rng.gen::<u32>() >> rng.gen_range(0..u32::BITS),
|
||||||
};
|
};
|
||||||
let bytes = bincode::serialize(&dummy).unwrap();
|
let bytes = bincode::serialize(&dummy).unwrap();
|
||||||
let other: Dummy = bincode::deserialize(&bytes).unwrap();
|
let other: Dummy = bincode::deserialize(&bytes).unwrap();
|
||||||
|
|
|
@ -1214,8 +1214,8 @@ mod tests {
|
||||||
|
|
||||||
fn run_serde_compact_vote_state_update<R: Rng>(rng: &mut R) {
|
fn run_serde_compact_vote_state_update<R: Rng>(rng: &mut R) {
|
||||||
let lockouts: VecDeque<_> = std::iter::repeat_with(|| {
|
let lockouts: VecDeque<_> = std::iter::repeat_with(|| {
|
||||||
let slot = 149_303_885_u64.saturating_add(rng.gen_range(0, 10_000));
|
let slot = 149_303_885_u64.saturating_add(rng.gen_range(0..10_000));
|
||||||
let confirmation_count = rng.gen_range(0, 33);
|
let confirmation_count = rng.gen_range(0..33);
|
||||||
Lockout::new_with_confirmation_count(slot, confirmation_count)
|
Lockout::new_with_confirmation_count(slot, confirmation_count)
|
||||||
})
|
})
|
||||||
.take(32)
|
.take(32)
|
||||||
|
@ -1224,7 +1224,7 @@ mod tests {
|
||||||
let root = rng.gen_ratio(1, 2).then(|| {
|
let root = rng.gen_ratio(1, 2).then(|| {
|
||||||
lockouts[0]
|
lockouts[0]
|
||||||
.slot()
|
.slot()
|
||||||
.checked_sub(rng.gen_range(0, 1_000))
|
.checked_sub(rng.gen_range(0..1_000))
|
||||||
.expect("All slots should be greater than 1_000")
|
.expect("All slots should be greater than 1_000")
|
||||||
});
|
});
|
||||||
let timestamp = rng.gen_ratio(1, 2).then(|| rng.gen());
|
let timestamp = rng.gen_ratio(1, 2).then(|| rng.gen());
|
||||||
|
|
|
@ -188,7 +188,7 @@ pub mod test {
|
||||||
signature::{Keypair, Signer},
|
signature::{Keypair, Signer},
|
||||||
transaction::Transaction,
|
transaction::Transaction,
|
||||||
},
|
},
|
||||||
rand::{thread_rng, Rng},
|
rand0_7::{thread_rng, Rng},
|
||||||
};
|
};
|
||||||
|
|
||||||
fn test_case(
|
fn test_case(
|
||||||
|
|
|
@ -6,10 +6,14 @@
|
||||||
pub use solana_program::hash::*;
|
pub use solana_program::hash::*;
|
||||||
|
|
||||||
/// Random hash value for tests and benchmarks.
|
/// Random hash value for tests and benchmarks.
|
||||||
|
#[deprecated(
|
||||||
|
since = "1.17.0",
|
||||||
|
note = "Please use `Hash::new_unique()` for testing, or fill 32 bytes with any source of randomness"
|
||||||
|
)]
|
||||||
#[cfg(feature = "full")]
|
#[cfg(feature = "full")]
|
||||||
pub fn new_rand<R: ?Sized>(rng: &mut R) -> Hash
|
pub fn new_rand<R: ?Sized>(rng: &mut R) -> Hash
|
||||||
where
|
where
|
||||||
R: rand::Rng,
|
R: rand0_7::Rng,
|
||||||
{
|
{
|
||||||
let mut buf = [0u8; HASH_BYTES];
|
let mut buf = [0u8; HASH_BYTES];
|
||||||
rng.fill(&mut buf);
|
rng.fill(&mut buf);
|
||||||
|
|
|
@ -733,7 +733,7 @@
|
||||||
//! // Sign some messages.
|
//! // Sign some messages.
|
||||||
//! let mut signatures = vec![];
|
//! let mut signatures = vec![];
|
||||||
//! for idx in 0..2 {
|
//! for idx in 0..2 {
|
||||||
//! let secret_key = libsecp256k1::SecretKey::random(&mut rand::thread_rng());
|
//! let secret_key = libsecp256k1::SecretKey::random(&mut rand0_7::thread_rng());
|
||||||
//! let message = format!("hello world {}", idx).into_bytes();
|
//! let message = format!("hello world {}", idx).into_bytes();
|
||||||
//! let message_hash = {
|
//! let message_hash = {
|
||||||
//! let mut hasher = keccak::Hasher::default();
|
//! let mut hasher = keccak::Hasher::default();
|
||||||
|
@ -1059,7 +1059,7 @@ pub mod test {
|
||||||
signature::{Keypair, Signer},
|
signature::{Keypair, Signer},
|
||||||
transaction::Transaction,
|
transaction::Transaction,
|
||||||
},
|
},
|
||||||
rand::{thread_rng, Rng},
|
rand0_7::{thread_rng, Rng},
|
||||||
};
|
};
|
||||||
|
|
||||||
fn test_case(
|
fn test_case(
|
||||||
|
|
|
@ -10,7 +10,7 @@ use {
|
||||||
ed25519_dalek::Signer as DalekSigner,
|
ed25519_dalek::Signer as DalekSigner,
|
||||||
ed25519_dalek_bip32::Error as Bip32Error,
|
ed25519_dalek_bip32::Error as Bip32Error,
|
||||||
hmac::Hmac,
|
hmac::Hmac,
|
||||||
rand::{rngs::OsRng, CryptoRng, RngCore},
|
rand0_7::{rngs::OsRng, CryptoRng, RngCore},
|
||||||
std::{
|
std::{
|
||||||
error,
|
error,
|
||||||
io::{Read, Write},
|
io::{Read, Write},
|
||||||
|
@ -25,6 +25,9 @@ use {
|
||||||
pub struct Keypair(ed25519_dalek::Keypair);
|
pub struct Keypair(ed25519_dalek::Keypair);
|
||||||
|
|
||||||
impl Keypair {
|
impl Keypair {
|
||||||
|
/// Can be used for generating a Keypair without a dependency on `rand` types
|
||||||
|
pub const SECRET_KEY_LENGTH: usize = 32;
|
||||||
|
|
||||||
/// Constructs a new, random `Keypair` using a caller-provided RNG
|
/// Constructs a new, random `Keypair` using a caller-provided RNG
|
||||||
pub fn generate<R>(csprng: &mut R) -> Self
|
pub fn generate<R>(csprng: &mut R) -> Self
|
||||||
where
|
where
|
||||||
|
@ -80,6 +83,9 @@ impl Keypair {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
static_assertions::const_assert_eq!(Keypair::SECRET_KEY_LENGTH, ed25519_dalek::SECRET_KEY_LENGTH);
|
||||||
|
|
||||||
impl Signer for Keypair {
|
impl Signer for Keypair {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn pubkey(&self) -> Pubkey {
|
fn pubkey(&self) -> Pubkey {
|
||||||
|
|
|
@ -996,10 +996,12 @@ impl ConnectionTable {
|
||||||
// If the stakes of all the sampled connections are higher than the
|
// If the stakes of all the sampled connections are higher than the
|
||||||
// threshold_stake, rejects the pruning attempt, and returns 0.
|
// threshold_stake, rejects the pruning attempt, and returns 0.
|
||||||
fn prune_random(&mut self, sample_size: usize, threshold_stake: u64) -> usize {
|
fn prune_random(&mut self, sample_size: usize, threshold_stake: u64) -> usize {
|
||||||
let mut rng = thread_rng();
|
|
||||||
let num_pruned = std::iter::once(self.table.len())
|
let num_pruned = std::iter::once(self.table.len())
|
||||||
.filter(|&size| size > 0)
|
.filter(|&size| size > 0)
|
||||||
.flat_map(|size| repeat_with(move || rng.gen_range(0, size)))
|
.flat_map(|size| {
|
||||||
|
let mut rng = thread_rng();
|
||||||
|
repeat_with(move || rng.gen_range(0..size))
|
||||||
|
})
|
||||||
.map(|index| {
|
.map(|index| {
|
||||||
let connection = self.table[index].first();
|
let connection = self.table[index].first();
|
||||||
let stake = connection.map(|connection| connection.stake);
|
let stake = connection.map(|connection| connection.stake);
|
||||||
|
|
|
@ -16,7 +16,6 @@ futures-util = { workspace = true }
|
||||||
indexmap = { workspace = true }
|
indexmap = { workspace = true }
|
||||||
indicatif = { workspace = true, optional = true }
|
indicatif = { workspace = true, optional = true }
|
||||||
log = { workspace = true }
|
log = { workspace = true }
|
||||||
rand = { workspace = true }
|
|
||||||
rayon = { workspace = true }
|
rayon = { workspace = true }
|
||||||
solana-connection-cache = { workspace = true }
|
solana-connection-cache = { workspace = true }
|
||||||
solana-measure = { workspace = true }
|
solana-measure = { workspace = true }
|
||||||
|
@ -28,9 +27,6 @@ solana-sdk = { workspace = true }
|
||||||
thiserror = { workspace = true }
|
thiserror = { workspace = true }
|
||||||
tokio = { workspace = true, features = ["full"] }
|
tokio = { workspace = true, features = ["full"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
|
||||||
rand_chacha = { workspace = true }
|
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["spinner"]
|
default = ["spinner"]
|
||||||
# Support tpu-client methods that feature a spinner progress bar for
|
# Support tpu-client methods that feature a spinner progress bar for
|
||||||
|
|
|
@ -126,7 +126,7 @@ fn make_dos_message(
|
||||||
) -> Message {
|
) -> Message {
|
||||||
let instructions: Vec<_> = (0..num_instructions)
|
let instructions: Vec<_> = (0..num_instructions)
|
||||||
.map(|_| {
|
.map(|_| {
|
||||||
let data = [num_program_iterations, thread_rng().gen_range(0, 255)];
|
let data = [num_program_iterations, thread_rng().gen_range(0..255)];
|
||||||
Instruction::new_with_bytes(program_id, &data, account_metas.to_vec())
|
Instruction::new_with_bytes(program_id, &data, account_metas.to_vec())
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
|
@ -60,7 +60,7 @@ fn broadcast_shreds_bench(bencher: &mut Bencher) {
|
||||||
let id = pubkey::new_rand();
|
let id = pubkey::new_rand();
|
||||||
let contact_info = ContactInfo::new_localhost(&id, timestamp());
|
let contact_info = ContactInfo::new_localhost(&id, timestamp());
|
||||||
cluster_info.insert_info(contact_info);
|
cluster_info.insert_info(contact_info);
|
||||||
stakes.insert(id, thread_rng().gen_range(1, NUM_PEERS) as u64);
|
stakes.insert(id, thread_rng().gen_range(1..NUM_PEERS) as u64);
|
||||||
}
|
}
|
||||||
let cluster_info = Arc::new(cluster_info);
|
let cluster_info = Arc::new(cluster_info);
|
||||||
let cluster_nodes_cache = ClusterNodesCache::<BroadcastStage>::new(
|
let cluster_nodes_cache = ClusterNodesCache::<BroadcastStage>::new(
|
||||||
|
|
|
@ -441,12 +441,12 @@ pub fn make_test_cluster<R: Rng>(
|
||||||
if rng.gen_ratio(unstaked_numerator, unstaked_denominator) {
|
if rng.gen_ratio(unstaked_numerator, unstaked_denominator) {
|
||||||
None // No stake for some of the nodes.
|
None // No stake for some of the nodes.
|
||||||
} else {
|
} else {
|
||||||
Some((*node.pubkey(), rng.gen_range(0, 20)))
|
Some((*node.pubkey(), rng.gen_range(0..20)))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
// Add some staked nodes with no contact-info.
|
// Add some staked nodes with no contact-info.
|
||||||
stakes.extend(repeat_with(|| (Pubkey::new_unique(), rng.gen_range(0, 20))).take(100));
|
stakes.extend(repeat_with(|| (Pubkey::new_unique(), rng.gen_range(0..20))).take(100));
|
||||||
let cluster_info = ClusterInfo::new(this_node, keypair, SocketAddrSpace::Unspecified);
|
let cluster_info = ClusterInfo::new(this_node, keypair, SocketAddrSpace::Unspecified);
|
||||||
let nodes: Vec<_> = nodes
|
let nodes: Vec<_> = nodes
|
||||||
.iter()
|
.iter()
|
||||||
|
|
|
@ -744,7 +744,7 @@ fn get_rpc_nodes(
|
||||||
blacklist_timeout = Instant::now();
|
blacklist_timeout = Instant::now();
|
||||||
get_rpc_peers_timout = Instant::now();
|
get_rpc_peers_timout = Instant::now();
|
||||||
if bootstrap_config.no_snapshot_fetch {
|
if bootstrap_config.no_snapshot_fetch {
|
||||||
let random_peer = &rpc_peers[thread_rng().gen_range(0, rpc_peers.len())];
|
let random_peer = &rpc_peers[thread_rng().gen_range(0..rpc_peers.len())];
|
||||||
return Ok(vec![GetRpcNodeResult {
|
return Ok(vec![GetRpcNodeResult {
|
||||||
rpc_contact_info: random_peer.clone(),
|
rpc_contact_info: random_peer.clone(),
|
||||||
snapshot_hash: None,
|
snapshot_hash: None,
|
||||||
|
|
|
@ -24,11 +24,11 @@ aes-gcm-siv = { workspace = true }
|
||||||
bincode = { workspace = true }
|
bincode = { workspace = true }
|
||||||
byteorder = { workspace = true }
|
byteorder = { workspace = true }
|
||||||
curve25519-dalek = { workspace = true, features = ["serde"] }
|
curve25519-dalek = { workspace = true, features = ["serde"] }
|
||||||
getrandom = { workspace = true, features = ["dummy"] }
|
getrandom = { version = "0.1", features = ["dummy"] }
|
||||||
itertools = { workspace = true }
|
itertools = { workspace = true }
|
||||||
lazy_static = { workspace = true }
|
lazy_static = { workspace = true }
|
||||||
merlin = { workspace = true }
|
merlin = { workspace = true }
|
||||||
rand = { workspace = true }
|
rand = { version = "0.7" }
|
||||||
serde = { workspace = true, features = ["derive"] }
|
serde = { workspace = true, features = ["derive"] }
|
||||||
serde_json = { workspace = true }
|
serde_json = { workspace = true }
|
||||||
sha3 = "0.9"
|
sha3 = "0.9"
|
||||||
|
|
Loading…
Reference in New Issue