Optimize RPC pubsub for multiple clients with the same subscription (#18943)

* reimplement rpc pubsub with a broadcast queue

* update tests for new pubsub implementation

* fix: fix review suggestions

* chore(rpc): add additional pubsub metrics

* integrate max subscriptions check into SubscriptionTracker to reduce locking

* separate subscription control from tracker

* limit memory usage of items in pubsub broadcast queue, improve error handling

* add more pubsub metrics

* add final count metrics to pubsub

* add metric for total number of subscriptions

* fix small review suggestions

* remove by_params from SubscriptionTracker and add node_progress_watchers map instead

* add subscription tracker tests

* add metrics for number of pubsub notifications as a counter

* ignore clippy lint in TokenCounter

* fix underflow in token counter

* reduce queue capacity in pubsub tests

* fix(rpc): fix test timeouts

* fix race in account subscription test

* Add RpcSubscriptions::new_for_tests

Co-authored-by: Pavel Strakhov <p.strakhov@iconic.vc>
Co-authored-by: Nikita Podoliako <n.podoliako@zubr.io>
Co-authored-by: Tyera Eulberg <tyera@solana.com>
This commit is contained in:
Pavel Strakhov
2021-09-17 22:40:14 +03:00
committed by GitHub
parent fc2bf2d3b6
commit 65227f44dc
22 changed files with 2555 additions and 2073 deletions

View File

@@ -14,6 +14,7 @@ base64 = "0.12.3"
bincode = "1.3.3"
bs58 = "0.4.0"
crossbeam-channel = "0.5"
dashmap = "4.0.2"
itertools = "0.10.1"
jsonrpc-core = "18.0.0"
jsonrpc-core-client = { version = "18.0.0", features = ["ipc", "ws"] }
@@ -27,6 +28,7 @@ regex = "1.5.4"
serde = "1.0.130"
serde_derive = "1.0.103"
serde_json = "1.0.68"
soketto = "0.6"
solana-account-decoder = { path = "../account-decoder", version = "=1.8.0" }
solana-client = { path = "../client", version = "=1.8.0" }
solana-entry = { path = "../entry", version = "=1.8.0" }
@@ -46,8 +48,10 @@ solana-transaction-status = { path = "../transaction-status", version = "=1.8.0"
solana-version = { path = "../version", version = "=1.8.0" }
solana-vote-program = { path = "../programs/vote", version = "=1.8.0" }
spl-token-v2-0 = { package = "spl-token", version = "=3.2.0", features = ["no-entrypoint"] }
stream-cancel = "0.8.1"
thiserror = "1.0"
tokio = { version = "1", features = ["full"] }
tokio-util = { version = "0.6", features = ["codec"] }
tokio-util = { version = "0.6", features = ["codec", "compat"] }
[dev-dependencies]
serial_test = "0.5.1"