Compare commits

..

12 Commits

Author SHA1 Message Date
mergify[bot]
0e3dc27c8d Move move tests into its own job (#6847) (#6848)
automerge
2019-11-08 20:16:51 -08:00
mergify[bot]
d0d8ac7eba Fix freeze and register_tick race (#6799) (#6846)
automerge
2019-11-08 18:24:59 -08:00
mergify[bot]
b414d151b8 Replay should respect order of register_ticks with respect to blockhashes (bp #6805) (#6824)
* Replay should respect order of register_ticks with respect to blockhashes (#6805)

(cherry picked from commit 66a0f54097)

* Remove merge conflict
2019-11-08 18:35:50 -07:00
Pankaj Garg
5766359cde [V0.20] Cherry pick from master branch (#6842)
automerge
2019-11-08 16:19:48 -08:00
mergify[bot]
b8ec5de36d run.sh logs validators to stderr (#6817) (#6826)
automerge
2019-11-08 13:13:34 -08:00
mergify[bot]
28ba9e2fa8 Add new fork log message for when the node is leader for consistency (#6808) (#6825)
(cherry picked from commit b800642fa4)
2019-11-08 13:59:10 -07:00
mergify[bot]
80d780d666 Upgrade Repair be more intelligent and agressive (bp #6789) (#6793)
automerge
2019-11-07 21:36:53 -08:00
mergify[bot]
e599a90333 Increase FEC ratio to 32:32 (#6800) (#6804)
automerge
2019-11-07 17:20:22 -08:00
mergify[bot]
efb8b6bf2f Avoid : in default log filename (#6796) (#6798)
automerge
2019-11-07 15:17:47 -08:00
Michael Vines
ea3eddfec4 Cargo.lock 2019-11-07 09:12:00 -07:00
Michael Vines
3a6857c749 Fix units on dead slots graph 2019-11-07 08:26:41 -07:00
Michael Vines
0efb12bb6b Update version to 0.20.4 2019-11-06 23:18:35 -07:00
101 changed files with 1137 additions and 874 deletions

628
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-archiver"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@@ -10,9 +10,9 @@ homepage = "https://solana.com/"
[dependencies]
clap = "2.33.0"
console = "0.9.0"
solana-core = { path = "../core", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-metrics = { path = "../metrics", version = "0.20.3" }
solana-netutil = { path = "../netutil", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-core = { path = "../core", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }

View File

@@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-banking-bench"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@@ -10,11 +10,11 @@ homepage = "https://solana.com/"
[dependencies]
log = "0.4.6"
rayon = "1.2.0"
solana-core = { path = "../core", version = "0.20.3" }
solana-ledger = { path = "../ledger", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-runtime = { path = "../runtime", version = "0.20.3" }
solana-measure = { path = "../measure", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-core = { path = "../core", version = "0.20.4" }
solana-ledger = { path = "../ledger", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-measure = { path = "../measure", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
rand = "0.6.5"
crossbeam-channel = "0.3"

View File

@@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-bench-exchange"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@@ -24,16 +24,16 @@ serde_derive = "1.0.101"
serde_json = "1.0.41"
serde_yaml = "0.8.11"
# solana-runtime = { path = "../solana/runtime"}
solana-core = { path = "../core", version = "0.20.3" }
solana-genesis = { path = "../genesis", version = "0.20.3" }
solana-client = { path = "../client", version = "0.20.3" }
solana-drone = { path = "../drone", version = "0.20.3" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.3" }
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-metrics = { path = "../metrics", version = "0.20.3" }
solana-netutil = { path = "../netutil", version = "0.20.3" }
solana-runtime = { path = "../runtime", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-core = { path = "../core", version = "0.20.4" }
solana-genesis = { path = "../genesis", version = "0.20.4" }
solana-client = { path = "../client", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.4" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.4" }
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
untrusted = "0.7.0"
ws = "0.9.1"

View File

@@ -2,13 +2,13 @@
authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-bench-streamer"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
[dependencies]
clap = "2.33.0"
solana-core = { path = "../core", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-netutil = { path = "../netutil", version = "0.20.3" }
solana-core = { path = "../core", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.4" }

View File

@@ -2,7 +2,7 @@
authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-bench-tps"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@@ -16,19 +16,19 @@ serde = "1.0.101"
serde_derive = "1.0.101"
serde_json = "1.0.41"
serde_yaml = "0.8.11"
solana-core = { path = "../core", version = "0.20.3" }
solana-genesis = { path = "../genesis", version = "0.20.3" }
solana-client = { path = "../client", version = "0.20.3" }
solana-drone = { path = "../drone", version = "0.20.3" }
solana-librapay-api = { path = "../programs/librapay_api", version = "0.20.3", optional = true }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-metrics = { path = "../metrics", version = "0.20.3" }
solana-measure = { path = "../measure", version = "0.20.3" }
solana-netutil = { path = "../netutil", version = "0.20.3" }
solana-runtime = { path = "../runtime", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.3", optional = true }
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.3", optional = true }
solana-core = { path = "../core", version = "0.20.4" }
solana-genesis = { path = "../genesis", version = "0.20.4" }
solana-client = { path = "../client", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.4" }
solana-librapay-api = { path = "../programs/librapay_api", version = "0.20.4", optional = true }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-measure = { path = "../measure", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.4", optional = true }
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.4", optional = true }
[dev-dependencies]
serial_test = "0.2.0"

View File

@@ -177,7 +177,7 @@ $ solana send-timestamp <PUBKEY> <PROCESS_ID> --date 2018-12-24T23:59:00
## Usage
### solana-cli
```text
solana-cli 0.20.3
solana-cli 0.20.4
Blockchain, Rebuilt for Scale
USAGE:

View File

@@ -126,7 +126,7 @@ The result field will be a JSON object with the following sub fields:
curl -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0", "id":1, "method":"getAccountInfo", "params":["2gVkYWexTHR5Hb2aLeQN3tnngvWzisFKXDUPrgMHpdST"]}' http://localhost:8899
// Result
{"jsonrpc":"2.0","result":{"executable":false,"owner":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lamports":1,"data":[3,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0.20.3,0,0,0,0,0,0,50,48,53,48,45,48,49,45,48,49,84,48,48,58,48,48,58,48,48,90,252,10,7,28,246,140,88,177,98,82,10,227,89,81,18,30,194,101,199,16,11,73,133,20,246,62,114,39,20,113,189,32,50,0,0,0,0,0,0,0,247,15,36,102,167,83,225,42,133,127,82,34,36,224,207,130,109,230,224,188,163,33,213,13,5,117,211,251,65,159,197,51,0,0,0,0,0,0]},"id":1}
{"jsonrpc":"2.0","result":{"executable":false,"owner":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lamports":1,"data":[3,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0.20.4,0,0,0,0,0,0,50,48,53,48,45,48,49,45,48,49,84,48,48,58,48,48,58,48,48,90,252,10,7,28,246,140,88,177,98,82,10,227,89,81,18,30,194,101,199,16,11,73,133,20,246,62,114,39,20,113,189,32,50,0,0,0,0,0,0,0,247,15,36,102,167,83,225,42,133,127,82,34,36,224,207,130,109,230,224,188,163,33,213,13,5,117,211,251,65,159,197,51,0,0,0,0,0,0]},"id":1}
```
### getBalance
@@ -729,7 +729,7 @@ Subscribe to an account to receive notifications when the lamports or data for a
#### Notification Format:
```bash
{"jsonrpc": "2.0","method": "accountNotification", "params": {"result": {"executable":false,"owner":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lamports":1,"data":[3,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0.20.3,0,0,0,0,0,0,50,48,53,48,45,48,49,45,48,49,84,48,48,58,48,48,58,48,48,90,252,10,7,28,246,140,88,177,98,82,10,227,89,81,18,30,194,101,199,16,11,73,133,20,246,62,114,39,20,113,189,32,50,0,0,0,0,0,0,0,247,15,36,102,167,83,225,42,133,127,82,34,36,224,207,130,109,230,224,188,163,33,213,13,5,117,211,251,65,159,197,51,0,0,0,0,0,0]},"subscription":0}}
{"jsonrpc": "2.0","method": "accountNotification", "params": {"result": {"executable":false,"owner":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"lamports":1,"data":[3,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0.20.4,0,0,0,0,0,0,50,48,53,48,45,48,49,45,48,49,84,48,48,58,48,48,58,48,48,90,252,10,7,28,246,140,88,177,98,82,10,227,89,81,18,30,194,101,199,16,11,73,133,20,246,62,114,39,20,113,189,32,50,0,0,0,0,0,0,0,247,15,36,102,167,83,225,42,133,127,82,34,36,224,207,130,109,230,224,188,163,33,213,13,5,117,211,251,65,159,197,51,0,0,0,0,0,0]},"subscription":0}}
```
### accountUnsubscribe
@@ -787,7 +787,7 @@ Subscribe to a program to receive notifications when the lamports or data for a
* `object` - account info JSON object \(see [getAccountInfo](jsonrpc-api.md#getaccountinfo) for field details\)
```bash
{"jsonrpc":"2.0","method":"programNotification","params":{{"result":["8Rshv2oMkPu5E4opXTRyuyBeZBqQ4S477VG26wUTFxUM",{"executable":false,"lamports":1,"owner":[129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"data":[1,1,1,0,0,0,0,0,0,0.20.3,0,0,0,0,0,0,50,48,49,56,45,49,50,45,50,52,84,50,51,58,53,57,58,48,48,90,235,233,39,152,15,44,117,176,41,89,100,86,45,61,2,44,251,46,212,37,35,118,163,189,247,84,27,235,178,62,55,89,0,0,0,0,50,0,0,0,0,0,0,0,235,233,39,152,15,44,117,176,41,89,100,86,45,61,2,44,251,46,212,37,35,118,163,189,247,84,27,235,178,62,45,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}],"subscription":0}}
{"jsonrpc":"2.0","method":"programNotification","params":{{"result":["8Rshv2oMkPu5E4opXTRyuyBeZBqQ4S477VG26wUTFxUM",{"executable":false,"lamports":1,"owner":[129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"data":[1,1,1,0,0,0,0,0,0,0.20.4,0,0,0,0,0,0,50,48,49,56,45,49,50,45,50,52,84,50,51,58,53,57,58,48,48,90,235,233,39,152,15,44,117,176,41,89,100,86,45,61,2,44,251,46,212,37,35,118,163,189,247,84,27,235,178,62,55,89,0,0,0,0,50,0,0,0,0,0,0,0,235,233,39,152,15,44,117,176,41,89,100,86,45,61,2,44,251,46,212,37,35,118,163,189,247,84,27,235,178,62,45,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}],"subscription":0}}
```
### programUnsubscribe

View File

@@ -11,7 +11,7 @@ This document proposes an easy to use software install and updater that can be u
The easiest install method for supported platforms:
```bash
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh
```
This script will check github for the latest tagged release and download and run the `solana-install-init` binary from there.
@@ -20,7 +20,7 @@ If additional arguments need to be specified during the installation, the follow
```bash
$ init_args=.... # arguments for `solana-install-init ...`
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh -s - ${init_args}
$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh -s - ${init_args}
```
### Fetch and run a pre-built installer from a Github release
@@ -28,7 +28,7 @@ $ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install
With a well-known release URL, a pre-built binary can be obtained for supported platforms:
```bash
$ curl -o solana-install-init https://github.com/solana-labs/solana/releases/download/v0.20.3/solana-install-init-x86_64-apple-darwin
$ curl -o solana-install-init https://github.com/solana-labs/solana/releases/download/v0.20.4/solana-install-init-x86_64-apple-darwin
$ chmod +x ./solana-install-init
$ ./solana-install-init --help
```

View File

@@ -47,7 +47,7 @@ The `solana-install` tool can be used to easily install and upgrade the cluster
#### Linux and mac OS
```bash
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh -s
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh -s
```
Alternatively build the `solana-install` program from source and run the following command to obtain the same result:

View File

@@ -5,7 +5,7 @@
The `solana-install` tool can be used to easily install and upgrade the validator software on Linux x86\_64 and mac OS systems.
```bash
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh -s
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh -s
```
Alternatively build the `solana-install` program from source and run the following command to obtain the same result:

View File

@@ -16,7 +16,7 @@ You can submit a JSON-RPC request to see the specific version of the cluster.
```bash
curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1, "method":"getVersion"}' edge.testnet.solana.com:8899
{"jsonrpc":"2.0","result":{"solana-core":"0.20.3"},"id":1}
{"jsonrpc":"2.0","result":{"solana-core":"0.20.4"},"id":1}
```
## Using a Different Testnet
@@ -28,17 +28,17 @@ This guide is written in the context of testnet.solana.com, our most stable clus
If you are bootstrapping with `solana-install`, you can specify the release tag or named channel to install to match your desired testnet.
```bash
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh -s - 0.20.3
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh -s - 0.20.4
```
```bash
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.3/install/solana-install-init.sh | sh -s - beta
curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.20.4/install/solana-install-init.sh | sh -s - beta
```
Similarly, you can add this argument to the `solana-install` command if you've built the program from source:
```bash
solana-install init 0.20.3
solana-install init 0.20.4
```
If you are downloading pre-compiled binaries or building from source, simply choose the release matching your desired testnet.

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-chacha-sys"
version = "0.20.3"
version = "0.20.4"
description = "Solana chacha-sys"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"

View File

@@ -7,7 +7,7 @@ steps:
timeout_in_minutes: 5
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_nightly_docker_image ci/test-checks.sh"
name: "checks"
timeout_in_minutes: 35
timeout_in_minutes: 20
- wait
- command: "ci/test-stable-perf.sh"
name: "stable-perf"
@@ -17,18 +17,21 @@ steps:
- "queue=cuda"
- command: "ci/test-bench.sh"
name: "bench"
timeout_in_minutes: 60
timeout_in_minutes: 30
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_stable_docker_image ci/test-stable.sh"
name: "stable"
timeout_in_minutes: 40
artifact_paths: "log-*.txt"
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_stable_docker_image ci/test-move.sh"
name: "move"
timeout_in_minutes: 20
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_stable_docker_image ci/test-local-cluster.sh"
name: "local-cluster"
timeout_in_minutes: 40
timeout_in_minutes: 30
artifact_paths: "log-*.txt"
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_nightly_docker_image ci/test-coverage.sh"
name: "coverage"
timeout_in_minutes: 40
timeout_in_minutes: 30
- wait
- trigger: "solana-secondary"
branches: "!pull/*"

1
ci/test-move.sh Symbolic link
View File

@@ -0,0 +1 @@
test-stable.sh

View File

@@ -28,18 +28,13 @@ rm -rf target/xargo # Issue #3105
# Run the appropriate test based on entrypoint
testName=$(basename "$0" .sh)
echo "Executing $testName"
case $testName in
test-stable)
echo "Executing $testName"
_ cargo +"$rust_stable" test --all --exclude solana-local-cluster ${V:+--verbose} -- --nocapture
_ cargo +"$rust_stable" test --manifest-path local_cluster/Cargo.toml --features=move ${V:+--verbose} test_bench_tps_local_cluster_move -- --nocapture
_ cargo +"$rust_stable" test --manifest-path programs/move_loader_api/Cargo.toml ${V:+--verbose} -- --nocapture
_ cargo +"$rust_stable" test --manifest-path programs/move_loader_program/Cargo.toml ${V:+--verbose} -- --nocapture
_ cargo +"$rust_stable" test --manifest-path programs/librapay_api/Cargo.toml ${V:+--verbose} -- --nocapture
;;
test-stable-perf)
echo "Executing $testName"
ci/affects-files.sh \
.rs$ \
Cargo.lock$ \
@@ -54,7 +49,7 @@ test-stable-perf)
^sdk/ \
|| {
annotate --style info \
"Skipped test-stable-perf as no relevant files were modified"
"Skipped $testName as no relevant files were modified"
exit 0
}
@@ -83,8 +78,30 @@ test-stable-perf)
_ cargo +"$rust_stable" build --bins ${V:+--verbose}
_ cargo +"$rust_stable" test --package solana-ledger --package solana-core --lib ${V:+--verbose} -- --nocapture
;;
test-move)
ci/affects-files.sh \
Cargo.lock$ \
Cargo.toml$ \
^ci/rust-version.sh \
^ci/test-stable.sh \
^ci/test-move.sh \
^programs/move_loader_api \
^programs/move_loader_program \
^programs/librapay_api \
^logger/ \
^runtime/ \
^sdk/ \
|| {
annotate --style info \
"Skipped $testName as no relevant files were modified"
exit 0
}
_ cargo +"$rust_stable" test --manifest-path programs/move_loader_api/Cargo.toml ${V:+--verbose} -- --nocapture
_ cargo +"$rust_stable" test --manifest-path programs/move_loader_program/Cargo.toml ${V:+--verbose} -- --nocapture
_ cargo +"$rust_stable" test --manifest-path programs/librapay_api/Cargo.toml ${V:+--verbose} -- --nocapture
exit 0
;;
test-local-cluster)
echo "Executing $testName"
_ cargo +"$rust_stable" build --release --bins ${V:+--verbose}
_ cargo +"$rust_stable" test --release --package solana-local-cluster ${V:+--verbose} -- --nocapture
exit 0

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-cli"
description = "Blockchain, Rebuilt for Scale"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@@ -26,23 +26,23 @@ serde = "1.0.101"
serde_derive = "1.0.101"
serde_json = "1.0.41"
serde_yaml = "0.8.11"
solana-budget-api = { path = "../programs/budget_api", version = "0.20.3" }
solana-client = { path = "../client", version = "0.20.3" }
solana-config-api = { path = "../programs/config_api", version = "0.20.3" }
solana-drone = { path = "../drone", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-netutil = { path = "../netutil", version = "0.20.3" }
solana-runtime = { path = "../runtime", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
solana-vote-signer = { path = "../vote-signer", version = "0.20.3" }
solana-budget-api = { path = "../programs/budget_api", version = "0.20.4" }
solana-client = { path = "../client", version = "0.20.4" }
solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
solana-vote-signer = { path = "../vote-signer", version = "0.20.4" }
url = "2.1.0"
[dev-dependencies]
solana-core = { path = "../core", version = "0.20.3" }
solana-budget-program = { path = "../programs/budget_program", version = "0.20.3" }
solana-core = { path = "../core", version = "0.20.4" }
solana-budget-program = { path = "../programs/budget_program", version = "0.20.4" }
[[bin]]
name = "solana"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-client"
version = "0.20.3"
version = "0.20.4"
description = "Solana Client"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -19,10 +19,10 @@ reqwest = { version = "0.9.22", default-features = false, features = ["rustls-tl
serde = "1.0.101"
serde_derive = "1.0.101"
serde_json = "1.0.41"
solana-netutil = { path = "../netutil", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
[dev-dependencies]
jsonrpc-core = "14.0.3"
jsonrpc-http-server = "14.0.3"
solana-logger = { path = "../logger", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.4" }

View File

@@ -1,7 +1,7 @@
[package]
name = "solana-core"
description = "Blockchain, Rebuilt for Scale"
version = "0.20.3"
version = "0.20.4"
documentation = "https://docs.rs/solana"
homepage = "https://solana.com/"
readme = "../README.md"
@@ -44,25 +44,25 @@ rayon = "1.2.0"
serde = "1.0.101"
serde_derive = "1.0.101"
serde_json = "1.0.41"
solana-budget-api = { path = "../programs/budget_api", version = "0.20.3" }
solana-budget-program = { path = "../programs/budget_program", version = "0.20.3" }
solana-chacha-sys = { path = "../chacha-sys", version = "0.20.3" }
solana-client = { path = "../client", version = "0.20.3" }
solana-drone = { path = "../drone", version = "0.20.3" }
solana-budget-api = { path = "../programs/budget_api", version = "0.20.4" }
solana-budget-program = { path = "../programs/budget_program", version = "0.20.4" }
solana-chacha-sys = { path = "../chacha-sys", version = "0.20.4" }
solana-client = { path = "../client", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.4" }
solana-ed25519-dalek = "0.2.0"
solana-ledger = { path = "../ledger", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-merkle-tree = { path = "../merkle-tree", version = "0.20.3" }
solana-metrics = { path = "../metrics", version = "0.20.3" }
solana-measure = { path = "../measure", version = "0.20.3" }
solana-netutil = { path = "../netutil", version = "0.20.3" }
solana-runtime = { path = "../runtime", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
solana-storage-program = { path = "../programs/storage_program", version = "0.20.3" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
solana-vote-signer = { path = "../vote-signer", version = "0.20.3" }
solana-ledger = { path = "../ledger", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-merkle-tree = { path = "../merkle-tree", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-measure = { path = "../measure", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-storage-program = { path = "../programs/storage_program", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
solana-vote-signer = { path = "../vote-signer", version = "0.20.4" }
symlink = "0.1.0"
sys-info = "0.5.8"
tempfile = "3.1.0"
@@ -71,7 +71,7 @@ tokio-codec = "0.1"
tokio-fs = "0.1"
tokio-io = "0.1"
untrusted = "0.7.0"
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.3" }
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.4" }
reed-solomon-erasure = { package = "solana-reed-solomon-erasure", version = "4.0.1-3", features = ["simd-accel"] }
[dev-dependencies]

View File

@@ -35,7 +35,7 @@ fn bench_shredder_ticks(bencher: &mut Bencher) {
let num_ticks = max_ticks_per_n_shreds(1) * num_shreds as u64;
let entries = create_ticks(num_ticks, Hash::default());
bencher.iter(|| {
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp.clone()).unwrap();
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp.clone(), 0).unwrap();
shredder.entries_to_shreds(&entries, true, 0);
})
}
@@ -50,7 +50,7 @@ fn bench_shredder_large_entries(bencher: &mut Bencher) {
let entries = make_large_unchained_entries(txs_per_entry, num_entries);
// 1Mb
bencher.iter(|| {
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp.clone()).unwrap();
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp.clone(), 0).unwrap();
shredder.entries_to_shreds(&entries, true, 0);
})
}
@@ -63,7 +63,7 @@ fn bench_deshredder(bencher: &mut Bencher) {
let num_shreds = ((10000 * 1000) + (shred_size - 1)) / shred_size;
let num_ticks = max_ticks_per_n_shreds(1) * num_shreds as u64;
let entries = create_ticks(num_ticks, Hash::default());
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp).unwrap();
let shredder = Shredder::new(1, 0, RECOMMENDED_FEC_RATE, kp, 0).unwrap();
let data_shreds = shredder.entries_to_shreds(&entries, true, 0).0;
bencher.iter(|| {
let raw = &mut Shredder::deshred(&data_shreds).unwrap();
@@ -75,7 +75,7 @@ fn bench_deshredder(bencher: &mut Bencher) {
fn bench_deserialize_hdr(bencher: &mut Bencher) {
let data = vec![0; SIZE_OF_DATA_SHRED_PAYLOAD];
let shred = Shred::new_from_data(2, 1, 1, Some(&data), true, true);
let shred = Shred::new_from_data(2, 1, 1, Some(&data), true, true, 0);
bencher.iter(|| {
let payload = shred.payload.clone();

View File

@@ -44,6 +44,7 @@ impl BroadcastRun for BroadcastFakeBlobsRun {
bank.parent().unwrap().slot(),
RECOMMENDED_FEC_RATE,
keypair.clone(),
(bank.tick_height() % bank.ticks_per_slot()) as u8,
)
.expect("Expected to create a new shredder");
@@ -76,7 +77,6 @@ impl BroadcastRun for BroadcastFakeBlobsRun {
}
blocktree.insert_shreds(data_shreds.clone(), None)?;
blocktree.insert_shreds(coding_shreds.clone(), None)?;
// 3) Start broadcast step
let peers = cluster_info.read().unwrap().tvu_peers();

View File

@@ -42,6 +42,7 @@ impl BroadcastRun for FailEntryVerificationBroadcastRun {
bank.parent().unwrap().slot(),
RECOMMENDED_FEC_RATE,
keypair.clone(),
(bank.tick_height() % bank.ticks_per_slot()) as u8,
)
.expect("Expected to create a new shredder");

View File

@@ -2,9 +2,11 @@ use super::broadcast_utils::{self, ReceiveResults};
use super::*;
use crate::broadcast_stage::broadcast_utils::UnfinishedSlotInfo;
use solana_ledger::entry::Entry;
use solana_ledger::shred::{Shred, Shredder, RECOMMENDED_FEC_RATE};
use solana_ledger::shred::{Shred, Shredder, RECOMMENDED_FEC_RATE, SHRED_TICK_REFERENCE_MASK};
use solana_sdk::pubkey::Pubkey;
use solana_sdk::signature::Keypair;
use solana_sdk::timing::duration_as_us;
use std::collections::HashMap;
use std::time::Duration;
#[derive(Default)]
@@ -14,7 +16,7 @@ struct BroadcastStats {
insert_shreds_elapsed: u64,
broadcast_elapsed: u64,
receive_elapsed: u64,
clone_and_seed_elapsed: u64,
seed_elapsed: u64,
}
impl BroadcastStats {
@@ -23,7 +25,7 @@ impl BroadcastStats {
self.shredding_elapsed = 0;
self.broadcast_elapsed = 0;
self.receive_elapsed = 0;
self.clone_and_seed_elapsed = 0;
self.seed_elapsed = 0;
}
}
@@ -46,7 +48,7 @@ impl StandardBroadcastRun {
}
}
fn check_for_interrupted_slot(&mut self) -> Option<Shred> {
fn check_for_interrupted_slot(&mut self, max_ticks_in_slot: u8) -> Option<Shred> {
let (slot, _) = self.current_slot_and_parent.unwrap();
let mut last_unfinished_slot_shred = self
.unfinished_slot
@@ -60,6 +62,7 @@ impl StandardBroadcastRun {
None,
true,
true,
max_ticks_in_slot & SHRED_TICK_REFERENCE_MASK,
))
} else {
None
@@ -76,32 +79,12 @@ impl StandardBroadcastRun {
last_unfinished_slot_shred
}
fn coalesce_shreds(
data_shreds: Vec<Shred>,
coding_shreds: Vec<Shred>,
last_unfinished_slot_shred: Option<Shred>,
) -> Vec<Shred> {
if let Some(shred) = last_unfinished_slot_shred {
data_shreds
.iter()
.chain(coding_shreds.iter())
.cloned()
.chain(std::iter::once(shred))
.collect::<Vec<_>>()
} else {
data_shreds
.iter()
.chain(coding_shreds.iter())
.cloned()
.collect::<Vec<_>>()
}
}
fn entries_to_shreds(
&mut self,
blocktree: &Blocktree,
entries: &[Entry],
is_slot_end: bool,
reference_tick: u8,
) -> (Vec<Shred>, Vec<Shred>) {
let (slot, parent_slot) = self.current_slot_and_parent.unwrap();
let shredder = Shredder::new(
@@ -109,6 +92,7 @@ impl StandardBroadcastRun {
parent_slot,
RECOMMENDED_FEC_RATE,
self.keypair.clone(),
reference_tick,
)
.expect("Expected to create a new shredder");
@@ -168,82 +152,104 @@ impl StandardBroadcastRun {
let to_shreds_start = Instant::now();
// 1) Check if slot was interrupted
let last_unfinished_slot_shred = self.check_for_interrupted_slot();
let last_unfinished_slot_shred =
self.check_for_interrupted_slot(bank.ticks_per_slot() as u8);
// 2) Convert entries to shreds and coding shreds
let (data_shreds, coding_shreds) = self.entries_to_shreds(
let (mut data_shreds, coding_shreds) = self.entries_to_shreds(
blocktree,
&receive_results.entries,
last_tick_height == bank.max_tick_height(),
(bank.tick_height() % bank.ticks_per_slot()) as u8,
);
if let Some(last_shred) = last_unfinished_slot_shred {
data_shreds.push(last_shred);
}
let to_shreds_elapsed = to_shreds_start.elapsed();
let clone_and_seed_start = Instant::now();
let all_shreds =
Self::coalesce_shreds(data_shreds, coding_shreds, last_unfinished_slot_shred);
let all_shreds_ = all_shreds.clone();
let all_seeds: Vec<[u8; 32]> = all_shreds.iter().map(|s| s.seed()).collect();
let clone_and_seed_elapsed = clone_and_seed_start.elapsed();
// 3) Insert shreds into blocktree
let insert_shreds_start = Instant::now();
blocktree
.insert_shreds(all_shreds_, None)
.expect("Failed to insert shreds in blocktree");
let insert_shreds_elapsed = insert_shreds_start.elapsed();
// 4) Broadcast the shreds
let broadcast_start = Instant::now();
let bank_epoch = bank.get_leader_schedule_epoch(bank.slot());
let stakes = staking_utils::staked_nodes_at_epoch(&bank, bank_epoch);
let all_shred_bufs: Vec<Vec<u8>> = all_shreds.into_iter().map(|s| s.payload).collect();
trace!("Broadcasting {:?} shreds", all_shred_bufs.len());
cluster_info.read().unwrap().broadcast_shreds(
sock,
all_shred_bufs,
&all_seeds,
self.maybe_insert_and_broadcast(
data_shreds,
true,
blocktree,
cluster_info,
stakes.as_ref(),
sock,
)?;
self.maybe_insert_and_broadcast(
coding_shreds,
false,
blocktree,
cluster_info,
stakes.as_ref(),
sock,
)?;
let broadcast_elapsed = broadcast_start.elapsed();
self.update_broadcast_stats(
duration_as_us(&receive_elapsed),
duration_as_us(&to_shreds_elapsed),
duration_as_us(&insert_shreds_elapsed),
duration_as_us(&broadcast_elapsed),
duration_as_us(&clone_and_seed_elapsed),
last_tick_height == bank.max_tick_height(),
);
self.update_broadcast_stats(BroadcastStats {
shredding_elapsed: duration_as_us(&to_shreds_elapsed),
receive_elapsed: duration_as_us(&receive_elapsed),
..BroadcastStats::default()
});
if last_tick_height == bank.max_tick_height() {
self.report_and_reset_stats();
self.unfinished_slot = None;
}
Ok(())
}
#[allow(clippy::too_many_arguments)]
fn update_broadcast_stats(
fn maybe_insert_and_broadcast(
&mut self,
receive_entries_elapsed: u64,
shredding_elapsed: u64,
insert_shreds_elapsed: u64,
broadcast_elapsed: u64,
clone_and_seed_elapsed: u64,
slot_ended: bool,
) {
self.stats.receive_elapsed += receive_entries_elapsed;
self.stats.shredding_elapsed += shredding_elapsed;
self.stats.insert_shreds_elapsed += insert_shreds_elapsed;
self.stats.broadcast_elapsed += broadcast_elapsed;
self.stats.clone_and_seed_elapsed += clone_and_seed_elapsed;
shreds: Vec<Shred>,
insert: bool,
blocktree: &Arc<Blocktree>,
cluster_info: &Arc<RwLock<ClusterInfo>>,
stakes: Option<&HashMap<Pubkey, u64>>,
sock: &UdpSocket,
) -> Result<()> {
let seed_start = Instant::now();
let seeds: Vec<[u8; 32]> = shreds.iter().map(|s| s.seed()).collect();
let seed_elapsed = seed_start.elapsed();
if slot_ended {
self.report_and_reset_stats()
// Insert shreds into blocktree
let insert_shreds_start = Instant::now();
if insert {
blocktree
.insert_shreds(shreds.clone(), None)
.expect("Failed to insert shreds in blocktree");
}
let insert_shreds_elapsed = insert_shreds_start.elapsed();
// Broadcast the shreds
let broadcast_start = Instant::now();
let shred_bufs: Vec<Vec<u8>> = shreds.into_iter().map(|s| s.payload).collect();
trace!("Broadcasting {:?} shreds", shred_bufs.len());
cluster_info
.read()
.unwrap()
.broadcast_shreds(sock, shred_bufs, &seeds, stakes)?;
let broadcast_elapsed = broadcast_start.elapsed();
self.update_broadcast_stats(BroadcastStats {
insert_shreds_elapsed: duration_as_us(&insert_shreds_elapsed),
broadcast_elapsed: duration_as_us(&broadcast_elapsed),
seed_elapsed: duration_as_us(&seed_elapsed),
..BroadcastStats::default()
});
Ok(())
}
fn update_broadcast_stats(&mut self, stats: BroadcastStats) {
self.stats.receive_elapsed += stats.receive_elapsed;
self.stats.shredding_elapsed += stats.shredding_elapsed;
self.stats.insert_shreds_elapsed += stats.insert_shreds_elapsed;
self.stats.broadcast_elapsed += stats.broadcast_elapsed;
self.stats.seed_elapsed += stats.seed_elapsed;
}
fn report_and_reset_stats(&mut self) {
@@ -259,11 +265,7 @@ impl StandardBroadcastRun {
),
("broadcast_time", self.stats.broadcast_elapsed as i64, i64),
("receive_time", self.stats.receive_elapsed as i64, i64),
(
"clone_and_seed",
self.stats.clone_and_seed_elapsed as i64,
i64
),
("seed", self.stats.seed_elapsed as i64, i64),
(
"num_shreds",
i64::from(self.unfinished_slot.unwrap().next_shred_index),
@@ -362,7 +364,7 @@ mod test {
// Slot 2 interrupted slot 1
let shred = run
.check_for_interrupted_slot()
.check_for_interrupted_slot(0)
.expect("Expected a shred that signals an interrupt");
// Validate the shred

View File

@@ -165,7 +165,7 @@ mod tests {
hasher.hash(&buf[..size]);
// golden needs to be updated if blob stuff changes....
let golden: Hash = "BdmY3efqu7zbnFuGRAeFANwa35HkDdQ7hwhYez3xGXiM"
let golden: Hash = "HLzH7Nrh4q2K5WTh3e9vPNFZ1QVYhVDRMN9u5v51GqpJ"
.parse()
.unwrap();

View File

@@ -820,7 +820,7 @@ impl ClusterInfo {
}
pub fn map_repair_request(&self, repair_request: &RepairType) -> Result<Vec<u8>> {
match repair_request {
RepairType::Blob(slot, blob_index) => {
RepairType::Shred(slot, blob_index) => {
datapoint_debug!(
"cluster_info-repair",
("repair-slot", *slot, i64),
@@ -1882,7 +1882,7 @@ mod tests {
fn window_index_request() {
let me = ContactInfo::new_localhost(&Pubkey::new_rand(), timestamp());
let mut cluster_info = ClusterInfo::new_with_invalid_keypair(me);
let rv = cluster_info.repair_request(&RepairType::Blob(0, 0));
let rv = cluster_info.repair_request(&RepairType::Shred(0, 0));
assert_matches!(rv, Err(Error::ClusterInfoError(ClusterInfoError::NoPeers)));
let gossip_addr = socketaddr!([127, 0, 0, 1], 1234);
@@ -1901,7 +1901,7 @@ mod tests {
);
cluster_info.insert_info(nxt.clone());
let rv = cluster_info
.repair_request(&RepairType::Blob(0, 0))
.repair_request(&RepairType::Shred(0, 0))
.unwrap();
assert_eq!(nxt.gossip, gossip_addr);
assert_eq!(rv.0, nxt.gossip);
@@ -1926,7 +1926,7 @@ mod tests {
while !one || !two {
//this randomly picks an option, so eventually it should pick both
let rv = cluster_info
.repair_request(&RepairType::Blob(0, 0))
.repair_request(&RepairType::Shred(0, 0))
.unwrap();
if rv.0 == gossip_addr {
one = true;

View File

@@ -18,8 +18,8 @@ use std::{
time::Duration,
};
pub const MAX_REPAIR_LENGTH: usize = 16;
pub const REPAIR_MS: u64 = 100;
pub const MAX_REPAIR_LENGTH: usize = 1024;
pub const REPAIR_MS: u64 = 50;
pub const MAX_ORPHANS: usize = 5;
pub enum RepairStrategy {
@@ -35,7 +35,7 @@ pub enum RepairStrategy {
pub enum RepairType {
Orphan(u64),
HighestBlob(u64, u64),
Blob(u64, u64),
Shred(u64, u64),
}
pub struct RepairSlotRange {
@@ -252,13 +252,13 @@ impl RepairService {
} else {
let reqs = blocktree.find_missing_data_indexes(
slot,
slot_meta.first_shred_timestamp,
slot_meta.consumed,
slot_meta.received,
max_repairs,
);
reqs.into_iter()
.map(|i| RepairType::Blob(slot, i))
.map(|i| RepairType::Shred(slot, i))
.collect()
}
}
@@ -478,12 +478,13 @@ mod test {
}
}
blocktree.insert_shreds(shreds_to_write, None).unwrap();
// sleep so that the holes are ready for repair
sleep(Duration::from_secs(1));
let expected: Vec<RepairType> = (0..num_slots)
.flat_map(|slot| {
missing_indexes_per_slot
.iter()
.map(move |blob_index| RepairType::Blob(slot as u64, *blob_index))
.map(move |blob_index| RepairType::Shred(slot as u64, *blob_index))
})
.collect();
@@ -543,7 +544,8 @@ mod test {
slot_shreds.remove(0);
blocktree.insert_shreds(slot_shreds, None).unwrap();
}
// sleep to make slot eligible for repair
sleep(Duration::from_secs(1));
// Iterate through all possible combinations of start..end (inclusive on both
// sides of the range)
for start in 0..slots.len() {
@@ -555,7 +557,7 @@ mod test {
..=repair_slot_range.end)
.map(|slot_index| {
if slots.contains(&(slot_index as u64)) {
RepairType::Blob(slot_index as u64, 0)
RepairType::Shred(slot_index as u64, 0)
} else {
RepairType::HighestBlob(slot_index as u64, 0)
}

View File

@@ -379,6 +379,7 @@ impl ReplayStage {
("leader", next_leader.to_string(), String),
);
info!("new fork:{} parent:{} (leader)", poh_slot, parent_slot);
let tpu_bank = bank_forks
.write()
.unwrap()
@@ -842,21 +843,21 @@ impl ReplayStage {
next_slots.sort();
next_slots
});
for (parent_id, children) in next_slots {
for (parent_slot, children) in next_slots {
let parent_bank = frozen_banks
.get(&parent_id)
.get(&parent_slot)
.expect("missing parent in bank forks")
.clone();
for child_id in children {
if forks.get(child_id).is_some() {
trace!("child already active or frozen {}", child_id);
for child_slot in children {
if forks.get(child_slot).is_some() {
trace!("child already active or frozen {}", child_slot);
continue;
}
let leader = leader_schedule_cache
.slot_leader_at(child_id, Some(&parent_bank))
.slot_leader_at(child_slot, Some(&parent_bank))
.unwrap();
info!("new fork:{} parent:{}", child_id, parent_id);
forks.insert(Bank::new_from_parent(&parent_bank, &leader, child_id));
info!("new fork:{} parent:{}", child_slot, parent_slot);
forks.insert(Bank::new_from_parent(&parent_bank, &leader, child_slot));
}
}
}
@@ -1005,7 +1006,7 @@ mod test {
let payload_len = SIZE_OF_DATA_SHRED_PAYLOAD;
let gibberish = [0xa5u8; PACKET_DATA_SIZE];
let mut data_header = DataShredHeader::default();
data_header.flags = DATA_COMPLETE_SHRED;
data_header.flags |= DATA_COMPLETE_SHRED;
let mut shred = Shred::new_empty_from_header(
ShredCommonHeader::default(),
data_header,

View File

@@ -308,7 +308,7 @@ mod test {
parent: u64,
keypair: &Arc<Keypair>,
) -> Vec<Shred> {
let shredder = Shredder::new(slot, parent, 0.0, keypair.clone())
let shredder = Shredder::new(slot, parent, 0.0, keypair.clone(), 0)
.expect("Failed to create entry shredder");
shredder.entries_to_shreds(&entries, true, 0).0
}

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-crate-features"
version = "0.20.3"
version = "0.20.4"
description = "Solana Crate Features"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-drone"
version = "0.20.3"
version = "0.20.4"
description = "Solana Drone"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -19,9 +19,9 @@ clap = "2.33"
log = "0.4.8"
serde = "1.0.101"
serde_derive = "1.0.101"
solana-logger = { path = "../logger", version = "0.20.3" }
solana-metrics = { path = "../metrics", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
tokio = "0.1"
tokio-codec = "0.1"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-fixed-buf"
version = "0.20.3"
version = "0.20.4"
description = "A fixed-size byte array that supports bincode serde"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-genesis"
description = "Blockchain, Rebuilt for Scale"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@@ -15,10 +15,10 @@ serde = "1.0.101"
serde_derive = "1.0.101"
serde_json = "1.0.41"
serde_yaml = "0.8.11"
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.3" }
solana-ledger = { path = "../ledger", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.4" }
solana-ledger = { path = "../ledger", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
tempfile = "3.1.0"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-genesis-programs"
version = "0.20.3"
version = "0.20.4"
description = "Solana genesis programs"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,24 +10,24 @@ edition = "2018"
[dependencies]
log = { version = "0.4.8" }
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.20.3" }
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.20.3" }
solana-budget-api = { path = "../programs/budget_api", version = "0.20.3" }
solana-budget-program = { path = "../programs/budget_program", version = "0.20.3" }
solana-config-api = { path = "../programs/config_api", version = "0.20.3" }
solana-config-program = { path = "../programs/config_program", version = "0.20.3" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.3" }
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.3" }
solana-runtime = { path = "../runtime", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
solana-stake-program = { path = "../programs/stake_program", version = "0.20.3" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
solana-storage-program = { path = "../programs/storage_program", version = "0.20.3" }
solana-vest-api = { path = "../programs/vest_api", version = "0.20.3" }
solana-vest-program = { path = "../programs/vest_program", version = "0.20.3" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
solana-vote-program = { path = "../programs/vote_program", version = "0.20.3" }
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.20.4" }
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.20.4" }
solana-budget-api = { path = "../programs/budget_api", version = "0.20.4" }
solana-budget-program = { path = "../programs/budget_program", version = "0.20.4" }
solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
solana-config-program = { path = "../programs/config_program", version = "0.20.4" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.4" }
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-stake-program = { path = "../programs/stake_program", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-storage-program = { path = "../programs/storage_program", version = "0.20.4" }
solana-vest-api = { path = "../programs/vest_api", version = "0.20.4" }
solana-vest-program = { path = "../programs/vest_program", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
solana-vote-program = { path = "../programs/vote_program", version = "0.20.4" }
[lib]
crate-type = ["lib"]

View File

@@ -3,18 +3,18 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-gossip"
description = "Blockchain, Rebuilt for Scale"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
[dependencies]
clap = "2.33.0"
solana-core = { path = "../core", version = "0.20.3" }
solana-client = { path = "../client", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-netutil = { path = "../netutil", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-core = { path = "../core", version = "0.20.4" }
solana-client = { path = "../client", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-install"
description = "The solana cluster software installer"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@@ -28,10 +28,10 @@ serde = "1.0.101"
serde_derive = "1.0.101"
serde_yaml = "0.8.11"
sha2 = "0.8.0"
solana-client = { path = "../client", version = "0.20.3" }
solana-config-api = { path = "../programs/config_api", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-client = { path = "../client", version = "0.20.4" }
solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
tar = "0.4.26"
tempdir = "0.3.7"
url = "2.1.0"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-keygen"
version = "0.20.3"
version = "0.20.4"
description = "Solana key generation utility"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -15,7 +15,7 @@ edition = "2018"
clap = "2.33"
dirs = "2.0.2"
rpassword = "4.0"
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
tiny-bip39 = "0.6.2"
[[bin]]

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-ledger-tool"
description = "Blockchain, Rebuilt for Scale"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@@ -15,11 +15,11 @@ serde = "1.0.101"
serde_derive = "1.0.101"
serde_json = "1.0.41"
serde_yaml = "0.8.11"
solana-ledger = { path = "../ledger", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-runtime = { path = "../runtime", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
solana-ledger = { path = "../ledger", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
[dev-dependencies]
assert_cmd = "0.11"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-ledger"
version = "0.20.3"
version = "0.20.4"
description = "Solana ledger"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -27,16 +27,16 @@ rayon = "1.2.0"
reed-solomon-erasure = { package = "solana-reed-solomon-erasure", version = "4.0.1-3", features = ["simd-accel"] }
serde = "1.0.101"
serde_derive = "1.0.101"
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-measure = { path = "../measure", version = "0.20.3" }
solana-merkle-tree = { path = "../merkle-tree", version = "0.20.3" }
solana-metrics = { path = "../metrics", version = "0.20.3" }
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.3" }
solana-runtime = { path = "../runtime", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-measure = { path = "../measure", version = "0.20.4" }
solana-merkle-tree = { path = "../merkle-tree", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
sys-info = "0.5.8"
tar = "0.4.26"
tempfile = "3.1.0"
@@ -50,7 +50,7 @@ features = ["lz4"]
[dev-dependencies]
matches = "0.1.6"
solana-budget-api = { path = "../programs/budget_api", version = "0.20.3" }
solana-budget-api = { path = "../programs/budget_api", version = "0.20.4" }
[lib]
crate-type = ["lib"]

View File

@@ -20,10 +20,11 @@ use rocksdb::DBRawIterator;
use solana_measure::measure::Measure;
use solana_metrics::{datapoint_debug, datapoint_error};
use solana_rayon_threadlimit::get_thread_count;
use solana_sdk::clock::Slot;
use solana_sdk::clock::{Slot, DEFAULT_TICKS_PER_SECOND};
use solana_sdk::genesis_block::GenesisBlock;
use solana_sdk::hash::Hash;
use solana_sdk::signature::{Keypair, KeypairUtil};
use solana_sdk::timing::timestamp;
use std::cell::RefCell;
use std::cmp;
use std::collections::HashMap;
@@ -41,6 +42,7 @@ thread_local!(static PAR_THREAD_POOL: RefCell<ThreadPool> = RefCell::new(rayon::
.unwrap()));
pub const MAX_COMPLETED_SLOTS_IN_CHANNEL: usize = 100_000;
pub const MAX_TURBINE_PROPAGATION_DELAY_TICKS: u64 = 16;
pub type CompletedSlotsReceiver = Receiver<Vec<u64>>;
@@ -833,6 +835,7 @@ impl Blocktree {
slot_meta,
index as u32,
new_consumed,
shred.reference_tick(),
);
data_index.set_present(index, true);
trace!("inserted shred into slot {:?} and index {:?}", slot, index);
@@ -909,7 +912,7 @@ impl Blocktree {
},
|v| v,
);
let mut shredder = Shredder::new(current_slot, parent_slot, 0.0, keypair.clone())
let mut shredder = Shredder::new(current_slot, parent_slot, 0.0, keypair.clone(), 0)
.expect("Failed to create entry shredder");
let mut all_shreds = vec![];
let mut slot_entries = vec![];
@@ -932,8 +935,14 @@ impl Blocktree {
shredder.entries_to_shreds(&current_entries, true, start_index);
all_shreds.append(&mut data_shreds);
all_shreds.append(&mut coding_shreds);
shredder = Shredder::new(current_slot, parent_slot, 0.0, keypair.clone())
.expect("Failed to create entry shredder");
shredder = Shredder::new(
current_slot,
parent_slot,
0.0,
keypair.clone(),
(ticks_per_slot - remaining_ticks_in_slot) as u8,
)
.expect("Failed to create entry shredder");
}
if entry.is_tick() {
@@ -970,7 +979,8 @@ impl Blocktree {
// for the slot with the specified slot
fn find_missing_indexes<C>(
db_iterator: &mut DBRawIterator,
slot: u64,
slot: Slot,
first_timestamp: u64,
start_index: u64,
end_index: u64,
max_missing: usize,
@@ -983,6 +993,8 @@ impl Blocktree {
}
let mut missing_indexes = vec![];
let ticks_since_first_insert =
DEFAULT_TICKS_PER_SECOND * (timestamp() - first_timestamp) / 1000;
// Seek to the first shred with index >= start_index
db_iterator.seek(&C::key((slot, start_index)));
@@ -1010,7 +1022,15 @@ impl Blocktree {
};
let upper_index = cmp::min(current_index, end_index);
// the tick that will be used to figure out the timeout for this hole
let reference_tick = u64::from(Shred::reference_tick_from_data(
&db_iterator.value().expect("couldn't read value"),
));
if ticks_since_first_insert < reference_tick + MAX_TURBINE_PROPAGATION_DELAY_TICKS {
// The higher index holes have not timed out yet
break 'outer;
}
for i in prev_index..upper_index {
missing_indexes.push(i);
if missing_indexes.len() == max_missing {
@@ -1035,7 +1055,8 @@ impl Blocktree {
pub fn find_missing_data_indexes(
&self,
slot: u64,
slot: Slot,
first_timestamp: u64,
start_index: u64,
end_index: u64,
max_missing: usize,
@@ -1047,6 +1068,7 @@ impl Blocktree {
Self::find_missing_indexes::<cf::ShredData>(
&mut db_iterator,
slot,
first_timestamp,
start_index,
end_index,
max_missing,
@@ -1311,10 +1333,17 @@ fn update_slot_meta(
slot_meta: &mut SlotMeta,
index: u32,
new_consumed: u64,
reference_tick: u8,
) {
let maybe_first_insert = slot_meta.received == 0;
// Index is zero-indexed, while the "received" height starts from 1,
// so received = index + 1 for the same shred.
slot_meta.received = cmp::max((u64::from(index) + 1) as u64, slot_meta.received);
if maybe_first_insert && slot_meta.received > 0 {
// predict the timestamp of what would have been the first shred in this slot
let slot_time_elapsed = u64::from(reference_tick) * 1000 / DEFAULT_TICKS_PER_SECOND;
slot_meta.first_shred_timestamp = timestamp() - slot_time_elapsed;
}
slot_meta.consumed = new_consumed;
slot_meta.last_index = {
// If the last index in the slot hasn't been set before, then
@@ -1707,7 +1736,7 @@ pub fn create_new_ledger(ledger_path: &Path, genesis_block: &GenesisBlock) -> Re
let entries = create_ticks(ticks_per_slot, genesis_block.hash());
let last_hash = entries.last().unwrap().hash;
let shredder = Shredder::new(0, 0, 0.0, Arc::new(Keypair::new()))
let shredder = Shredder::new(0, 0, 0.0, Arc::new(Keypair::new()), 0)
.expect("Failed to create entry shredder");
let shreds = shredder.entries_to_shreds(&entries, true, 0).0;
assert!(shreds.last().unwrap().last_in_slot());
@@ -1792,7 +1821,7 @@ pub fn entries_to_test_shreds(
parent_slot: u64,
is_full_slot: bool,
) -> Vec<Shred> {
let shredder = Shredder::new(slot, parent_slot, 0.0, Arc::new(Keypair::new()))
let shredder = Shredder::new(slot, parent_slot, 0.0, Arc::new(Keypair::new()), 0)
.expect("Failed to create entry shredder");
shredder.entries_to_shreds(&entries, is_full_slot, 0).0
@@ -3163,27 +3192,27 @@ pub mod tests {
// range of [0, gap)
let expected: Vec<u64> = (1..gap).collect();
assert_eq!(
blocktree.find_missing_data_indexes(slot, 0, gap, gap as usize),
blocktree.find_missing_data_indexes(slot, 0, 0, gap, gap as usize),
expected
);
assert_eq!(
blocktree.find_missing_data_indexes(slot, 1, gap, (gap - 1) as usize),
blocktree.find_missing_data_indexes(slot, 0, 1, gap, (gap - 1) as usize),
expected,
);
assert_eq!(
blocktree.find_missing_data_indexes(slot, 0, gap - 1, (gap - 1) as usize),
blocktree.find_missing_data_indexes(slot, 0, 0, gap - 1, (gap - 1) as usize),
&expected[..expected.len() - 1],
);
assert_eq!(
blocktree.find_missing_data_indexes(slot, gap - 2, gap, gap as usize),
blocktree.find_missing_data_indexes(slot, 0, gap - 2, gap, gap as usize),
vec![gap - 2, gap - 1],
);
assert_eq!(
blocktree.find_missing_data_indexes(slot, gap - 2, gap, 1),
blocktree.find_missing_data_indexes(slot, 0, gap - 2, gap, 1),
vec![gap - 2],
);
assert_eq!(
blocktree.find_missing_data_indexes(slot, 0, gap, 1),
blocktree.find_missing_data_indexes(slot, 0, 0, gap, 1),
vec![1],
);
@@ -3192,11 +3221,11 @@ pub mod tests {
let mut expected: Vec<u64> = (1..gap).collect();
expected.push(gap + 1);
assert_eq!(
blocktree.find_missing_data_indexes(slot, 0, gap + 2, (gap + 2) as usize),
blocktree.find_missing_data_indexes(slot, 0, 0, gap + 2, (gap + 2) as usize),
expected,
);
assert_eq!(
blocktree.find_missing_data_indexes(slot, 0, gap + 2, (gap - 1) as usize),
blocktree.find_missing_data_indexes(slot, 0, 0, gap + 2, (gap - 1) as usize),
&expected[..expected.len() - 1],
);
@@ -3212,6 +3241,7 @@ pub mod tests {
assert_eq!(
blocktree.find_missing_data_indexes(
slot,
0,
j * gap,
i * gap,
((i - j) * gap) as usize
@@ -3225,6 +3255,34 @@ pub mod tests {
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
}
#[test]
fn test_find_missing_data_indexes_timeout() {
let slot = 0;
let blocktree_path = get_tmp_ledger_path!();
let blocktree = Blocktree::open(&blocktree_path).unwrap();
// Write entries
let gap: u64 = 10;
let shreds: Vec<_> = (0..64)
.map(|i| Shred::new_from_data(slot, (i * gap) as u32, 0, None, false, false, i as u8))
.collect();
blocktree.insert_shreds(shreds, None).unwrap();
let empty: Vec<u64> = vec![];
assert_eq!(
blocktree.find_missing_data_indexes(slot, timestamp(), 0, 50, 1),
empty
);
let expected: Vec<_> = (1..=9).collect();
assert_eq!(
blocktree.find_missing_data_indexes(slot, timestamp() - 400, 0, 50, 9),
expected
);
drop(blocktree);
Blocktree::destroy(&blocktree_path).expect("Expected successful database destruction");
}
#[test]
fn test_find_missing_data_indexes_sanity() {
let slot = 0;
@@ -3234,10 +3292,10 @@ pub mod tests {
// Early exit conditions
let empty: Vec<u64> = vec![];
assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 0, 1), empty);
assert_eq!(blocktree.find_missing_data_indexes(slot, 5, 5, 1), empty);
assert_eq!(blocktree.find_missing_data_indexes(slot, 4, 3, 1), empty);
assert_eq!(blocktree.find_missing_data_indexes(slot, 1, 2, 0), empty);
assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 0, 0, 1), empty);
assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 5, 5, 1), empty);
assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 4, 3, 1), empty);
assert_eq!(blocktree.find_missing_data_indexes(slot, 0, 1, 2, 0), empty);
let entries = create_ticks(100, Hash::default());
let mut shreds = entries_to_test_shreds(entries, slot, 0, true);
@@ -3261,7 +3319,7 @@ pub mod tests {
// [i, first_index - 1]
for start in 0..STARTS {
let result = blocktree.find_missing_data_indexes(
slot, start, // start
slot, 0, start, // start
END, //end
MAX, //max
);
@@ -3291,7 +3349,7 @@ pub mod tests {
for i in 0..num_shreds as u64 {
for j in 0..i {
assert_eq!(
blocktree.find_missing_data_indexes(slot, j, i, (i - j) as usize),
blocktree.find_missing_data_indexes(slot, 0, j, i, (i - j) as usize),
empty
);
}
@@ -3816,6 +3874,7 @@ pub mod tests {
Some(&[1, 1, 1]),
true,
true,
0,
)];
// With the corruption, nothing should be returned, even though an

View File

@@ -12,11 +12,13 @@ pub struct SlotMeta {
// The total number of consecutive blobs starting from index 0
// we have received for this slot.
pub consumed: u64,
// The index *plus one* of the highest blob received for this slot. Useful
// for checking if the slot has received any blobs yet, and to calculate the
// The index *plus one* of the highest shred received for this slot. Useful
// for checking if the slot has received any shreds yet, and to calculate the
// range where there is one or more holes: `(consumed..received)`.
pub received: u64,
// The index of the blob that is flagged as the last blob for this slot.
// The timestamp of the first time a shred was added for this slot
pub first_shred_timestamp: u64,
// The index of the shred that is flagged as the last shred for this slot.
pub last_index: u64,
// The slot height of the block this one derives from.
pub parent_slot: u64,
@@ -31,7 +33,7 @@ pub struct SlotMeta {
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
/// Index recording presence/absence of blobs
/// Index recording presence/absence of shreds
pub struct Index {
pub slot: u64,
data: DataIndex,
@@ -40,14 +42,14 @@ pub struct Index {
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
pub struct DataIndex {
/// Map representing presence/absence of data blobs
/// Map representing presence/absence of data shreds
index: BTreeSet<u64>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
/// Erasure coding information
pub struct CodingIndex {
/// Map from set index, to hashmap from blob index to presence bool
/// Map from set index, to hashmap from shred index to presence bool
index: BTreeSet<u64>,
}
@@ -145,8 +147,8 @@ impl DataIndex {
impl SlotMeta {
pub fn is_full(&self) -> bool {
// last_index is std::u64::MAX when it has no information about how
// many blobs will fill this slot.
// Note: A full slot with zero blobs is not possible.
// many shreds will fill this slot.
// Note: A full slot with zero shreds is not possible.
if self.last_index == std::u64::MAX {
return false;
}
@@ -179,6 +181,7 @@ impl SlotMeta {
slot,
consumed: 0,
received: 0,
first_shred_timestamp: 0,
parent_slot,
next_slots: vec![],
is_connected: slot == 0,

View File

@@ -114,8 +114,18 @@ fn process_entries_with_callback(
let mut tick_hashes = vec![];
for entry in entries {
if entry.is_tick() {
// if its a tick, save it for later
// If it's a tick, save it for later
tick_hashes.push(entry.hash);
if bank.is_block_boundary(bank.tick_height() + tick_hashes.len() as u64) {
// If it's a tick that will cause a new blockhash to be created,
// execute the group and register the tick
execute_batches(bank, &batches, entry_callback)?;
batches.clear();
for hash in &tick_hashes {
bank.register_tick(hash);
}
tick_hashes.clear();
}
continue;
}
// else loop on processing the entry
@@ -1825,6 +1835,33 @@ pub mod tests {
}
}
#[test]
fn test_process_ledger_ticks_ordering() {
let GenesisBlockInfo {
genesis_block,
mint_keypair,
..
} = create_genesis_block(100);
let bank0 = Arc::new(Bank::new(&genesis_block));
let genesis_hash = genesis_block.hash();
let keypair = Keypair::new();
// Simulate a slot of virtual ticks, creates a new blockhash
let mut entries = create_ticks(genesis_block.ticks_per_slot, genesis_hash);
// The new blockhash is going to be the hash of the last tick in the block
let new_blockhash = entries.last().unwrap().hash;
// Create an transaction that references the new blockhash, should still
// be able to find the blockhash if we process transactions all in the same
// batch
let tx = system_transaction::transfer(&mint_keypair, &keypair.pubkey(), 1, new_blockhash);
let entry = next_entry(&new_blockhash, 1, vec![tx]);
entries.push(entry);
process_entries_with_callback(&bank0, &entries, true, None).unwrap();
assert_eq!(bank0.get_balance(&keypair.pubkey()), 1)
}
fn get_epoch_schedule(
genesis_block: &GenesisBlock,
account_paths: Option<String>,

View File

@@ -8,12 +8,15 @@ use rayon::ThreadPool;
use serde::{Deserialize, Serialize};
use solana_metrics::datapoint_debug;
use solana_rayon_threadlimit::get_thread_count;
use solana_sdk::hash::Hash;
use solana_sdk::packet::PACKET_DATA_SIZE;
use solana_sdk::pubkey::Pubkey;
use solana_sdk::signature::{Keypair, KeypairUtil, Signature};
use std::sync::Arc;
use std::time::Instant;
use solana_sdk::{
clock::Slot,
hash::Hash,
packet::PACKET_DATA_SIZE,
pubkey::Pubkey,
signature::{Keypair, KeypairUtil, Signature},
};
use std::mem::size_of;
use std::{sync::Arc, time::Instant};
/// The following constants are computed by hand, and hardcoded.
/// `test_shred_constants` ensures that the values are correct.
@@ -38,15 +41,12 @@ thread_local!(static PAR_THREAD_POOL: RefCell<ThreadPool> = RefCell::new(rayon::
pub const DATA_SHRED: u8 = 0b1010_0101;
pub const CODING_SHRED: u8 = 0b0101_1010;
/// This limit comes from reed solomon library, but unfortunately they don't have
/// a public constant defined for it.
pub const MAX_DATA_SHREDS_PER_FEC_BLOCK: u32 = 16;
pub const MAX_DATA_SHREDS_PER_FEC_BLOCK: u32 = 32;
pub const RECOMMENDED_FEC_RATE: f32 = 1.0;
/// Based on rse benchmarks, the optimal erasure config uses 16 data shreds and 4 coding shreds
pub const RECOMMENDED_FEC_RATE: f32 = 0.25;
const LAST_SHRED_IN_SLOT: u8 = 0b0000_0001;
pub const DATA_COMPLETE_SHRED: u8 = 0b0000_0010;
pub const SHRED_TICK_REFERENCE_MASK: u8 = 0b0011_1111;
const LAST_SHRED_IN_SLOT: u8 = 0b1000_0000;
pub const DATA_COMPLETE_SHRED: u8 = 0b0100_0000;
#[derive(Debug)]
pub enum ShredError {
@@ -135,6 +135,7 @@ impl Shred {
data: Option<&[u8]>,
is_last_data: bool,
is_last_in_slot: bool,
reference_tick: u8,
) -> Self {
let mut payload = vec![0; PACKET_DATA_SIZE];
let mut common_header = ShredCommonHeader::default();
@@ -143,6 +144,7 @@ impl Shred {
let mut data_header = DataShredHeader::default();
data_header.parent_offset = parent_offset;
data_header.flags = reference_tick.min(SHRED_TICK_REFERENCE_MASK);
if is_last_data {
data_header.flags |= DATA_COMPLETE_SHRED
@@ -328,6 +330,19 @@ impl Shred {
}
}
pub fn reference_tick(&self) -> u8 {
if self.is_data() {
self.data_header.flags & SHRED_TICK_REFERENCE_MASK
} else {
SHRED_TICK_REFERENCE_MASK
}
}
pub fn reference_tick_from_data(data: &[u8]) -> u8 {
let flags = data[SIZE_OF_COMMON_SHRED_HEADER + SIZE_OF_DATA_SHRED_HEADER - size_of::<u8>()];
flags & SHRED_TICK_REFERENCE_MASK
}
pub fn verify(&self, pubkey: &Pubkey) -> bool {
self.signature()
.verify(pubkey.as_ref(), &self.payload[SIZE_OF_SIGNATURE..])
@@ -341,10 +356,17 @@ pub struct Shredder {
fec_rate: f32,
keypair: Arc<Keypair>,
pub signing_coding_time: u128,
reference_tick: u8,
}
impl Shredder {
pub fn new(slot: u64, parent_slot: u64, fec_rate: f32, keypair: Arc<Keypair>) -> Result<Self> {
pub fn new(
slot: Slot,
parent_slot: Slot,
fec_rate: f32,
keypair: Arc<Keypair>,
reference_tick: u8,
) -> Result<Self> {
if fec_rate > 1.0 || fec_rate < 0.0 {
Err(ShredError::InvalidFecRate(fec_rate))
} else if slot < parent_slot || slot - parent_slot > u64::from(std::u16::MAX) {
@@ -356,6 +378,7 @@ impl Shredder {
fec_rate,
keypair,
signing_coding_time: 0,
reference_tick,
})
}
}
@@ -399,6 +422,7 @@ impl Shredder {
Some(shred_data),
is_last_data,
is_last_in_slot,
self.reference_tick,
);
Shredder::sign_shred(&self.keypair, &mut shred);
@@ -801,7 +825,7 @@ pub mod tests {
// Test that parent cannot be > current slot
assert_matches!(
Shredder::new(slot, slot + 1, 1.00, keypair.clone()),
Shredder::new(slot, slot + 1, 1.00, keypair.clone(), 0),
Err(ShredError::SlotTooLow {
slot: _,
parent_slot: _,
@@ -809,7 +833,7 @@ pub mod tests {
);
// Test that slot - parent cannot be > u16 MAX
assert_matches!(
Shredder::new(slot, slot - 1 - 0xffff, 1.00, keypair.clone()),
Shredder::new(slot, slot - 1 - 0xffff, 1.00, keypair.clone(), 0),
Err(ShredError::SlotTooLow {
slot: _,
parent_slot: _,
@@ -818,7 +842,7 @@ pub mod tests {
let fec_rate = 0.25;
let parent_slot = slot - 5;
let shredder = Shredder::new(slot, parent_slot, fec_rate, keypair.clone())
let shredder = Shredder::new(slot, parent_slot, fec_rate, keypair.clone(), 0)
.expect("Failed in creating shredder");
let entries: Vec<_> = (0..5)
@@ -893,7 +917,7 @@ pub mod tests {
let slot = 1;
let parent_slot = 0;
let shredder = Shredder::new(slot, parent_slot, 0.0, keypair.clone())
let shredder = Shredder::new(slot, parent_slot, 0.0, keypair.clone(), 0)
.expect("Failed in creating shredder");
let entries: Vec<_> = (0..5)
@@ -913,6 +937,72 @@ pub mod tests {
assert_eq!(deserialized_shred, *data_shreds.last().unwrap());
}
#[test]
fn test_shred_reference_tick() {
let keypair = Arc::new(Keypair::new());
let slot = 1;
let parent_slot = 0;
let shredder = Shredder::new(slot, parent_slot, 0.0, keypair.clone(), 5)
.expect("Failed in creating shredder");
let entries: Vec<_> = (0..5)
.map(|_| {
let keypair0 = Keypair::new();
let keypair1 = Keypair::new();
let tx0 =
system_transaction::transfer(&keypair0, &keypair1.pubkey(), 1, Hash::default());
Entry::new(&Hash::default(), 1, vec![tx0])
})
.collect();
let data_shreds = shredder.entries_to_shreds(&entries, true, 0).0;
data_shreds.iter().for_each(|s| {
assert_eq!(s.reference_tick(), 5);
assert_eq!(Shred::reference_tick_from_data(&s.payload), 5);
});
let deserialized_shred =
Shred::new_from_serialized_shred(data_shreds.last().unwrap().payload.clone()).unwrap();
assert_eq!(deserialized_shred.reference_tick(), 5);
}
#[test]
fn test_shred_reference_tick_overflow() {
let keypair = Arc::new(Keypair::new());
let slot = 1;
let parent_slot = 0;
let shredder = Shredder::new(slot, parent_slot, 0.0, keypair.clone(), u8::max_value())
.expect("Failed in creating shredder");
let entries: Vec<_> = (0..5)
.map(|_| {
let keypair0 = Keypair::new();
let keypair1 = Keypair::new();
let tx0 =
system_transaction::transfer(&keypair0, &keypair1.pubkey(), 1, Hash::default());
Entry::new(&Hash::default(), 1, vec![tx0])
})
.collect();
let data_shreds = shredder.entries_to_shreds(&entries, true, 0).0;
data_shreds.iter().for_each(|s| {
assert_eq!(s.reference_tick(), SHRED_TICK_REFERENCE_MASK);
assert_eq!(
Shred::reference_tick_from_data(&s.payload),
SHRED_TICK_REFERENCE_MASK
);
});
let deserialized_shred =
Shred::new_from_serialized_shred(data_shreds.last().unwrap().payload.clone()).unwrap();
assert_eq!(
deserialized_shred.reference_tick(),
SHRED_TICK_REFERENCE_MASK
);
}
#[test]
fn test_data_and_code_shredder() {
let keypair = Arc::new(Keypair::new());
@@ -920,11 +1010,11 @@ pub mod tests {
let slot = 0x123456789abcdef0;
// Test that FEC rate cannot be > 1.0
assert_matches!(
Shredder::new(slot, slot - 5, 1.001, keypair.clone()),
Shredder::new(slot, slot - 5, 1.001, keypair.clone(), 0),
Err(ShredError::InvalidFecRate(_))
);
let shredder = Shredder::new(0x123456789abcdef0, slot - 5, 1.0, keypair.clone())
let shredder = Shredder::new(0x123456789abcdef0, slot - 5, 1.0, keypair.clone(), 0)
.expect("Failed in creating shredder");
// Create enough entries to make > 1 shred
@@ -966,7 +1056,7 @@ pub mod tests {
fn test_recovery_and_reassembly() {
let keypair = Arc::new(Keypair::new());
let slot = 0x123456789abcdef0;
let shredder = Shredder::new(slot, slot - 5, 1.0, keypair.clone())
let shredder = Shredder::new(slot, slot - 5, 1.0, keypair.clone(), 0)
.expect("Failed in creating shredder");
let keypair0 = Keypair::new();
@@ -1212,7 +1302,7 @@ pub mod tests {
fn test_multi_fec_block_coding() {
let keypair = Arc::new(Keypair::new());
let slot = 0x123456789abcdef0;
let shredder = Shredder::new(slot, slot - 5, 1.0, keypair.clone())
let shredder = Shredder::new(slot, slot - 5, 1.0, keypair.clone(), 0)
.expect("Failed in creating shredder");
let num_fec_sets = 100;

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-local-cluster"
description = "Blockchain, Rebuilt for Scale"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@@ -11,29 +11,29 @@ homepage = "https://solana.com/"
[dependencies]
log = "0.4.8"
rand = "0.6.5"
solana-bench-exchange = { path = "../bench-exchange", version = "0.20.3" }
solana-bench-tps = { path = "../bench-tps", version = "0.20.3" }
solana-config-api = { path = "../programs/config_api", version = "0.20.3" }
solana-core = { path = "../core", version = "0.20.3" }
solana-client = { path = "../client", version = "0.20.3" }
solana-drone = { path = "../drone", version = "0.20.3" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.3" }
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.3" }
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.3" }
solana-ledger = { path = "../ledger", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.3", optional = true }
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.3", optional = true }
solana-runtime = { path = "../runtime", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
solana-storage-program = { path = "../programs/storage_program", version = "0.20.3" }
solana-vest-api = { path = "../programs/vest_api", version = "0.20.3" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
solana-bench-exchange = { path = "../bench-exchange", version = "0.20.4" }
solana-bench-tps = { path = "../bench-tps", version = "0.20.4" }
solana-config-api = { path = "../programs/config_api", version = "0.20.4" }
solana-core = { path = "../core", version = "0.20.4" }
solana-client = { path = "../client", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.4" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.4" }
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.4" }
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.4" }
solana-ledger = { path = "../ledger", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.4", optional = true }
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.20.4", optional = true }
solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-storage-program = { path = "../programs/storage_program", version = "0.20.4" }
solana-vest-api = { path = "../programs/vest_api", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
symlink = "0.1.0"
tempfile = "3.1.0"
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.3" }
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.4" }
[dev-dependencies]
serial_test = "0.2.0"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-logger"
version = "0.20.3"
version = "0.20.4"
description = "Solana Logger"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"

View File

@@ -1,7 +1,7 @@
[package]
name = "solana-measure"
description = "Blockchain, Rebuilt for Scale"
version = "0.20.3"
version = "0.20.4"
documentation = "https://docs.rs/solana"
homepage = "https://solana.com/"
readme = "../README.md"
@@ -11,4 +11,4 @@ license = "Apache-2.0"
edition = "2018"
[dependencies]
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.4" }

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-merkle-tree"
version = "0.20.3"
version = "0.20.4"
description = "Solana Merkle Tree"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -9,7 +9,7 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
[dev-dependencies]
hex = "0.4.0"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-metrics"
version = "0.20.3"
version = "0.20.4"
description = "Solana Metrics"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -13,7 +13,7 @@ env_logger = "0.7.1"
lazy_static = "1.4.0"
log = "0.4.8"
reqwest = { version = "0.9.22", default-features = false, features = ["rustls-tls"] }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
sys-info = "0.5.8"
[dev-dependencies]

View File

@@ -4083,11 +4083,11 @@
"rgba(237, 129, 40, 0.89)",
"rgba(50, 172, 45, 0.97)"
],
"decimals": 2,
"decimals": 0,
"pattern": "/.*/",
"thresholds": [],
"type": "number",
"unit": "short"
"unit": "none"
}
],
"targets": [

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-netutil"
version = "0.20.3"
version = "0.20.4"
description = "Solana Network Utilities"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -18,7 +18,7 @@ rand = "0.6.1"
serde = "1.0.101"
serde_derive = "1.0.101"
socket2 = "0.3.11"
solana-logger = { path = "../logger", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.4" }
tokio = "0.1"
tokio-codec = "0.1"

View File

@@ -1,7 +1,7 @@
[package]
name = "solana-bpf-programs"
description = "Blockchain, Rebuilt for Scale"
version = "0.20.3"
version = "0.20.4"
documentation = "https://docs.rs/solana"
homepage = "https://solana.com/"
readme = "README.md"
@@ -22,10 +22,10 @@ walkdir = "2"
bincode = "1.1.4"
byteorder = "1.3.2"
elf = "0.0.10"
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-runtime = { path = "../../runtime", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.20.4" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-runtime = { path = "../../runtime", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana_rbpf = "=0.1.19"
[[bench]]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-128bit"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "0.20.3" }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
solana-bpf-rust-128bit-dep = { path = "../128bit_dep", version = "0.20.4" }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-128bit-dep"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-alloc"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-dep-crate"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -13,10 +13,10 @@ edition = "2018"
[dependencies]
byteorder = { version = "1", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-external-spend"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-iter"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-many-args"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "0.20.3" }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
solana-bpf-rust-many-args-dep = { path = "../many_args_dep", version = "0.20.4" }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-many-args-dep"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-noop"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-panic"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-param-passing"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,11 +12,11 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-bpf-rust-param-passing-dep = { path = "../param_passing_dep", version = "0.20.3" }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
solana-bpf-rust-param-passing-dep = { path = "../param_passing_dep", version = "0.20.4" }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-param-passing-dep"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -3,7 +3,7 @@
[package]
name = "solana-bpf-rust-sysval"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,10 +12,10 @@ homepage = "https://solana.com/"
edition = "2018"
[dependencies]
solana-sdk = { path = "../../../../sdk/", version = "0.20.3", default-features = false }
solana-sdk = { path = "../../../../sdk/", version = "0.20.4", default-features = false }
[dev_dependencies]
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.3" }
solana-sdk-bpf-test = { path = "../../../../sdk/bpf/rust/test", version = "0.20.4" }
[features]
program = ["solana-sdk/program"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-bpf-loader-api"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF Loader"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -14,8 +14,8 @@ byteorder = "1.3.2"
libc = "0.2.65"
log = "0.4.8"
serde = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana_rbpf = "=0.1.19"
[lib]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-bpf-loader-program"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF Loader"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,9 +10,9 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-bpf-loader-api = { path = "../bpf_loader_api", version = "0.20.4" }
[lib]
crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-btc-spv-api"
version = "0.20.3"
version = "0.20.4"
description = "Solana Bitcoin spv parsing program api"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -16,7 +16,7 @@ num-derive = "0.3"
num-traits = "0.2"
serde = "1.0.101"
serde_derive = "1.0.101"
solana-sdk = { path = "../../sdk", version = "0.20.3"}
solana-sdk = { path = "../../sdk", version = "0.20.4"}
hex = "0.3.2"
[lib]

View File

@@ -1,6 +1,6 @@
[package]
name = "btc_spv_bin"
version = "0.20.3"
version = "0.20.4"
description = "Solana Bitcoin spv parsing program"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-bitcoin-spv-program"
version = "0.20.3"
version = "0.20.4"
description = "Solana Bitcoin spv parsing program"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -16,8 +16,8 @@ num-derive = "0.3"
num-traits = "0.2"
serde = "1.0.101"
serde_derive = "1.0.101"
solana-sdk = { path = "../../sdk", version = "0.20.3"}
solana-btc-spv-api = { path = "../btc_spv_api", version = "0.20.3"}
solana-sdk = { path = "../../sdk", version = "0.20.4"}
solana-btc-spv-api = { path = "../btc_spv_api", version = "0.20.4"}
[lib]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-budget-api"
version = "0.20.3"
version = "0.20.4"
description = "Solana Budget program API"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -16,10 +16,10 @@ num-derive = "0.3"
num-traits = "0.2"
serde = "1.0.101"
serde_derive = "1.0.101"
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
[dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" }
solana-runtime = { path = "../../runtime", version = "0.20.4" }
[lib]
crate-type = ["lib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-budget-program"
version = "0.20.3"
version = "0.20.4"
description = "Solana budget program"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,9 +10,9 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-budget-api = { path = "../budget_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-budget-api = { path = "../budget_api", version = "0.20.4" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
[lib]
crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-config-api"
version = "0.20.3"
version = "0.20.4"
description = "config program API"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -13,7 +13,7 @@ bincode = "1.2.0"
log = "0.4.8"
serde = "1.0.101"
serde_derive = "1.0.101"
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
[lib]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-config-program"
version = "0.20.3"
version = "0.20.4"
description = "config program"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,9 +10,9 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-config-api = { path = "../config_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-config-api = { path = "../config_api", version = "0.20.4" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
[lib]
crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-config-tests"
version = "0.20.3"
version = "0.20.4"
description = "Solana config api tests"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -13,12 +13,12 @@ bincode = "1.2.0"
log = "0.4.8"
serde = "1.0.101"
serde_derive = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-config-api = { path = "../config_api", version = "0.20.3" }
solana-config-program = { path = "../config_program", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-config-api = { path = "../config_api", version = "0.20.4" }
solana-config-program = { path = "../config_program", version = "0.20.4" }
[dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" }
solana-runtime = { path = "../../runtime", version = "0.20.4" }
assert_matches = "1.3.0"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-exchange-api"
version = "0.20.3"
version = "0.20.4"
description = "Solana Exchange program API"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -13,12 +13,12 @@ bincode = "1.2.0"
log = "0.4.8"
serde = "1.0.101"
serde_derive = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-metrics = { path = "../../metrics", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-metrics = { path = "../../metrics", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
[dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" }
solana-runtime = { path = "../../runtime", version = "0.20.4" }
[lib]
crate-type = ["lib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-exchange-program"
version = "0.20.3"
version = "0.20.4"
description = "Solana exchange program"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,9 +10,9 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-exchange-api = { path = "../exchange_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-exchange-api = { path = "../exchange_api", version = "0.20.4" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
[lib]
crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-failure-program"
version = "0.20.3"
version = "0.20.4"
description = "Solana failure program"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,10 +10,10 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
[dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" }
solana-runtime = { path = "../../runtime", version = "0.20.4" }
[lib]
crate-type = ["cdylib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-librapay-api"
version = "0.20.3"
version = "0.20.4"
description = "Solana Libra Payment"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -11,12 +11,12 @@ edition = "2018"
[dependencies]
bincode = "1.2.0"
log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-runtime = { path = "../../runtime", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-runtime = { path = "../../runtime", version = "0.20.4" }
types = { version = "0.0.1-sol4", package = "solana_libra_types" }
language_e2e_tests = { version = "0.0.1-sol4", package = "solana_libra_language_e2e_tests" }
solana-move-loader-api = { path = "../move_loader_api", version = "0.20.3" }
solana-move-loader-api = { path = "../move_loader_api", version = "0.20.4" }
[lib]
crate-type = ["lib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-move-loader-api"
version = "0.20.3"
version = "0.20.4"
description = "Solana Move Loader"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -18,8 +18,8 @@ serde = "1.0.101"
serde_bytes = "0.11"
serde_derive = "1.0.101"
serde_json = "1.0.41"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
bytecode_verifier = { version = "0.0.1-sol4", package = "solana_libra_bytecode_verifier" }
canonical_serialization = { version = "0.0.1-sol4", package = "solana_libra_canonical_serialization" }

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-move-loader-program"
version = "0.20.3"
version = "0.20.4"
description = "Solana Move Loader"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,9 +10,9 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-move-loader-api = { path = "../move_loader_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-move-loader-api = { path = "../move_loader_api", version = "0.20.4" }
[lib]
crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-noop-program"
version = "0.20.3"
version = "0.20.4"
description = "Solana noop program"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,8 +10,8 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
[lib]
crate-type = ["cdylib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-stake-api"
version = "0.20.3"
version = "0.20.4"
description = "Solana Stake program API"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -16,11 +16,11 @@ num-traits = "0.2"
rand = "0.6.5"
serde = "1.0.101"
serde_derive = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-metrics = { path = "../../metrics", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-vote-api = { path = "../vote_api", version = "0.20.3" }
solana-config-api = { path = "../config_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-metrics = { path = "../../metrics", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-vote-api = { path = "../vote_api", version = "0.20.4" }
solana-config-api = { path = "../config_api", version = "0.20.4" }
[lib]
crate-type = ["lib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-stake-program"
version = "0.20.3"
version = "0.20.4"
description = "Solana stake program"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,9 +10,9 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-stake-api = { path = "../stake_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-stake-api = { path = "../stake_api", version = "0.20.4" }
[lib]
crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-stake-tests"
version = "0.20.3"
version = "0.20.4"
description = "Solana stake api tests"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,12 +10,12 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-stake-api = { path = "../stake_api", version = "0.20.3" }
solana-stake-program = { path = "../stake_program", version = "0.20.3" }
solana-vote-api = { path = "../vote_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-stake-api = { path = "../stake_api", version = "0.20.4" }
solana-stake-program = { path = "../stake_program", version = "0.20.4" }
solana-vote-api = { path = "../vote_api", version = "0.20.4" }
[dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" }
solana-runtime = { path = "../../runtime", version = "0.20.4" }
assert_matches = "1.3.0"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-storage-api"
version = "0.20.3"
version = "0.20.4"
description = "Solana Storage program API"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -17,8 +17,8 @@ num-derive = "0.3"
num-traits = "0.2"
serde = "1.0.101"
serde_derive = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
[lib]
crate-type = ["lib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-storage-program"
version = "0.20.3"
version = "0.20.4"
description = "Solana storage program"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,12 +10,12 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-storage-api = { path = "../storage_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-storage-api = { path = "../storage_api", version = "0.20.4" }
[dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" }
solana-runtime = { path = "../../runtime", version = "0.20.4" }
assert_matches = "1.3.0"
bincode = "1.2.0"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-vest-api"
version = "0.20.3"
version = "0.20.4"
description = "Solana Vest program API"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -16,11 +16,11 @@ num-derive = "0.2"
num-traits = "0.2"
serde = "1.0.100"
serde_derive = "1.0.100"
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-config-api = { path = "../config_api", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-config-api = { path = "../config_api", version = "0.20.4" }
[dev-dependencies]
solana-runtime = { path = "../../runtime", version = "0.20.3" }
solana-runtime = { path = "../../runtime", version = "0.20.4" }
[lib]
crate-type = ["lib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-vest-program"
version = "0.20.3"
version = "0.20.4"
description = "Solana Vest program"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,9 +10,9 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-vest-api = { path = "../vest_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-vest-api = { path = "../vest_api", version = "0.20.4" }
[lib]
crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-vote-api"
version = "0.20.3"
version = "0.20.4"
description = "Solana Vote program API"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -15,9 +15,9 @@ num-derive = "0.3"
num-traits = "0.2"
serde = "1.0.101"
serde_derive = "1.0.101"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-metrics = { path = "../../metrics", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-metrics = { path = "../../metrics", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
[lib]
crate-type = ["lib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-vote-program"
version = "0.20.3"
version = "0.20.4"
description = "Solana Vote program"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -10,9 +10,9 @@ edition = "2018"
[dependencies]
log = "0.4.8"
solana-logger = { path = "../../logger", version = "0.20.3" }
solana-sdk = { path = "../../sdk", version = "0.20.3" }
solana-vote-api = { path = "../vote_api", version = "0.20.3" }
solana-logger = { path = "../../logger", version = "0.20.4" }
solana-sdk = { path = "../../sdk", version = "0.20.4" }
solana-vote-api = { path = "../vote_api", version = "0.20.4" }
[lib]
crate-type = ["lib", "cdylib"]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-rayon-threadlimit"
version = "0.20.3"
version = "0.20.4"
description = "solana-rayon-threadlimit"
homepage = "https://solana.com/"
readme = "../README.md"

1
run.sh
View File

@@ -90,6 +90,7 @@ args=(
--rpc-port 8899
--rpc-drone-address 127.0.0.1:9900
--accounts "$dataDir"/accounts
--log -
)
if [[ -n $blockstreamSocket ]]; then
args+=(--blockstream "$blockstreamSocket")

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-runtime"
version = "0.20.3"
version = "0.20.4"
description = "Solana runtime"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -24,20 +24,20 @@ rayon = "1.2.0"
serde = { version = "1.0.101", features = ["rc"] }
serde_derive = "1.0.101"
serde_json = "1.0.41"
solana-logger = { path = "../logger", version = "0.20.3" }
solana-measure = { path = "../measure", version = "0.20.3" }
solana-metrics = { path = "../metrics", version = "0.20.3" }
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.20.3" }
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.3" }
solana-stake-program = { path = "../programs/stake_program", version = "0.20.3" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.3" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
solana-vote-program = { path = "../programs/vote_program", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-measure = { path = "../measure", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-bpf-loader-api = { path = "../programs/bpf_loader_api", version = "0.20.4" }
solana-bpf-loader-program = { path = "../programs/bpf_loader_program", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.4" }
solana-stake-program = { path = "../programs/stake_program", version = "0.20.4" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
solana-vote-program = { path = "../programs/vote_program", version = "0.20.4" }
sys-info = "0.5.8"
tempfile = "3.1.0"
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.3" }
solana-rayon-threadlimit = { path = "../rayon-threadlimit", version = "0.20.4" }
itertools = "0.8.0"
[lib]
@@ -45,4 +45,4 @@ crate-type = ["lib"]
name = "solana_runtime"
[dev-dependencies]
solana-noop-program = { path = "../programs/noop_program", version = "0.20.3" }
solana-noop-program = { path = "../programs/noop_program", version = "0.20.4" }

View File

@@ -810,15 +810,20 @@ impl Bank {
// TODO: put this assert back in
// assert!(!self.is_frozen());
inc_new_counter_debug!("bank-register_tick-registered", 1);
// Grab blockhash lock before incrementing tick height so that replay stage does
// not attempt to freeze after observing the last tick and before blockhash is
// updated
let mut w_blockhash_queue = self.blockhash_queue.write().unwrap();
let current_tick_height = self.tick_height.fetch_add(1, Ordering::Relaxed) as u64;
if current_tick_height % self.ticks_per_slot == self.ticks_per_slot - 1 {
self.blockhash_queue
.write()
.unwrap()
.register_hash(hash, &self.fee_calculator);
if self.is_block_boundary(current_tick_height + 1) {
w_blockhash_queue.register_hash(hash, &self.fee_calculator);
}
}
pub fn is_block_boundary(&self, tick_height: u64) -> bool {
tick_height % self.ticks_per_slot == 0
}
/// Process a Transaction. This is used for unit tests and simply calls the vector
/// Bank::process_transactions method, and commits credit-only credits.
pub fn process_transaction(&self, tx: &Transaction) -> Result<()> {

41
runtime/tests/bank.rs Normal file
View File

@@ -0,0 +1,41 @@
use solana_runtime::bank::Bank;
use solana_sdk::genesis_block::create_genesis_block;
use solana_sdk::hash::hash;
use solana_sdk::pubkey::Pubkey;
use std::sync::Arc;
use std::thread::Builder;
#[test]
fn test_race_register_tick_freeze() {
solana_logger::setup();
let (mut genesis_block, _) = create_genesis_block(50);
genesis_block.ticks_per_slot = 1;
let p = Pubkey::new_rand();
let hash = hash(p.as_ref());
for _ in 0..1000 {
let bank0 = Arc::new(Bank::new(&genesis_block));
let bank0_ = bank0.clone();
let freeze_thread = Builder::new()
.name("freeze".to_string())
.spawn(move || loop {
if bank0_.tick_height() == bank0_.max_tick_height() {
assert_eq!(bank0_.last_blockhash(), hash);
break;
}
})
.unwrap();
let bank0_ = bank0.clone();
let register_tick_thread = Builder::new()
.name("register_tick".to_string())
.spawn(move || {
bank0_.register_tick(&hash);
})
.unwrap();
register_tick_thread.join().unwrap();
freeze_thread.join().unwrap();
}
}

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-sdk-c"
version = "0.20.3"
version = "0.20.4"
description = "Solana SDK C"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -18,7 +18,7 @@ bs58 = "0.3.0"
libc = "0.2.65"
rand_chacha = "0.1.1"
rand_core = { version = ">=0.2, <0.4", default-features = false }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-ed25519-dalek = "0.2.0"
[build-dependencies]

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-sdk"
version = "0.20.3"
version = "0.20.4"
description = "Solana SDK"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -49,6 +49,6 @@ serde_derive = "1.0.101"
serde_json = { version = "1.0.41", optional = true }
sha2 = "0.8.0"
solana-ed25519-dalek = { version = "0.2.0", optional = true }
solana-logger = { path = "../logger", version = "0.20.3", optional = true }
solana-logger = { path = "../logger", version = "0.20.4", optional = true }
untrusted = { version = "0.7.0", optional = true }
solana-crate-features = { path = "../crate-features", version = "0.20.3", optional = true }
solana-crate-features = { path = "../crate-features", version = "0.20.4", optional = true }

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-sdk-bpf-test"
version = "0.20.3"
version = "0.20.4"
description = "Solana BPF SDK test utilities"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"

View File

@@ -1,6 +1,6 @@
[package]
name = "solana-upload-perf"
version = "0.20.3"
version = "0.20.4"
description = "Metrics Upload Utility"
authors = ["Solana Maintainers <maintainers@solana.com>"]
repository = "https://github.com/solana-labs/solana"
@@ -12,7 +12,7 @@ publish = false
[dependencies]
log = "0.4.8"
serde_json = "1.0.41"
solana-metrics = { path = "../metrics", version = "0.20.3" }
solana-metrics = { path = "../metrics", version = "0.20.4" }
[[bin]]
name = "solana-upload-perf"

View File

@@ -3,7 +3,7 @@ authors = ["Solana Maintainers <maintainers@solana.com>"]
edition = "2018"
name = "solana-validator"
description = "Blockchain, Rebuilt for Scale"
version = "0.20.3"
version = "0.20.4"
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
@@ -17,17 +17,17 @@ log = "0.4.8"
indicatif = "0.12.0"
reqwest = { version = "0.9.22", default-features = false }
serde_json = "1.0.41"
solana-client = { path = "../client", version = "0.20.3" }
solana-core = { path = "../core", version = "0.20.3" }
solana-drone = { path = "../drone", version = "0.20.3" }
solana-ledger = { path = "../ledger", version = "0.20.3" }
solana-logger = { path = "../logger", version = "0.20.3" }
solana-metrics = { path = "../metrics", version = "0.20.3" }
solana-netutil = { path = "../netutil", version = "0.20.3" }
solana-runtime = { path = "../runtime", version = "0.20.3" }
solana-sdk = { path = "../sdk", version = "0.20.3" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.3" }
solana-vote-signer = { path = "../vote-signer", version = "0.20.3" }
solana-client = { path = "../client", version = "0.20.4" }
solana-core = { path = "../core", version = "0.20.4" }
solana-drone = { path = "../drone", version = "0.20.4" }
solana-ledger = { path = "../ledger", version = "0.20.4" }
solana-logger = { path = "../logger", version = "0.20.4" }
solana-metrics = { path = "../metrics", version = "0.20.4" }
solana-netutil = { path = "../netutil", version = "0.20.4" }
solana-runtime = { path = "../runtime", version = "0.20.4" }
solana-sdk = { path = "../sdk", version = "0.20.4" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.4" }
solana-vote-signer = { path = "../vote-signer", version = "0.20.4" }
tempfile = "3.1.0"
tar = "0.4.26"

View File

@@ -539,7 +539,7 @@ pub fn main() {
let default_logfile = format!(
"solana-validator-{}-{}.log",
identity_keypair.pubkey(),
chrono::Local::now().to_rfc3339()
chrono::Utc::now().format("%Y%m%d-%H%M%S")
);
let logfile = matches.value_of("logfile").unwrap_or(&default_logfile);

Some files were not shown because too many files have changed in this diff Show More