0dc2d92ad8
This fixes a bug introduced when we added heartbeat support. Recall that we handle the Bitcoin connection state machine on a per-peer basis. Each connection has a task created from the `Connection` struct, and a `Client: tower::Service` "frontend" that passes requests to it via a channel. In the `Connection` event loop, the connection checks whether the request channel has been closed, indicating no further requests from the `Client`, in which case it shuts itself down and cleans up resources. This occurs when all of the senders have been dropped. However, this behavior broke when we introduced heartbeat support, because we spawned an additional task to send heartbeat messages along the request channel. This meant that instead of having a single sender, dropped by the `Client`, we have two senders, the `Client` and the "shadow client" task that generates heartbeat messages. This means that when the `Client` is dropped, we still have a live sender and the connection is not closed. To fix this, the `Client` now uses a `oneshot` to shut down its corresponding heartbeat task. This closes all senders. |
||
---|---|---|
.github | ||
book | ||
tower-batch | ||
tower-fallback | ||
zebra-chain | ||
zebra-client | ||
zebra-consensus | ||
zebra-network | ||
zebra-rpc | ||
zebra-script | ||
zebra-state | ||
zebra-test | ||
zebra-utils | ||
zebrad | ||
.firebaserc | ||
.gitignore | ||
.rustfmt.toml | ||
Cargo.lock | ||
Cargo.toml | ||
Dockerfile | ||
LICENSE-APACHE | ||
LICENSE-MIT | ||
README.md | ||
clippy.toml | ||
cloudbuild.yaml | ||
codecov.yml | ||
firebase.json | ||
prometheus.yaml |
README.md
Hello! I am Zebra, an ongoing Rust implementation of a Zcash node.
Zebra is a work in progress. It is developed as a collection of zebra-*
libraries implementing the different components of a Zcash node (networking,
chain structures, consensus rules, etc), and a zebrad
binary which uses them.
Most of our work so far has gone into zebra-network
, building a new
networking stack for Zcash, and zebra-chain
, building foundational data
structures.
Rendered docs from the main
branch.
License
Zebra is distributed under the terms of both the MIT license and the Apache License (Version 2.0).
See LICENSE-APACHE and LICENSE-MIT.
Metrics
Notes on local metrics collection:
# create a storage volume for grafana (once)
sudo docker volume create grafana-storage
# create a storage volume for prometheus (once)
sudo docker volume create prometheus-storage
# run prometheus with the included config
sudo docker run --network host -v prometheus-storage:/prometheus -v /path/to/zebra/prometheus.yaml:/etc/prometheus/prometheus.yml prom/prometheus
# run grafana
sudo docker run -d --network host -e GF_SERVER_HTTP_PORT=3030 -v grafana-storage:/var/lib/grafana grafana/grafana
Now the grafana dashboard is available at http://localhost:3030 ; the default password is admin/admin.