diff --git a/Cargo.lock b/Cargo.lock index 504f6c0505f8f5..75e3182231af90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2163,7 +2163,7 @@ dependencies = [ [[package]] name = "gen-headers" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "regex", @@ -2171,7 +2171,7 @@ dependencies = [ [[package]] name = "gen-syscall-list" -version = "1.18.12" +version = "1.18.13" dependencies = [ "regex", ] @@ -4153,7 +4153,7 @@ dependencies = [ [[package]] name = "proto" -version = "1.18.12" +version = "1.18.13" dependencies = [ "protobuf-src", "tonic-build", @@ -4396,7 +4396,7 @@ dependencies = [ [[package]] name = "rbpf-cli" -version = "1.18.12" +version = "1.18.13" [[package]] name = "rcgen" @@ -5221,7 +5221,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.18.12" +version = "1.18.13" dependencies = [ "Inflector", "assert_matches", @@ -5246,7 +5246,7 @@ dependencies = [ [[package]] name = "solana-accounts-bench" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 2.33.3", "log", @@ -5260,7 +5260,7 @@ dependencies = [ [[package]] name = "solana-accounts-cluster-bench" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 2.33.3", "log", @@ -5290,7 +5290,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.18.12" +version = "1.18.13" dependencies = [ "arrayref", "assert_matches", @@ -5357,7 +5357,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "bytemuck", @@ -5376,7 +5376,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program-tests" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -5387,7 +5387,7 @@ dependencies = [ [[package]] name = "solana-banking-bench" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5411,7 +5411,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "borsh 1.2.1", "futures 0.3.30", @@ -5428,7 +5428,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.18.12" +version = "1.18.13" dependencies = [ "serde", "solana-sdk", @@ -5437,7 +5437,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "crossbeam-channel", @@ -5455,7 +5455,7 @@ dependencies = [ [[package]] name = "solana-bench-streamer" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 3.2.23", "crossbeam-channel", @@ -5466,7 +5466,7 @@ dependencies = [ [[package]] name = "solana-bench-tps" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 2.33.3", "crossbeam-channel", @@ -5507,7 +5507,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bv", "fnv", @@ -5524,7 +5524,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -5545,7 +5545,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program-tests" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -5556,7 +5556,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bv", "bytemuck", @@ -5575,7 +5575,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-bpf" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "solana-logger", @@ -5583,7 +5583,7 @@ dependencies = [ [[package]] name = "solana-cargo-build-sbf" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_cmd", "bzip2", @@ -5604,7 +5604,7 @@ dependencies = [ [[package]] name = "solana-cargo-registry" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 2.33.3", "flate2", @@ -5633,11 +5633,11 @@ dependencies = [ [[package]] name = "solana-cargo-test-bpf" -version = "1.18.12" +version = "1.18.13" [[package]] name = "solana-cargo-test-sbf" -version = "1.18.12" +version = "1.18.13" dependencies = [ "cargo_metadata", "clap 3.2.23", @@ -5648,7 +5648,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "chrono", @@ -5665,7 +5665,7 @@ dependencies = [ [[package]] name = "solana-clap-v3-utils" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "chrono", @@ -5683,7 +5683,7 @@ dependencies = [ [[package]] name = "solana-cli" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -5738,7 +5738,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.18.12" +version = "1.18.13" dependencies = [ "anyhow", "dirs-next", @@ -5753,7 +5753,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.18.12" +version = "1.18.13" dependencies = [ "Inflector", "base64 0.21.7", @@ -5779,7 +5779,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-trait", "bincode", @@ -5811,7 +5811,7 @@ dependencies = [ [[package]] name = "solana-client-test" -version = "1.18.12" +version = "1.18.13" dependencies = [ "futures-util", "rand 0.8.5", @@ -5841,7 +5841,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -5849,7 +5849,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "chrono", @@ -5862,7 +5862,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-trait", "bincode", @@ -5886,7 +5886,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "base64 0.21.7", @@ -5972,7 +5972,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.18.12" +version = "1.18.13" dependencies = [ "lazy_static", "log", @@ -5997,7 +5997,7 @@ dependencies = [ [[package]] name = "solana-dos" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "clap 3.2.23", @@ -6027,7 +6027,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.18.12" +version = "1.18.13" dependencies = [ "console", "indicatif", @@ -6039,7 +6039,7 @@ dependencies = [ [[package]] name = "solana-ed25519-program-tests" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "ed25519-dalek", @@ -6050,7 +6050,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -6072,7 +6072,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "byteorder", @@ -6094,7 +6094,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bitflags 2.4.2", "block-buffer 0.10.4", @@ -6119,7 +6119,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.18.12" +version = "1.18.13" dependencies = [ "proc-macro2", "quote", @@ -6129,7 +6129,7 @@ dependencies = [ [[package]] name = "solana-genesis" -version = "1.18.12" +version = "1.18.13" dependencies = [ "base64 0.21.7", "bincode", @@ -6154,7 +6154,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "solana-accounts-db", @@ -6165,7 +6165,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "solana-sdk", @@ -6175,7 +6175,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bs58", "crossbeam-channel", @@ -6200,7 +6200,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -6251,7 +6251,7 @@ dependencies = [ [[package]] name = "solana-install" -version = "1.18.12" +version = "1.18.13" dependencies = [ "atty", "bincode", @@ -6286,7 +6286,7 @@ dependencies = [ [[package]] name = "solana-keygen" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bs58", "clap 3.2.23", @@ -6303,7 +6303,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -6372,7 +6372,7 @@ dependencies = [ [[package]] name = "solana-ledger-tool" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_cmd", "bs58", @@ -6423,7 +6423,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "log", @@ -6435,7 +6435,7 @@ dependencies = [ [[package]] name = "solana-local-cluster" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "crossbeam-channel", @@ -6474,7 +6474,7 @@ dependencies = [ [[package]] name = "solana-log-analyzer" -version = "1.18.12" +version = "1.18.13" dependencies = [ "byte-unit", "clap 3.2.23", @@ -6486,7 +6486,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.18.12" +version = "1.18.13" dependencies = [ "env_logger", "lazy_static", @@ -6495,7 +6495,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "solana-sdk", @@ -6503,11 +6503,11 @@ dependencies = [ [[package]] name = "solana-memory-management" -version = "1.18.12" +version = "1.18.13" [[package]] name = "solana-merkle-root-bench" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 2.33.3", "log", @@ -6520,7 +6520,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.18.12" +version = "1.18.13" dependencies = [ "fast-math", "hex", @@ -6529,7 +6529,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.18.12" +version = "1.18.13" dependencies = [ "crossbeam-channel", "env_logger", @@ -6545,7 +6545,7 @@ dependencies = [ [[package]] name = "solana-net-shaper" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 3.2.23", "rand 0.8.5", @@ -6556,7 +6556,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "clap 3.2.23", @@ -6582,7 +6582,7 @@ checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" [[package]] name = "solana-notifier" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "reqwest", @@ -6592,7 +6592,7 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.18.12" +version = "1.18.13" dependencies = [ "ahash 0.8.7", "assert_matches", @@ -6623,7 +6623,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -6645,7 +6645,7 @@ dependencies = [ [[package]] name = "solana-poh-bench" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 3.2.23", "log", @@ -6660,7 +6660,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "anyhow", "ark-bn254", @@ -6718,7 +6718,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "base64 0.21.7", @@ -6747,7 +6747,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "async-trait", @@ -6776,7 +6776,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "anyhow", "crossbeam-channel", @@ -6800,7 +6800,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-mutex", "async-trait", @@ -6828,7 +6828,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.18.12" +version = "1.18.13" dependencies = [ "lazy_static", "num_cpus", @@ -6836,7 +6836,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "console", @@ -6855,7 +6855,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.18.12" +version = "1.18.13" dependencies = [ "base64 0.21.7", "bincode", @@ -6914,7 +6914,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "async-trait", @@ -6943,7 +6943,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.18.12" +version = "1.18.13" dependencies = [ "base64 0.21.7", "bs58", @@ -6963,7 +6963,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.18.12" +version = "1.18.13" dependencies = [ "anyhow", "clap 2.33.3", @@ -6980,7 +6980,7 @@ dependencies = [ [[package]] name = "solana-rpc-test" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "bs58", @@ -7007,7 +7007,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.18.12" +version = "1.18.13" dependencies = [ "aquamarine", "arrayref", @@ -7090,7 +7090,7 @@ dependencies = [ [[package]] name = "solana-runtime-transaction" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "log", @@ -7104,7 +7104,7 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.18.12" +version = "1.18.13" dependencies = [ "anyhow", "assert_matches", @@ -7163,7 +7163,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bs58", "proc-macro2", @@ -7180,7 +7180,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.18.12" +version = "1.18.13" dependencies = [ "crossbeam-channel", "log", @@ -7195,7 +7195,7 @@ dependencies = [ [[package]] name = "solana-stake-accounts" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -7211,7 +7211,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -7228,7 +7228,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.18.12" +version = "1.18.13" dependencies = [ "backoff", "bincode", @@ -7260,7 +7260,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "bs58", @@ -7276,7 +7276,7 @@ dependencies = [ [[package]] name = "solana-store-tool" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 2.33.3", "log", @@ -7288,7 +7288,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "async-channel", @@ -7321,7 +7321,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -7335,7 +7335,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.18.12" +version = "1.18.13" dependencies = [ "base64 0.21.7", "bincode", @@ -7365,7 +7365,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "log", @@ -7379,7 +7379,7 @@ dependencies = [ [[package]] name = "solana-tokens" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -7412,7 +7412,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-trait", "bincode", @@ -7434,7 +7434,7 @@ dependencies = [ [[package]] name = "solana-transaction-dos" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "clap 2.33.3", @@ -7461,7 +7461,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.18.12" +version = "1.18.13" dependencies = [ "Inflector", "base64 0.21.7", @@ -7484,7 +7484,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -7522,7 +7522,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-trait", "solana-connection-cache", @@ -7535,11 +7535,11 @@ dependencies = [ [[package]] name = "solana-unified-scheduler-logic" -version = "1.18.12" +version = "1.18.13" [[package]] name = "solana-unified-scheduler-pool" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "solana-ledger", @@ -7553,7 +7553,7 @@ dependencies = [ [[package]] name = "solana-upload-perf" -version = "1.18.12" +version = "1.18.13" dependencies = [ "serde_json", "solana-metrics", @@ -7561,7 +7561,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.18.12" +version = "1.18.13" dependencies = [ "chrono", "clap 2.33.3", @@ -7625,7 +7625,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "rustc_version 0.4.0", @@ -7639,7 +7639,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "crossbeam-channel", @@ -7658,7 +7658,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -7681,7 +7681,7 @@ dependencies = [ [[package]] name = "solana-watchtower" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 2.33.3", "humantime", @@ -7700,7 +7700,7 @@ dependencies = [ [[package]] name = "solana-wen-restart" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "prost", @@ -7722,7 +7722,7 @@ dependencies = [ [[package]] name = "solana-zk-keygen" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bs58", "clap 3.2.23", @@ -7741,7 +7741,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bytemuck", "criterion", @@ -7755,7 +7755,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program-tests" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bytemuck", "curve25519-dalek", @@ -7767,7 +7767,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.18.12" +version = "1.18.13" dependencies = [ "aes-gcm-siv", "base64 0.21.7", diff --git a/Cargo.toml b/Cargo.toml index 8aebe3d60d69be..d6f708621172f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -126,7 +126,7 @@ exclude = ["programs/sbf"] resolver = "2" [workspace.package] -version = "1.18.12" +version = "1.18.13" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" homepage = "https://solanalabs.com/" @@ -307,86 +307,86 @@ smallvec = "1.13.2" smpl_jwt = "0.7.1" socket2 = "0.5.5" soketto = "0.7" -solana-account-decoder = { path = "account-decoder", version = "=1.18.12" } -solana-accounts-db = { path = "accounts-db", version = "=1.18.12" } -solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.18.12" } -solana-banks-client = { path = "banks-client", version = "=1.18.12" } -solana-banks-interface = { path = "banks-interface", version = "=1.18.12" } -solana-banks-server = { path = "banks-server", version = "=1.18.12" } -solana-bench-tps = { path = "bench-tps", version = "=1.18.12" } -solana-bloom = { path = "bloom", version = "=1.18.12" } -solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.18.12" } -solana-bucket-map = { path = "bucket_map", version = "=1.18.12" } -solana-cargo-registry = { path = "cargo-registry", version = "=1.18.12" } -solana-clap-utils = { path = "clap-utils", version = "=1.18.12" } -solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.18.12" } -solana-cli = { path = "cli", version = "=1.18.12" } -solana-cli-config = { path = "cli-config", version = "=1.18.12" } -solana-cli-output = { path = "cli-output", version = "=1.18.12" } -solana-client = { path = "client", version = "=1.18.12" } -solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.18.12" } -solana-config-program = { path = "programs/config", version = "=1.18.12" } -solana-connection-cache = { path = "connection-cache", version = "=1.18.12", default-features = false } -solana-core = { path = "core", version = "=1.18.12" } -solana-cost-model = { path = "cost-model", version = "=1.18.12" } -solana-download-utils = { path = "download-utils", version = "=1.18.12" } -solana-entry = { path = "entry", version = "=1.18.12" } -solana-faucet = { path = "faucet", version = "=1.18.12" } -solana-frozen-abi = { path = "frozen-abi", version = "=1.18.12" } -solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.18.12" } -solana-genesis = { path = "genesis", version = "=1.18.12" } -solana-genesis-utils = { path = "genesis-utils", version = "=1.18.12" } -solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.18.12" } -solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.18.12" } -solana-gossip = { path = "gossip", version = "=1.18.12" } -solana-ledger = { path = "ledger", version = "=1.18.12" } -solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.18.12" } -solana-local-cluster = { path = "local-cluster", version = "=1.18.12" } -solana-logger = { path = "logger", version = "=1.18.12" } -solana-measure = { path = "measure", version = "=1.18.12" } -solana-merkle-tree = { path = "merkle-tree", version = "=1.18.12" } -solana-metrics = { path = "metrics", version = "=1.18.12" } -solana-net-utils = { path = "net-utils", version = "=1.18.12" } +solana-account-decoder = { path = "account-decoder", version = "=1.18.13" } +solana-accounts-db = { path = "accounts-db", version = "=1.18.13" } +solana-address-lookup-table-program = { path = "programs/address-lookup-table", version = "=1.18.13" } +solana-banks-client = { path = "banks-client", version = "=1.18.13" } +solana-banks-interface = { path = "banks-interface", version = "=1.18.13" } +solana-banks-server = { path = "banks-server", version = "=1.18.13" } +solana-bench-tps = { path = "bench-tps", version = "=1.18.13" } +solana-bloom = { path = "bloom", version = "=1.18.13" } +solana-bpf-loader-program = { path = "programs/bpf_loader", version = "=1.18.13" } +solana-bucket-map = { path = "bucket_map", version = "=1.18.13" } +solana-cargo-registry = { path = "cargo-registry", version = "=1.18.13" } +solana-clap-utils = { path = "clap-utils", version = "=1.18.13" } +solana-clap-v3-utils = { path = "clap-v3-utils", version = "=1.18.13" } +solana-cli = { path = "cli", version = "=1.18.13" } +solana-cli-config = { path = "cli-config", version = "=1.18.13" } +solana-cli-output = { path = "cli-output", version = "=1.18.13" } +solana-client = { path = "client", version = "=1.18.13" } +solana-compute-budget-program = { path = "programs/compute-budget", version = "=1.18.13" } +solana-config-program = { path = "programs/config", version = "=1.18.13" } +solana-connection-cache = { path = "connection-cache", version = "=1.18.13", default-features = false } +solana-core = { path = "core", version = "=1.18.13" } +solana-cost-model = { path = "cost-model", version = "=1.18.13" } +solana-download-utils = { path = "download-utils", version = "=1.18.13" } +solana-entry = { path = "entry", version = "=1.18.13" } +solana-faucet = { path = "faucet", version = "=1.18.13" } +solana-frozen-abi = { path = "frozen-abi", version = "=1.18.13" } +solana-frozen-abi-macro = { path = "frozen-abi/macro", version = "=1.18.13" } +solana-genesis = { path = "genesis", version = "=1.18.13" } +solana-genesis-utils = { path = "genesis-utils", version = "=1.18.13" } +solana-geyser-plugin-interface = { path = "geyser-plugin-interface", version = "=1.18.13" } +solana-geyser-plugin-manager = { path = "geyser-plugin-manager", version = "=1.18.13" } +solana-gossip = { path = "gossip", version = "=1.18.13" } +solana-ledger = { path = "ledger", version = "=1.18.13" } +solana-loader-v4-program = { path = "programs/loader-v4", version = "=1.18.13" } +solana-local-cluster = { path = "local-cluster", version = "=1.18.13" } +solana-logger = { path = "logger", version = "=1.18.13" } +solana-measure = { path = "measure", version = "=1.18.13" } +solana-merkle-tree = { path = "merkle-tree", version = "=1.18.13" } +solana-metrics = { path = "metrics", version = "=1.18.13" } +solana-net-utils = { path = "net-utils", version = "=1.18.13" } solana-nohash-hasher = "0.2.1" -solana-notifier = { path = "notifier", version = "=1.18.12" } -solana-perf = { path = "perf", version = "=1.18.12" } -solana-poh = { path = "poh", version = "=1.18.12" } -solana-program = { path = "sdk/program", version = "=1.18.12" } -solana-program-runtime = { path = "program-runtime", version = "=1.18.12" } -solana-program-test = { path = "program-test", version = "=1.18.12" } -solana-pubsub-client = { path = "pubsub-client", version = "=1.18.12" } -solana-quic-client = { path = "quic-client", version = "=1.18.12" } -solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.18.12" } -solana-remote-wallet = { path = "remote-wallet", version = "=1.18.12", default-features = false } -solana-unified-scheduler-logic = { path = "unified-scheduler-logic", version = "=1.18.12" } -solana-unified-scheduler-pool = { path = "unified-scheduler-pool", version = "=1.18.12" } -solana-rpc = { path = "rpc", version = "=1.18.12" } -solana-rpc-client = { path = "rpc-client", version = "=1.18.12", default-features = false } -solana-rpc-client-api = { path = "rpc-client-api", version = "=1.18.12" } -solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.18.12" } -solana-runtime = { path = "runtime", version = "=1.18.12" } -solana-runtime-transaction = { path = "runtime-transaction", version = "=1.18.12" } -solana-sdk = { path = "sdk", version = "=1.18.12" } -solana-sdk-macro = { path = "sdk/macro", version = "=1.18.12" } -solana-send-transaction-service = { path = "send-transaction-service", version = "=1.18.12" } -solana-stake-program = { path = "programs/stake", version = "=1.18.12" } -solana-storage-bigtable = { path = "storage-bigtable", version = "=1.18.12" } -solana-storage-proto = { path = "storage-proto", version = "=1.18.12" } -solana-streamer = { path = "streamer", version = "=1.18.12" } -solana-system-program = { path = "programs/system", version = "=1.18.12" } -solana-test-validator = { path = "test-validator", version = "=1.18.12" } -solana-thin-client = { path = "thin-client", version = "=1.18.12" } -solana-tpu-client = { path = "tpu-client", version = "=1.18.12", default-features = false } -solana-transaction-status = { path = "transaction-status", version = "=1.18.12" } -solana-turbine = { path = "turbine", version = "=1.18.12" } -solana-udp-client = { path = "udp-client", version = "=1.18.12" } -solana-version = { path = "version", version = "=1.18.12" } -solana-vote = { path = "vote", version = "=1.18.12" } -solana-vote-program = { path = "programs/vote", version = "=1.18.12" } -solana-wen-restart = { path = "wen-restart", version = "=1.18.12" } -solana-zk-keygen = { path = "zk-keygen", version = "=1.18.12" } -solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.18.12" } -solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.18.12" } +solana-notifier = { path = "notifier", version = "=1.18.13" } +solana-perf = { path = "perf", version = "=1.18.13" } +solana-poh = { path = "poh", version = "=1.18.13" } +solana-program = { path = "sdk/program", version = "=1.18.13" } +solana-program-runtime = { path = "program-runtime", version = "=1.18.13" } +solana-program-test = { path = "program-test", version = "=1.18.13" } +solana-pubsub-client = { path = "pubsub-client", version = "=1.18.13" } +solana-quic-client = { path = "quic-client", version = "=1.18.13" } +solana-rayon-threadlimit = { path = "rayon-threadlimit", version = "=1.18.13" } +solana-remote-wallet = { path = "remote-wallet", version = "=1.18.13", default-features = false } +solana-unified-scheduler-logic = { path = "unified-scheduler-logic", version = "=1.18.13" } +solana-unified-scheduler-pool = { path = "unified-scheduler-pool", version = "=1.18.13" } +solana-rpc = { path = "rpc", version = "=1.18.13" } +solana-rpc-client = { path = "rpc-client", version = "=1.18.13", default-features = false } +solana-rpc-client-api = { path = "rpc-client-api", version = "=1.18.13" } +solana-rpc-client-nonce-utils = { path = "rpc-client-nonce-utils", version = "=1.18.13" } +solana-runtime = { path = "runtime", version = "=1.18.13" } +solana-runtime-transaction = { path = "runtime-transaction", version = "=1.18.13" } +solana-sdk = { path = "sdk", version = "=1.18.13" } +solana-sdk-macro = { path = "sdk/macro", version = "=1.18.13" } +solana-send-transaction-service = { path = "send-transaction-service", version = "=1.18.13" } +solana-stake-program = { path = "programs/stake", version = "=1.18.13" } +solana-storage-bigtable = { path = "storage-bigtable", version = "=1.18.13" } +solana-storage-proto = { path = "storage-proto", version = "=1.18.13" } +solana-streamer = { path = "streamer", version = "=1.18.13" } +solana-system-program = { path = "programs/system", version = "=1.18.13" } +solana-test-validator = { path = "test-validator", version = "=1.18.13" } +solana-thin-client = { path = "thin-client", version = "=1.18.13" } +solana-tpu-client = { path = "tpu-client", version = "=1.18.13", default-features = false } +solana-transaction-status = { path = "transaction-status", version = "=1.18.13" } +solana-turbine = { path = "turbine", version = "=1.18.13" } +solana-udp-client = { path = "udp-client", version = "=1.18.13" } +solana-version = { path = "version", version = "=1.18.13" } +solana-vote = { path = "vote", version = "=1.18.13" } +solana-vote-program = { path = "programs/vote", version = "=1.18.13" } +solana-wen-restart = { path = "wen-restart", version = "=1.18.13" } +solana-zk-keygen = { path = "zk-keygen", version = "=1.18.13" } +solana-zk-token-proof-program = { path = "programs/zk-token-proof", version = "=1.18.13" } +solana-zk-token-sdk = { path = "zk-token-sdk", version = "=1.18.13" } solana_rbpf = "=0.8.0" spl-associated-token-account = "=2.3.0" spl-instruction-padding = "0.1" diff --git a/accounts-db/src/accounts_index.rs b/accounts-db/src/accounts_index.rs index fc389116d09b71..df8f37cc0a1ba8 100644 --- a/accounts-db/src/accounts_index.rs +++ b/accounts-db/src/accounts_index.rs @@ -679,8 +679,8 @@ pub enum AccountsIndexScanResult { pub struct AccountsIndex + Into> { pub account_maps: LockMapType, pub bin_calculator: PubkeyBinCalculator24, - program_id_index: SecondaryIndex, - spl_token_mint_index: SecondaryIndex, + program_id_index: SecondaryIndex, + spl_token_mint_index: SecondaryIndex, spl_token_owner_index: SecondaryIndex, pub roots_tracker: RwLock, ongoing_scan_roots: RwLock>, @@ -727,10 +727,10 @@ impl + Into> AccountsIndex { Self { account_maps, bin_calculator, - program_id_index: SecondaryIndex::::new( + program_id_index: SecondaryIndex::::new( "program_id_index_stats", ), - spl_token_mint_index: SecondaryIndex::::new( + spl_token_mint_index: SecondaryIndex::::new( "spl_token_mint_index_stats", ), spl_token_owner_index: SecondaryIndex::::new( @@ -2081,17 +2081,17 @@ pub mod tests { } } - fn create_dashmap_secondary_index_state() -> (usize, usize, AccountSecondaryIndexes) { + fn create_spl_token_mint_secondary_index_state() -> (usize, usize, AccountSecondaryIndexes) { { // Check that we're actually testing the correct variant let index = AccountsIndex::::default_for_tests(); - let _type_check = SecondaryIndexTypes::DashMap(&index.spl_token_mint_index); + let _type_check = SecondaryIndexTypes::RwLock(&index.spl_token_mint_index); } (0, PUBKEY_BYTES, spl_token_mint_index_enabled()) } - fn create_rwlock_secondary_index_state() -> (usize, usize, AccountSecondaryIndexes) { + fn create_spl_token_owner_secondary_index_state() -> (usize, usize, AccountSecondaryIndexes) { { // Check that we're actually testing the correct variant let index = AccountsIndex::::default_for_tests(); @@ -3449,8 +3449,8 @@ pub mod tests { } #[test] - fn test_purge_exact_dashmap_secondary_index() { - let (key_start, key_end, secondary_indexes) = create_dashmap_secondary_index_state(); + fn test_purge_exact_spl_token_mint_secondary_index() { + let (key_start, key_end, secondary_indexes) = create_spl_token_mint_secondary_index_state(); let index = AccountsIndex::::default_for_tests(); run_test_purge_exact_secondary_index( &index, @@ -3462,8 +3462,9 @@ pub mod tests { } #[test] - fn test_purge_exact_rwlock_secondary_index() { - let (key_start, key_end, secondary_indexes) = create_rwlock_secondary_index_state(); + fn test_purge_exact_spl_token_owner_secondary_index() { + let (key_start, key_end, secondary_indexes) = + create_spl_token_owner_secondary_index_state(); let index = AccountsIndex::::default_for_tests(); run_test_purge_exact_secondary_index( &index, @@ -3667,8 +3668,8 @@ pub mod tests { } #[test] - fn test_dashmap_secondary_index() { - let (key_start, key_end, secondary_indexes) = create_dashmap_secondary_index_state(); + fn test_spl_token_mint_secondary_index() { + let (key_start, key_end, secondary_indexes) = create_spl_token_mint_secondary_index_state(); let index = AccountsIndex::::default_for_tests(); for token_id in [inline_spl_token::id(), inline_spl_token_2022::id()] { run_test_spl_token_secondary_indexes( @@ -3683,8 +3684,9 @@ pub mod tests { } #[test] - fn test_rwlock_secondary_index() { - let (key_start, key_end, secondary_indexes) = create_rwlock_secondary_index_state(); + fn test_spl_token_owner_secondary_index() { + let (key_start, key_end, secondary_indexes) = + create_spl_token_owner_secondary_index_state(); let index = AccountsIndex::::default_for_tests(); for token_id in [inline_spl_token::id(), inline_spl_token_2022::id()] { run_test_spl_token_secondary_indexes( @@ -3788,8 +3790,8 @@ pub mod tests { } #[test] - fn test_dashmap_secondary_index_same_slot_and_forks() { - let (key_start, key_end, account_index) = create_dashmap_secondary_index_state(); + fn test_spl_token_mint_secondary_index_same_slot_and_forks() { + let (key_start, key_end, account_index) = create_spl_token_mint_secondary_index_state(); let index = AccountsIndex::::default_for_tests(); for token_id in [inline_spl_token::id(), inline_spl_token_2022::id()] { run_test_secondary_indexes_same_slot_and_forks( @@ -3805,7 +3807,7 @@ pub mod tests { #[test] fn test_rwlock_secondary_index_same_slot_and_forks() { - let (key_start, key_end, account_index) = create_rwlock_secondary_index_state(); + let (key_start, key_end, account_index) = create_spl_token_owner_secondary_index_state(); let index = AccountsIndex::::default_for_tests(); for token_id in [inline_spl_token::id(), inline_spl_token_2022::id()] { run_test_secondary_indexes_same_slot_and_forks( diff --git a/ci/rust-version.sh b/ci/rust-version.sh index 3db1a843fa105b..98ad807d71dd0a 100644 --- a/ci/rust-version.sh +++ b/ci/rust-version.sh @@ -45,7 +45,7 @@ export rust_nightly_docker_image=solanalabs/rust-nightly:"$nightly_version" declare toolchain=$1 if ! cargo +"$toolchain" -V > /dev/null; then echo "$0: Missing toolchain? Installing...: $toolchain" >&2 - rustup install "$toolchain" + rustup install "$toolchain" --no-self-update cargo +"$toolchain" -V fi } diff --git a/client/src/send_and_confirm_transactions_in_parallel.rs b/client/src/send_and_confirm_transactions_in_parallel.rs index 976539c4a48b5d..9c764efd34d848 100644 --- a/client/src/send_and_confirm_transactions_in_parallel.rs +++ b/client/src/send_and_confirm_transactions_in_parallel.rs @@ -5,7 +5,7 @@ use { }, bincode::serialize, dashmap::DashMap, - futures_util::future::{join_all, FutureExt}, + futures_util::future::join_all, solana_quic_client::{QuicConfig, QuicConnectionManager, QuicPool}, solana_rpc_client::spinner::{self, SendTransactionProgress}, solana_rpc_client_api::{ @@ -28,12 +28,16 @@ use { }, time::Duration, }, - tokio::{sync::RwLock, task::JoinHandle, time::Instant}, + tokio::{sync::RwLock, task::JoinHandle}, }; const BLOCKHASH_REFRESH_RATE: Duration = Duration::from_secs(5); -const TPU_RESEND_REFRESH_RATE: Duration = Duration::from_secs(2); const SEND_INTERVAL: Duration = Duration::from_millis(10); +// This is a "reasonable" constant for how long it should +// take to fan the transactions out, taken from +// `solana_tpu_client::nonblocking::tpu_client::send_wire_transaction_futures` +const SEND_TIMEOUT_INTERVAL: Duration = Duration::from_secs(5); + type QuicTpuClient = TpuClient; #[derive(Clone, Debug)] @@ -141,8 +145,11 @@ fn create_transaction_confirmation_task( }) { num_confirmed_transactions.fetch_add(1, Ordering::Relaxed); - if let Some(error) = status.err { - errors_map.insert(data.index, error); + match status.err { + Some(TransactionError::AlreadyProcessed) | None => {} + Some(error) => { + errors_map.insert(data.index, error); + } } }; } @@ -190,9 +197,12 @@ async fn send_transaction_with_rpc_fallback( index: usize, ) -> Result<()> { let send_over_rpc = if let Some(tpu_client) = tpu_client { - !tpu_client - .send_wire_transaction(serialized_transaction.clone()) - .await + !tokio::time::timeout( + SEND_TIMEOUT_INTERVAL, + tpu_client.send_wire_transaction(serialized_transaction.clone()), + ) + .await + .unwrap_or(false) } else { true }; @@ -251,16 +261,18 @@ async fn sign_all_messages_and_send( // send all the transaction messages for (counter, (index, message)) in messages_with_index.iter().enumerate() { let mut transaction = Transaction::new_unsigned(message.clone()); - let blockhashdata = *context.blockhash_data_rw.read().await; - - // we have already checked if all transactions are signable. - transaction - .try_sign(signers, blockhashdata.blockhash) - .expect("Transaction should be signable"); - let serialized_transaction = serialize(&transaction).expect("Transaction should serialize"); - let signature = transaction.signatures[0]; futures.push(async move { tokio::time::sleep(SEND_INTERVAL.saturating_mul(counter as u32)).await; + let blockhashdata = *context.blockhash_data_rw.read().await; + + // we have already checked if all transactions are signable. + transaction + .try_sign(signers, blockhashdata.blockhash) + .expect("Transaction should be signable"); + let serialized_transaction = + serialize(&transaction).expect("Transaction should serialize"); + let signature = transaction.signatures[0]; + // send to confirm the transaction context.unconfirmed_transaction_map.insert( signature, @@ -341,7 +353,6 @@ async fn confirm_transactions_till_block_height_and_resend_unexpired_transaction let block_height = current_block_height.load(Ordering::Relaxed); if let Some(tpu_client) = tpu_client { - let instant = Instant::now(); // retry sending transaction only over TPU port // any transactions sent over RPC will be automatically rebroadcast by the RPC server let txs_to_resend_over_tpu = unconfirmed_transaction_map @@ -349,33 +360,14 @@ async fn confirm_transactions_till_block_height_and_resend_unexpired_transaction .filter(|x| block_height < x.last_valid_block_height) .map(|x| x.serialized_transaction.clone()) .collect::>(); - let num_txs_to_resend = txs_to_resend_over_tpu.len(); - // This is a "reasonable" constant for how long it should - // take to fan the transactions out, taken from - // `solana_tpu_client::nonblocking::tpu_client::send_wire_transaction_futures` - const SEND_TIMEOUT_INTERVAL: Duration = Duration::from_secs(5); - let message = if tokio::time::timeout( - SEND_TIMEOUT_INTERVAL, - tpu_client.try_send_wire_transaction_batch(txs_to_resend_over_tpu), + send_staggered_transactions( + progress_bar, + tpu_client, + txs_to_resend_over_tpu, + max_valid_block_height, + context, ) - .await - .is_err() - { - format!("Timed out resending {num_txs_to_resend} transactions...") - } else { - format!("Resent {num_txs_to_resend} transactions...") - }; - - if let Some(progress_bar) = progress_bar { - let progress = - progress_from_context_and_block_height(context, max_valid_block_height); - progress.set_message_for_confirmed_transactions(progress_bar, &message); - } - - let elapsed = instant.elapsed(); - if elapsed < TPU_RESEND_REFRESH_RATE { - tokio::time::sleep(TPU_RESEND_REFRESH_RATE - elapsed).await; - } + .await; } else { tokio::time::sleep(Duration::from_millis(100)).await; } @@ -391,6 +383,41 @@ async fn confirm_transactions_till_block_height_and_resend_unexpired_transaction } } +async fn send_staggered_transactions( + progress_bar: &Option, + tpu_client: &QuicTpuClient, + wire_transactions: Vec>, + last_valid_block_height: u64, + context: &SendingContext, +) { + let current_transaction_count = wire_transactions.len(); + let futures = wire_transactions + .into_iter() + .enumerate() + .map(|(counter, transaction)| async move { + tokio::time::sleep(SEND_INTERVAL.saturating_mul(counter as u32)).await; + if let Some(progress_bar) = progress_bar { + let progress = + progress_from_context_and_block_height(context, last_valid_block_height); + progress.set_message_for_confirmed_transactions( + progress_bar, + &format!( + "Resending {}/{} transactions", + counter + 1, + current_transaction_count, + ), + ); + } + tokio::time::timeout( + SEND_TIMEOUT_INTERVAL, + tpu_client.send_wire_transaction(transaction), + ) + .await + }) + .collect::>(); + join_all(futures).await; +} + /// Sends and confirms transactions concurrently /// /// The sending and confirmation of transactions is done in parallel tasks @@ -483,33 +510,21 @@ pub async fn send_and_confirm_transactions_in_parallel( // clear the map so that we can start resending unconfirmed_transasction_map.clear(); - let futures = [ - sign_all_messages_and_send( - &progress_bar, - &rpc_client, - &tpu_client, - messages_with_index, - signers, - &context, - ) - .boxed_local(), - async { - // Give the signing and sending a head start before trying to - // confirm and resend - tokio::time::sleep(TPU_RESEND_REFRESH_RATE).await; - confirm_transactions_till_block_height_and_resend_unexpired_transaction_over_tpu( - &progress_bar, - &tpu_client, - &context, - ) - .await; - // Infallible, but required to have the same return type as - // `sign_all_messages_and_send` - Ok(()) - } - .boxed_local(), - ]; - join_all(futures).await.into_iter().collect::>()?; + sign_all_messages_and_send( + &progress_bar, + &rpc_client, + &tpu_client, + messages_with_index, + signers, + &context, + ) + .await?; + confirm_transactions_till_block_height_and_resend_unexpired_transaction_over_tpu( + &progress_bar, + &tpu_client, + &context, + ) + .await; if unconfirmed_transasction_map.is_empty() { break; diff --git a/core/src/banking_stage/forwarder.rs b/core/src/banking_stage/forwarder.rs index a09417fcb87f3f..d9da7ff6ad330c 100644 --- a/core/src/banking_stage/forwarder.rs +++ b/core/src/banking_stage/forwarder.rs @@ -61,9 +61,9 @@ impl Forwarder { ) { let forward_option = unprocessed_transaction_storage.forward_option(); - // get current root bank from bank_forks, use it to sanitize transaction and + // get current working bank from bank_forks, use it to sanitize transaction and // load all accounts from address loader; - let current_bank = self.bank_forks.read().unwrap().root_bank(); + let current_bank = self.bank_forks.read().unwrap().working_bank(); let mut forward_packet_batches_by_accounts = ForwardPacketBatchesByAccounts::new_with_default_batch_limits(); diff --git a/core/src/banking_stage/transaction_scheduler/prio_graph_scheduler.rs b/core/src/banking_stage/transaction_scheduler/prio_graph_scheduler.rs index 700bbc21a4b440..16fa19cca44895 100644 --- a/core/src/banking_stage/transaction_scheduler/prio_graph_scheduler.rs +++ b/core/src/banking_stage/transaction_scheduler/prio_graph_scheduler.rs @@ -15,6 +15,7 @@ use { crossbeam_channel::{Receiver, Sender, TryRecvError}, itertools::izip, prio_graph::{AccessKind, PrioGraph}, + solana_cost_model::block_cost_limits::MAX_BLOCK_UNITS, solana_measure::measure_us, solana_sdk::{ pubkey::Pubkey, saturating_add_assign, slot_history::Slot, @@ -68,6 +69,23 @@ impl PrioGraphScheduler { pre_lock_filter: impl Fn(&SanitizedTransaction) -> bool, ) -> Result { let num_threads = self.consume_work_senders.len(); + let max_cu_per_thread = MAX_BLOCK_UNITS / num_threads as u64; + + let mut schedulable_threads = ThreadSet::any(num_threads); + for thread_id in 0..num_threads { + if self.in_flight_tracker.cus_in_flight_per_thread()[thread_id] >= max_cu_per_thread { + schedulable_threads.remove(thread_id); + } + } + if schedulable_threads.is_empty() { + return Ok(SchedulingSummary { + num_scheduled: 0, + num_unschedulable: 0, + num_filtered_out: 0, + filter_time_us: 0, + }); + } + let mut batches = Batches::new(num_threads); // Some transactions may be unschedulable due to multi-thread conflicts. // These transactions cannot be scheduled until some conflicting work is completed. @@ -173,7 +191,7 @@ impl PrioGraphScheduler { let Some(thread_id) = self.account_locks.try_lock_accounts( transaction_locks.writable.into_iter(), transaction_locks.readonly.into_iter(), - ThreadSet::any(num_threads), + schedulable_threads, |thread_set| { Self::select_thread( thread_set, @@ -207,7 +225,17 @@ impl PrioGraphScheduler { if batches.ids[thread_id].len() >= TARGET_NUM_TRANSACTIONS_PER_BATCH { saturating_add_assign!(num_sent, self.send_batch(&mut batches, thread_id)?); } - + // if the thread is at max_cu_per_thread, remove it from the schedulable threads + // if there are no more schedulable threads, stop scheduling. + if self.in_flight_tracker.cus_in_flight_per_thread()[thread_id] + + batches.total_cus[thread_id] + >= max_cu_per_thread + { + schedulable_threads.remove(thread_id); + if schedulable_threads.is_empty() { + break; + } + } if num_scheduled >= MAX_TRANSACTIONS_PER_SCHEDULING_PASS { break; } diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index 55ce4a7ad89e9b..45e1e9893b0d2e 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -1144,7 +1144,7 @@ impl Blockstore { slot, erasure_meta .first_received_coding_shred_index() - .expect("First received coding index must exist for all erasure metas"), + .expect("First received coding index must fit in u32"), ShredType::Code, ); let shred = just_inserted_shreds @@ -1800,12 +1800,17 @@ impl Blockstore { merkle_root_meta.first_received_shred_index(), merkle_root_meta.first_received_shred_type(), ); - let conflicting_shred = self + let Some(conflicting_shred) = self .get_shred_from_just_inserted_or_db(just_inserted_shreds, shred_id) - .unwrap_or_else(|| { - panic!("First received shred indicated by merkle root meta {:?} is missing from blockstore. This inconsistency may cause duplicate block detection to fail", merkle_root_meta); - }) - .into_owned(); + .map(Cow::into_owned) + else { + error!( + "Shred {shred_id:?} indiciated by merkle root meta {merkle_root_meta:?} is missing from blockstore. + This should only happen in extreme cases where blockstore cleanup has caught up to the root. + Skipping the merkle root consistency check" + ); + return true; + }; duplicate_shreds.push(PossibleDuplicateShred::MerkleRootConflict( shred.clone(), conflicting_shred, @@ -1859,10 +1864,17 @@ impl Blockstore { next_merkle_root_meta.first_received_shred_index(), next_merkle_root_meta.first_received_shred_type(), ); - let next_shred = + let Some(next_shred) = Self::get_shred_from_just_inserted_or_db(self, just_inserted_shreds, next_shred_id) - .expect("Shred indicated by merkle root meta must exist") - .into_owned(); + .map(Cow::into_owned) + else { + error!( + "Shred {next_shred_id:?} indicated by merkle root meta {next_merkle_root_meta:?} is missing from blockstore. + This should only happen in extreme cases where blockstore cleanup has caught up to the root. + Skipping the forward chained merkle root consistency check" + ); + return true; + }; let merkle_root = shred.merkle_root().ok(); let chained_merkle_root = shred::layout::get_chained_merkle_root(&next_shred); @@ -1930,7 +1942,7 @@ impl Blockstore { return true; }; - let prev_merkle_root_meta = merkle_root_metas + let Some(prev_merkle_root_meta) = merkle_root_metas .get(&prev_erasure_set) .map(WorkingEntry::as_ref) .map(Cow::Borrowed) @@ -1939,16 +1951,30 @@ impl Blockstore { .unwrap() .map(Cow::Owned) }) - .expect("merkle root meta must exist for erasure meta"); + else { + warn!( + "The merkle root meta for the previous erasure set {prev_erasure_set:?} does not exist. + This should only happen if you have recently upgraded from a version < v1.18.13. + Skipping the backwards chained merkle root for {erasure_set:?}" + ); + return true; + }; let prev_shred_id = ShredId::new( slot, prev_merkle_root_meta.first_received_shred_index(), prev_merkle_root_meta.first_received_shred_type(), ); - let prev_shred = + let Some(prev_shred) = Self::get_shred_from_just_inserted_or_db(self, just_inserted_shreds, prev_shred_id) - .expect("Shred indicated by merkle root meta must exist") - .into_owned(); + .map(Cow::into_owned) + else { + error!( + "Shred {prev_shred_id:?} indicated by merkle root meta {prev_merkle_root_meta:?} is missing from blockstore. + This should only happen in extreme cases where blockstore cleanup has caught up to the root. + Skipping the backwards chained merkle root consistency check" + ); + return true; + }; let merkle_root = shred::layout::get_merkle_root(&prev_shred); let chained_merkle_root = shred.chained_merkle_root().ok(); @@ -2015,12 +2041,17 @@ impl Blockstore { u32::try_from(last_index.unwrap()).unwrap(), ShredType::Data, ); - let ending_shred: Vec = self + let Some(ending_shred) = self .get_shred_from_just_inserted_or_db(just_inserted_shreds, shred_id) - .unwrap_or_else(|| { - panic!("Last index data shred indicated by slot meta {:?} is missing from blockstore. This inconsistency may cause duplicate block detection to fail", slot_meta) - }) - .into_owned(); + .map(Cow::into_owned) + else { + error!( + "Last index data shred {shred_id:?} indiciated by slot meta {slot_meta:?} is missing from blockstore. + This should only happen in extreme cases where blockstore cleanup has caught up to the root. + Skipping data shred insertion" + ); + return false; + }; if self .store_duplicate_slot(slot, ending_shred.clone(), shred.payload().clone()) @@ -2058,12 +2089,17 @@ impl Blockstore { u32::try_from(slot_meta.received - 1).unwrap(), ShredType::Data, ); - let ending_shred: Vec = self + let Some(ending_shred) = self .get_shred_from_just_inserted_or_db(just_inserted_shreds, shred_id) - .unwrap_or_else(|| { - panic!("Last received data shred indicated by slot meta {:?} is missing from blockstore. This inconsistency may cause duplicate block detection to fail", slot_meta) - }) - .into_owned(); + .map(Cow::into_owned) + else { + error!( + "Last received data shred {shred_id:?} indiciated by slot meta {slot_meta:?} is missing from blockstore. + This should only happen in extreme cases where blockstore cleanup has caught up to the root. + Skipping data shred insertion" + ); + return false; + }; if self .store_duplicate_slot(slot, ending_shred.clone(), shred.payload().clone()) @@ -11641,4 +11677,108 @@ pub mod tests { ) ); } + + #[test] + fn test_chained_merkle_root_upgrade_inconsistency_backwards() { + // Insert a coding shred (without a merkle meta) then inconsistent shreds from the next FEC set + let ledger_path = get_tmp_ledger_path_auto_delete!(); + let blockstore = Blockstore::open(ledger_path.path()).unwrap(); + + let parent_slot = 0; + let slot = 1; + let fec_set_index = 0; + let (data_shreds, coding_shreds, leader_schedule) = + setup_erasure_shreds_with_index(slot, parent_slot, 10, fec_set_index); + let coding_shred_previous = coding_shreds[0].clone(); + let next_fec_set_index = fec_set_index + data_shreds.len() as u32; + + assert!(blockstore + .insert_shred_return_duplicate(coding_shred_previous.clone(), &leader_schedule,) + .is_empty()); + + // Remove the merkle root meta in order to simulate this blockstore originating from + // an older version. + let mut write_batch = blockstore.db.batch().unwrap(); + blockstore + .db + .delete_range_cf::(&mut write_batch, slot, slot) + .unwrap(); + blockstore.db.write(write_batch).unwrap(); + assert!(blockstore + .merkle_root_meta(coding_shred_previous.erasure_set()) + .unwrap() + .is_none()); + + // Add an incorrectly chained merkle from the next set. Although incorrectly chained + // we skip the duplicate check as the merkle root meta is missing. + let merkle_root = Hash::new_unique(); + assert!(merkle_root != coding_shred_previous.merkle_root().unwrap()); + let (data_shreds, coding_shreds, leader_schedule) = + setup_erasure_shreds_with_index_and_chained_merkle( + slot, + parent_slot, + 10, + next_fec_set_index, + Some(merkle_root), + ); + let data_shred = data_shreds[0].clone(); + let coding_shred = coding_shreds[0].clone(); + assert!(blockstore + .insert_shred_return_duplicate(coding_shred, &leader_schedule) + .is_empty()); + assert!(blockstore + .insert_shred_return_duplicate(data_shred, &leader_schedule,) + .is_empty()); + } + + #[test] + fn test_chained_merkle_root_upgrade_inconsistency_forwards() { + // Insert a data shred (without a merkle root), then an inconsistent coding shred from the previous FEC set. + let ledger_path = get_tmp_ledger_path_auto_delete!(); + let blockstore = Blockstore::open(ledger_path.path()).unwrap(); + + let parent_slot = 0; + let slot = 1; + let fec_set_index = 0; + let (data_shreds, coding_shreds, leader_schedule) = + setup_erasure_shreds_with_index(slot, parent_slot, 10, fec_set_index); + let coding_shred = coding_shreds[0].clone(); + let next_fec_set_index = fec_set_index + data_shreds.len() as u32; + + // Incorrectly chained merkle + let merkle_root = Hash::new_unique(); + assert!(merkle_root != coding_shred.merkle_root().unwrap()); + let (next_data_shreds, next_coding_shreds, leader_schedule_next) = + setup_erasure_shreds_with_index_and_chained_merkle( + slot, + parent_slot, + 10, + next_fec_set_index, + Some(merkle_root), + ); + let next_data_shred = next_data_shreds[0].clone(); + + assert!(blockstore + .insert_shred_return_duplicate(next_data_shred, &leader_schedule_next,) + .is_empty()); + + // Remove the merkle root meta in order to simulate this blockstore originating from + // an older version. + let mut write_batch = blockstore.db.batch().unwrap(); + blockstore + .db + .delete_range_cf::(&mut write_batch, slot, slot) + .unwrap(); + blockstore.db.write(write_batch).unwrap(); + assert!(blockstore + .merkle_root_meta(next_coding_shreds[0].erasure_set()) + .unwrap() + .is_none()); + + // Insert previous FEC set, although incorrectly chained we skip the duplicate check + // as the merkle root meta is missing. + assert!(blockstore + .insert_shred_return_duplicate(coding_shred, &leader_schedule) + .is_empty()); + } } diff --git a/program-runtime/src/loaded_programs.rs b/program-runtime/src/loaded_programs.rs index 055041f7976c92..7527ee45f08d48 100644 --- a/program-runtime/src/loaded_programs.rs +++ b/program-runtime/src/loaded_programs.rs @@ -719,11 +719,33 @@ impl LoadedPrograms { /// Insert a single entry. It's typically called during transaction loading, /// when the cache doesn't contain the entry corresponding to program `key`. pub fn assign_program(&mut self, key: Pubkey, entry: Arc) -> bool { + // This function always returns `true` during normal operation. + // Only during the recompilation phase this can return `false` + // for entries with `upcoming_environments`. + fn is_current_env( + environments: &ProgramRuntimeEnvironments, + env_opt: Option<&ProgramRuntimeEnvironment>, + ) -> bool { + env_opt + .map(|env| { + Arc::ptr_eq(env, &environments.program_runtime_v1) + || Arc::ptr_eq(env, &environments.program_runtime_v2) + }) + .unwrap_or(true) + } let slot_versions = &mut self.entries.entry(key).or_default().slot_versions; match slot_versions.binary_search_by(|at| { at.effective_slot .cmp(&entry.effective_slot) .then(at.deployment_slot.cmp(&entry.deployment_slot)) + .then( + // This `.then()` has no effect during normal operation. + // Only during the recompilation phase this does allow entries + // which only differ in their environment to be interleaved in `slot_versions`. + is_current_env(&self.environments, at.program.get_environment()).cmp( + &is_current_env(&self.environments, entry.program.get_environment()), + ), + ) }) { Ok(index) => { let existing = slot_versions.get_mut(index).unwrap(); diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 6c0a27ce40ccd0..e554622ead435d 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4634,7 +4634,7 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.18.12" +version = "1.18.13" dependencies = [ "Inflector", "base64 0.21.7", @@ -4657,7 +4657,7 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.18.12" +version = "1.18.13" dependencies = [ "arrayref", "bincode", @@ -4716,7 +4716,7 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "bytemuck", @@ -4735,7 +4735,7 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "borsh 1.2.1", "futures 0.3.30", @@ -4750,7 +4750,7 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.18.12" +version = "1.18.13" dependencies = [ "serde", "solana-sdk", @@ -4759,7 +4759,7 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "crossbeam-channel", @@ -4777,7 +4777,7 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bv", "fnv", @@ -4794,7 +4794,7 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "byteorder 1.5.0", @@ -4811,7 +4811,7 @@ dependencies = [ [[package]] name = "solana-bpf-rust-big-mod-exp" -version = "1.18.12" +version = "1.18.13" dependencies = [ "array-bytes", "serde", @@ -4821,7 +4821,7 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bv", "bytemuck", @@ -4837,7 +4837,7 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.18.12" +version = "1.18.13" dependencies = [ "chrono", "clap 2.33.3", @@ -4852,7 +4852,7 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.18.12" +version = "1.18.13" dependencies = [ "dirs-next", "lazy_static", @@ -4866,7 +4866,7 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.18.12" +version = "1.18.13" dependencies = [ "Inflector", "base64 0.21.7", @@ -4891,7 +4891,7 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-trait", "bincode", @@ -4922,7 +4922,7 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4930,7 +4930,7 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "chrono", @@ -4942,7 +4942,7 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-trait", "bincode", @@ -4962,7 +4962,7 @@ dependencies = [ [[package]] name = "solana-core" -version = "1.18.12" +version = "1.18.13" dependencies = [ "base64 0.21.7", "bincode", @@ -5037,7 +5037,7 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.18.12" +version = "1.18.13" dependencies = [ "lazy_static", "log", @@ -5059,7 +5059,7 @@ dependencies = [ [[package]] name = "solana-download-utils" -version = "1.18.12" +version = "1.18.13" dependencies = [ "console", "indicatif", @@ -5071,7 +5071,7 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "crossbeam-channel", @@ -5091,7 +5091,7 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "byteorder 1.5.0", @@ -5113,7 +5113,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.18.12" +version = "1.18.13" dependencies = [ "block-buffer 0.10.4", "bs58", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.18.12" +version = "1.18.13" dependencies = [ "proc-macro2", "quote", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "solana-genesis-utils" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "solana-accounts-db", @@ -5157,7 +5157,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-interface" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "solana-sdk", @@ -5167,7 +5167,7 @@ dependencies = [ [[package]] name = "solana-geyser-plugin-manager" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bs58", "crossbeam-channel", @@ -5192,7 +5192,7 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -5240,7 +5240,7 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "bincode", @@ -5305,7 +5305,7 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "solana-measure", @@ -5316,7 +5316,7 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.18.12" +version = "1.18.13" dependencies = [ "env_logger", "lazy_static", @@ -5325,7 +5325,7 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "solana-sdk", @@ -5333,7 +5333,7 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.18.12" +version = "1.18.13" dependencies = [ "fast-math", "solana-program", @@ -5341,7 +5341,7 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.18.12" +version = "1.18.13" dependencies = [ "crossbeam-channel", "gethostname", @@ -5354,7 +5354,7 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "clap 3.1.6", @@ -5380,7 +5380,7 @@ checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" [[package]] name = "solana-perf" -version = "1.18.12" +version = "1.18.13" dependencies = [ "ahash 0.8.7", "bincode", @@ -5407,7 +5407,7 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.18.12" +version = "1.18.13" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5423,7 +5423,7 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "ark-bn254", "ark-ec", @@ -5476,7 +5476,7 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.18.12" +version = "1.18.13" dependencies = [ "base64 0.21.7", "bincode", @@ -5502,7 +5502,7 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "async-trait", @@ -5530,7 +5530,7 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "crossbeam-channel", "futures-util", @@ -5553,7 +5553,7 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-mutex", "async-trait", @@ -5578,7 +5578,7 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.18.12" +version = "1.18.13" dependencies = [ "lazy_static", "num_cpus", @@ -5586,7 +5586,7 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.18.12" +version = "1.18.13" dependencies = [ "console", "dialoguer", @@ -5603,7 +5603,7 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.18.12" +version = "1.18.13" dependencies = [ "base64 0.21.7", "bincode", @@ -5658,7 +5658,7 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-trait", "base64 0.21.7", @@ -5682,7 +5682,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.18.12" +version = "1.18.13" dependencies = [ "base64 0.21.7", "bs58", @@ -5702,7 +5702,7 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.18.12" +version = "1.18.13" dependencies = [ "clap 2.33.3", "solana-clap-utils", @@ -5713,7 +5713,7 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.18.12" +version = "1.18.13" dependencies = [ "aquamarine", "arrayref", @@ -5788,7 +5788,7 @@ dependencies = [ [[package]] name = "solana-sbf-programs" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "byteorder 1.5.0", @@ -5817,7 +5817,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", "solana-sbf-rust-128bit-dep", @@ -5825,21 +5825,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-128bit-dep" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alloc" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-alt-bn128" -version = "1.18.12" +version = "1.18.13" dependencies = [ "array-bytes", "solana-program", @@ -5847,7 +5847,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-alt-bn128-compression" -version = "1.18.12" +version = "1.18.13" dependencies = [ "array-bytes", "solana-program", @@ -5855,21 +5855,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-call-depth" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-caller-access" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-curve25519" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", "solana-zk-token-sdk", @@ -5877,14 +5877,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-custom-heap" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dep-crate" -version = "1.18.12" +version = "1.18.13" dependencies = [ "byteorder 1.5.0", "solana-program", @@ -5892,21 +5892,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-deprecated-loader" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-dup-accounts" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-error-handling" -version = "1.18.12" +version = "1.18.13" dependencies = [ "num-derive 0.3.0", "num-traits", @@ -5916,42 +5916,42 @@ dependencies = [ [[package]] name = "solana-sbf-rust-external-spend" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-finalize" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-get-minimum-delegation" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-inner_instruction_alignment_check" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-instruction-introspection" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke" -version = "1.18.12" +version = "1.18.13" dependencies = [ "rustversion", "solana-program", @@ -5961,49 +5961,49 @@ dependencies = [ [[package]] name = "solana-sbf-rust-invoke-and-error" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-ok" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoke-and-return" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-invoked" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-iter" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-log-data" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-many-args" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", "solana-sbf-rust-many-args-dep", @@ -6011,14 +6011,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-many-args-dep" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-mem" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", "solana-program-runtime", @@ -6028,7 +6028,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-membuiltins" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", "solana-sbf-rust-mem", @@ -6036,21 +6036,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-noop" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-panic" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-param-passing" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", "solana-sbf-rust-param-passing-dep", @@ -6058,14 +6058,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-param-passing-dep" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-poseidon" -version = "1.18.12" +version = "1.18.13" dependencies = [ "array-bytes", "solana-program", @@ -6073,7 +6073,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-rand" -version = "1.18.12" +version = "1.18.13" dependencies = [ "getrandom 0.2.10", "rand 0.8.5", @@ -6082,14 +6082,14 @@ dependencies = [ [[package]] name = "solana-sbf-rust-realloc" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-realloc-invoke" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", "solana-sbf-rust-realloc", @@ -6097,7 +6097,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-remaining-compute-units" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", "solana-program-runtime", @@ -6107,21 +6107,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-ro-account_modify" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-ro-modify" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sanity" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", "solana-program-runtime", @@ -6131,7 +6131,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-secp256k1-recover" -version = "1.18.12" +version = "1.18.13" dependencies = [ "libsecp256k1 0.7.0", "solana-program", @@ -6139,7 +6139,7 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sha" -version = "1.18.12" +version = "1.18.13" dependencies = [ "blake3", "solana-program", @@ -6147,21 +6147,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-sibling-instructions" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sibling_inner-instructions" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-simulation" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-logger", "solana-program", @@ -6172,21 +6172,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-spoof1" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-spoof1-system" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-sysvar" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", "solana-program-runtime", @@ -6196,21 +6196,21 @@ dependencies = [ [[package]] name = "solana-sbf-rust-upgradeable" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sbf-rust-upgraded" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-program", ] [[package]] name = "solana-sdk" -version = "1.18.12" +version = "1.18.13" dependencies = [ "assert_matches", "base64 0.21.7", @@ -6263,7 +6263,7 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bs58", "proc-macro2", @@ -6280,7 +6280,7 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.18.12" +version = "1.18.13" dependencies = [ "crossbeam-channel", "log", @@ -6294,7 +6294,7 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "log", @@ -6307,7 +6307,7 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.18.12" +version = "1.18.13" dependencies = [ "backoff", "bincode", @@ -6339,7 +6339,7 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "bs58", @@ -6354,7 +6354,7 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-channel", "bytes", @@ -6385,7 +6385,7 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "log", @@ -6397,7 +6397,7 @@ dependencies = [ [[package]] name = "solana-test-validator" -version = "1.18.12" +version = "1.18.13" dependencies = [ "base64 0.21.7", "bincode", @@ -6427,7 +6427,7 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "log", @@ -6440,7 +6440,7 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-trait", "bincode", @@ -6462,7 +6462,7 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.18.12" +version = "1.18.13" dependencies = [ "Inflector", "base64 0.21.7", @@ -6485,7 +6485,7 @@ dependencies = [ [[package]] name = "solana-turbine" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "bytes", @@ -6520,7 +6520,7 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.18.12" +version = "1.18.13" dependencies = [ "async-trait", "solana-connection-cache", @@ -6533,11 +6533,11 @@ dependencies = [ [[package]] name = "solana-unified-scheduler-logic" -version = "1.18.12" +version = "1.18.13" [[package]] name = "solana-unified-scheduler-pool" -version = "1.18.12" +version = "1.18.13" dependencies = [ "solana-ledger", "solana-program-runtime", @@ -6549,7 +6549,7 @@ dependencies = [ [[package]] name = "solana-validator" -version = "1.18.12" +version = "1.18.13" dependencies = [ "chrono", "clap 2.33.3", @@ -6611,7 +6611,7 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "rustc_version", @@ -6625,7 +6625,7 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.18.12" +version = "1.18.13" dependencies = [ "crossbeam-channel", "itertools", @@ -6642,7 +6642,7 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bincode", "log", @@ -6662,7 +6662,7 @@ dependencies = [ [[package]] name = "solana-wen-restart" -version = "1.18.12" +version = "1.18.13" dependencies = [ "log", "prost", @@ -6681,7 +6681,7 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.18.12" +version = "1.18.13" dependencies = [ "bytemuck", "num-derive 0.4.1", @@ -6693,7 +6693,7 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.18.12" +version = "1.18.13" dependencies = [ "aes-gcm-siv", "base64 0.21.7", diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index ed4dcc6d039843..3d6f937950888d 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.18.12" +version = "1.18.13" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -25,29 +25,29 @@ rand = "0.8" rustversion = "1.0.14" serde = "1.0.112" serde_json = "1.0.56" -solana-account-decoder = { path = "../../account-decoder", version = "=1.18.12" } -solana-accounts-db = { path = "../../accounts-db", version = "=1.18.12" } -solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.18.12" } -solana-cli-output = { path = "../../cli-output", version = "=1.18.12" } -solana-ledger = { path = "../../ledger", version = "=1.18.12" } -solana-logger = { path = "../../logger", version = "=1.18.12" } -solana-measure = { path = "../../measure", version = "=1.18.12" } -solana-program = { path = "../../sdk/program", version = "=1.18.12" } -solana-program-runtime = { path = "../../program-runtime", version = "=1.18.12" } -solana-program-test = { path = "../../program-test", version = "=1.18.12" } -solana-runtime = { path = "../../runtime", version = "=1.18.12" } -solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.18.12" } -solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.18.12" } -solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.18.12", default-features = false } -solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.18.12" } -solana-sbf-rust-mem = { path = "rust/mem", version = "=1.18.12" } -solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.18.12" } -solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.18.12", default-features = false } -solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.18.12" } -solana-sdk = { path = "../../sdk", version = "=1.18.12" } -solana-transaction-status = { path = "../../transaction-status", version = "=1.18.12" } -solana-validator = { path = "../../validator", version = "=1.18.12" } -solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.18.12" } +solana-account-decoder = { path = "../../account-decoder", version = "=1.18.13" } +solana-accounts-db = { path = "../../accounts-db", version = "=1.18.13" } +solana-bpf-loader-program = { path = "../bpf_loader", version = "=1.18.13" } +solana-cli-output = { path = "../../cli-output", version = "=1.18.13" } +solana-ledger = { path = "../../ledger", version = "=1.18.13" } +solana-logger = { path = "../../logger", version = "=1.18.13" } +solana-measure = { path = "../../measure", version = "=1.18.13" } +solana-program = { path = "../../sdk/program", version = "=1.18.13" } +solana-program-runtime = { path = "../../program-runtime", version = "=1.18.13" } +solana-program-test = { path = "../../program-test", version = "=1.18.13" } +solana-runtime = { path = "../../runtime", version = "=1.18.13" } +solana-sbf-rust-128bit-dep = { path = "rust/128bit_dep", version = "=1.18.13" } +solana-sbf-rust-invoke = { path = "rust/invoke", version = "=1.18.13" } +solana-sbf-rust-invoked = { path = "rust/invoked", version = "=1.18.13", default-features = false } +solana-sbf-rust-many-args-dep = { path = "rust/many_args_dep", version = "=1.18.13" } +solana-sbf-rust-mem = { path = "rust/mem", version = "=1.18.13" } +solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = "=1.18.13" } +solana-sbf-rust-realloc = { path = "rust/realloc", version = "=1.18.13", default-features = false } +solana-sbf-rust-realloc-invoke = { path = "rust/realloc_invoke", version = "=1.18.13" } +solana-sdk = { path = "../../sdk", version = "=1.18.13" } +solana-transaction-status = { path = "../../transaction-status", version = "=1.18.13" } +solana-validator = { path = "../../validator", version = "=1.18.13" } +solana-zk-token-sdk = { path = "../../zk-token-sdk", version = "=1.18.13" } solana_rbpf = "=0.8.0" static_assertions = "1.1.0" thiserror = "1.0" diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index d1410e821d9f79..bc018b722b4fcf 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -687,12 +687,13 @@ pub struct Bank { /// slots to hard fork at hard_forks: Arc>, - /// The number of transactions processed without error + /// The number of committed transactions since genesis. transaction_count: AtomicU64, - /// The number of non-vote transactions processed without error since the most recent boot from - /// snapshot or genesis. This value is not shared though the network, nor retained within - /// snapshots, but is preserved in `Bank::new_from_parent`. + /// The number of non-vote transactions committed since the most + /// recent boot from snapshot or genesis. This value is only stored in + /// blockstore for the RPC method "getPerformanceSamples". It is not + /// retained within snapshots, but is preserved in `Bank::new_from_parent`. non_vote_transaction_count_since_restart: AtomicU64, /// The number of transaction errors in this slot @@ -4727,21 +4728,6 @@ impl Bank { let mut timings = ExecuteDetailsTimings::default(); load_program_metrics.submit_datapoint(&mut timings); - if !Arc::ptr_eq( - &environments.program_runtime_v1, - &loaded_programs_cache.environments.program_runtime_v1, - ) || !Arc::ptr_eq( - &environments.program_runtime_v2, - &loaded_programs_cache.environments.program_runtime_v2, - ) { - // There can be two entries per program when the environment changes. - // One for the old environment before the epoch boundary and one for the new environment after the epoch boundary. - // These two entries have the same deployment slot, so they must differ in their effective slot instead. - // This is done by setting the effective slot of the entry for the new environment to the epoch boundary. - loaded_program.effective_slot = loaded_program - .effective_slot - .max(self.epoch_schedule.get_first_slot_in_epoch(effective_epoch)); - } if let Some(recompile) = recompile { loaded_program.tx_usage_counter = AtomicU64::new(recompile.tx_usage_counter.load(Ordering::Relaxed)); @@ -5360,13 +5346,14 @@ impl Bank { // replay could occur signature_count += u64::from(tx.message().header().num_required_signatures); executed_transactions_count += 1; + + if !is_vote { + executed_non_vote_transactions_count += 1; + } } match execution_result.flattened_result() { Ok(()) => { - if !is_vote { - executed_non_vote_transactions_count += 1; - } executed_with_successful_result_count += 1; } Err(err) => { diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index c0f95e8b970c59..18c9727a991d73 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -2398,7 +2398,7 @@ fn test_insufficient_funds() { // transaction_count returns the count of all committed transactions since // bank_transaction_count_fix was activated, regardless of success assert_eq!(bank.transaction_count(), 2); - assert_eq!(bank.non_vote_transaction_count_since_restart(), 1); + assert_eq!(bank.non_vote_transaction_count_since_restart(), 2); let mint_pubkey = mint_keypair.pubkey(); assert_eq!(bank.get_balance(&mint_pubkey), mint_amount - amount); @@ -12058,12 +12058,6 @@ fn test_feature_activation_loaded_programs_recompilation_phase() { .remove(&feature_set::reject_callx_r10::id()); let (root_bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config); - // Test a basic transfer - let amount = genesis_config.rent.minimum_balance(0); - let pubkey = solana_sdk::pubkey::new_rand(); - root_bank.transfer(amount, &mint_keypair, &pubkey).unwrap(); - assert_eq!(root_bank.get_balance(&pubkey), amount); - // Program Setup let program_keypair = Keypair::new(); let program_data = @@ -12077,26 +12071,19 @@ fn test_feature_activation_loaded_programs_recompilation_phase() { }); root_bank.store_account(&program_keypair.pubkey(), &program_account); - // Compose instruction using the desired program - let instruction1 = Instruction::new_with_bytes(program_keypair.pubkey(), &[], Vec::new()); - let message1 = Message::new(&[instruction1], Some(&mint_keypair.pubkey())); - let binding1 = mint_keypair.insecure_clone(); - let signers1 = vec![&binding1]; - let transaction1 = Transaction::new(&signers1, message1, root_bank.last_blockhash()); + // Compose message using the desired program. + let instruction = Instruction::new_with_bytes(program_keypair.pubkey(), &[], Vec::new()); + let message = Message::new(&[instruction], Some(&mint_keypair.pubkey())); + let binding = mint_keypair.insecure_clone(); + let signers = vec![&binding]; - // Advance the bank so the next transaction can be submitted. + // Advance the bank so that the program becomes effective. goto_end_of_slot(root_bank.clone()); let bank = new_from_parent_with_fork_next_slot(root_bank, bank_forks.as_ref()); - // Compose second instruction using the same program with a different block hash - let instruction2 = Instruction::new_with_bytes(program_keypair.pubkey(), &[], Vec::new()); - let message2 = Message::new(&[instruction2], Some(&mint_keypair.pubkey())); - let binding2 = mint_keypair.insecure_clone(); - let signers2 = vec![&binding2]; - let transaction2 = Transaction::new(&signers2, message2, bank.last_blockhash()); - - // Execute before feature is enabled to get program into the cache. - let result_without_feature_enabled = bank.process_transaction(&transaction1); + // Load the program with the old environment. + let transaction = Transaction::new(&signers, message.clone(), bank.last_blockhash()); + let result_without_feature_enabled = bank.process_transaction(&transaction); assert_eq!( result_without_feature_enabled, Err(TransactionError::InstructionError( @@ -12105,7 +12092,7 @@ fn test_feature_activation_loaded_programs_recompilation_phase() { )) ); - // Activate feature + // Schedule feature activation to trigger a change of environment at the epoch boundary. let feature_account_balance = std::cmp::max(genesis_config.rent.minimum_balance(Feature::size_of()), 1); bank.store_account( @@ -12113,12 +12100,57 @@ fn test_feature_activation_loaded_programs_recompilation_phase() { &feature::create_account(&Feature { activated_at: None }, feature_account_balance), ); + // Advance the bank to middle of epoch to start the recompilation phase. + goto_end_of_slot(bank.clone()); + let bank = new_bank_from_parent_with_bank_forks(&bank_forks, bank, &Pubkey::default(), 16); + let current_env = bank + .loaded_programs_cache + .read() + .unwrap() + .get_environments_for_epoch(0) + .program_runtime_v1 + .clone(); + let upcoming_env = bank + .loaded_programs_cache + .read() + .unwrap() + .get_environments_for_epoch(1) + .program_runtime_v1 + .clone(); + + // Advance the bank to recompile the program. + { + let program_cache = bank.loaded_programs_cache.read().unwrap(); + let slot_versions = program_cache.get_slot_versions_for_tests(&program_keypair.pubkey()); + assert_eq!(slot_versions.len(), 1); + assert!(Arc::ptr_eq( + slot_versions[0].program.get_environment().unwrap(), + ¤t_env + )); + } + goto_end_of_slot(bank.clone()); + let bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref()); + { + let program_cache = bank.loaded_programs_cache.write().unwrap(); + let slot_versions = program_cache.get_slot_versions_for_tests(&program_keypair.pubkey()); + assert_eq!(slot_versions.len(), 2); + assert!(Arc::ptr_eq( + slot_versions[0].program.get_environment().unwrap(), + &upcoming_env + )); + assert!(Arc::ptr_eq( + slot_versions[1].program.get_environment().unwrap(), + ¤t_env + )); + } + + // Advance the bank to cross the epoch boundary and activate the feature. goto_end_of_slot(bank.clone()); - // Advance to next epoch, which starts the recompilation phase - let bank = new_from_parent_next_epoch(bank, bank_forks.as_ref(), 1); + let bank = new_bank_from_parent_with_bank_forks(&bank_forks, bank, &Pubkey::default(), 33); - // Execute after feature is enabled to check it was filtered out and reverified. - let result_with_feature_enabled = bank.process_transaction(&transaction2); + // Load the program with the new environment. + let transaction = Transaction::new(&signers, message, bank.last_blockhash()); + let result_with_feature_enabled = bank.process_transaction(&transaction); assert_eq!( result_with_feature_enabled, Err(TransactionError::InstructionError( @@ -12178,6 +12210,21 @@ fn test_feature_activation_loaded_programs_epoch_transition() { let bank = new_bank_from_parent_with_bank_forks(&bank_forks, bank, &Pubkey::default(), 33); // Load the program with the new environment. + let transaction = Transaction::new(&signers, message.clone(), bank.last_blockhash()); + assert!(bank.process_transaction(&transaction).is_ok()); + + { + // Prune for rerooting and thus finishing the recompilation phase. + let mut program_cache = bank.loaded_programs_cache.write().unwrap(); + program_cache.prune(bank.slot(), bank.epoch()); + + // Unload all (which is only the entry with the new environment) + program_cache.sort_and_unload(percentage::Percentage::from(0)); + } + + // Reload the unloaded program with the new environment. + goto_end_of_slot(bank.clone()); + let bank = new_from_parent_with_fork_next_slot(bank, bank_forks.as_ref()); let transaction = Transaction::new(&signers, message, bank.last_blockhash()); assert!(bank.process_transaction(&transaction).is_ok()); } diff --git a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml index 24699f431cebc5..d55250027c2fab 100644 --- a/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/fail/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fail" -version = "1.18.12" +version = "1.18.13" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.18.12" } +solana-program = { path = "../../../../program", version = "=1.18.13" } [lib] crate-type = ["cdylib"] diff --git a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml index ad5c0aacffec95..9bc74f892a1eb8 100644 --- a/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml +++ b/sdk/cargo-build-sbf/tests/crates/noop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "noop" -version = "1.18.12" +version = "1.18.13" description = "Solana SBF test program written in Rust" authors = ["Solana Labs Maintainers "] repository = "https://github.com/solana-labs/solana" @@ -10,7 +10,7 @@ edition = "2021" publish = false [dependencies] -solana-program = { path = "../../../../program", version = "=1.18.12" } +solana-program = { path = "../../../../program", version = "=1.18.13" } [lib] crate-type = ["cdylib"] diff --git a/sdk/program/src/pubkey.rs b/sdk/program/src/pubkey.rs index 04fcc69dc9185a..eac8e7623fe550 100644 --- a/sdk/program/src/pubkey.rs +++ b/sdk/program/src/pubkey.rs @@ -627,7 +627,7 @@ impl Pubkey { } } - pub fn to_bytes(self) -> [u8; 32] { + pub const fn to_bytes(self) -> [u8; 32] { self.0 } diff --git a/turbine/src/cluster_nodes.rs b/turbine/src/cluster_nodes.rs index 76bae78bc1e6c9..bebbda5af8b1e0 100644 --- a/turbine/src/cluster_nodes.rs +++ b/turbine/src/cluster_nodes.rs @@ -85,6 +85,9 @@ pub struct ClusterNodesCache { pub struct RetransmitPeers<'a> { root_distance: usize, // distance from the root node children: Vec<&'a Node>, + // Maps tvu addresses to the first node + // in the shuffle with the same address. + addrs: HashMap, // tvu addresses } impl Node { @@ -173,13 +176,16 @@ impl ClusterNodes { let RetransmitPeers { root_distance, children, + addrs, } = self.get_retransmit_peers(slot_leader, shred, fanout)?; let protocol = get_broadcast_protocol(shred); - let peers = children - .into_iter() - .filter_map(|node| node.contact_info()?.tvu(protocol).ok()) - .collect(); - Ok((root_distance, peers)) + let peers = children.into_iter().filter_map(|node| { + node.contact_info()? + .tvu(protocol) + .ok() + .filter(|addr| addrs.get(addr) == Some(&node.pubkey())) + }); + Ok((root_distance, peers.collect())) } pub fn get_retransmit_peers( @@ -199,10 +205,19 @@ impl ClusterNodes { if let Some(index) = self.index.get(slot_leader) { weighted_shuffle.remove_index(*index); } + let mut addrs = HashMap::::with_capacity(self.nodes.len()); let mut rng = get_seeded_rng(slot_leader, shred); + let protocol = get_broadcast_protocol(shred); let nodes: Vec<_> = weighted_shuffle .shuffle(&mut rng) .map(|index| &self.nodes[index]) + .inspect(|node| { + if let Some(node) = node.contact_info() { + if let Ok(addr) = node.tvu(protocol) { + addrs.entry(addr).or_insert(*node.pubkey()); + } + } + }) .collect(); let self_index = nodes .iter() @@ -221,6 +236,7 @@ impl ClusterNodes { Ok(RetransmitPeers { root_distance, children: peers.collect(), + addrs, }) }