node: Implement staggered broadcast for gossip
We use the staggered broadcast technique when relaying gossip messages to reduce message amplification. In our basic simulation, it brings amplification down from 3.5 to 1.5.
The idea is simply to accumulate gossip messages and relay them after a fixed interval of time. This has two effects:
- Old messages that haven’t been sent yet are replaced by newer ones, so only one message is sent after the delay.
- Because nodes have their own intervals, messages are not all sent at the same time, which reduces the chance of messages crossing paths.
For now we only turn this on for inventory messages, since this is the least likely to be noticed by users, and also the most problematic currently.
8 files changed
+556
-143
34d213ad
→
0834e0fc
modified radicle-cli/tests/commands.rs
@@ -1067,6 +1067,7 @@ fn rad_patch_delete() {
|
|
|
|
|
|
| + | |
|
|
|
|
|
modified radicle-node/src/service.rs
@@ -70,6 +70,8 @@ use self::policy::NamespacesError;
|
|
|
|
|
|
| + | |
| + | |
|
|
|
|
|
@@ -89,7 +91,7 @@ pub const MAX_CONNECTION_ATTEMPTS: usize = 3;
|
|
|
|
|
|
| - | |
| + | |
|
|
|
|
|
@@ -409,6 +411,9 @@ pub struct Service<D, S, G> {
|
|
|
|
|
|
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -427,6 +432,8 @@ pub struct Service<D, S, G> {
|
|
|
|
|
|
| + | |
| + | |
|
|
|
|
|
@@ -437,6 +444,8 @@ pub struct Service<D, S, G> {
|
|
|
|
|
|
| + | |
| + | |
|
|
|
|
|
@@ -502,12 +511,15 @@ where
|
|
|
|
|
|
| + | |
|
|
| + | |
|
|
|
|
|
|
|
|
| - | |
| + | |
| + | |
|
|
|
|
|
@@ -623,8 +635,16 @@ where
|
|
|
|
|
|
| - | |
|
|
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -726,6 +746,7 @@ where
|
|
|
|
|
|
| + | |
|
|
|
|
|
@@ -769,6 +790,15 @@ where
|
|
|
|
|
|
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -1399,9 +1429,10 @@ where
|
|
|
|
|
|
| + | |
|
|
|
|
| - | |
| + | |
|
|
|
|
|
@@ -1413,15 +1444,10 @@ where
|
|
|
|
|
|
| - | |
| + | |
|
|
|
|
|
|
| - | |
| - | |
| - | |
| - | |
| - | |
|
|
|
|
|
@@ -1441,29 +1467,47 @@ where
|
|
|
|
|
|
| - | |
| + | |
|
|
|
|
|
|
|
|
| - | |
| + | |
|
|
|
|
|
|
|
|
|
|
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
|
| - | |
| + | |
|
|
| - | |
| + | |
|
|
|
|
|
@@ -1481,12 +1525,12 @@ where
|
|
|
|
|
|
| - | |
| + | |
|
|
|
|
|
|
|
|
| - | |
| + | |
|
|
|
|
|
@@ -1534,7 +1578,7 @@ where
|
|
|
|
|
|
| - | |
| + | |
|
|
|
|
|
@@ -1587,7 +1631,7 @@ where
|
|
|
|
|
|
| - | |
| + | |
|
|
|
|
|
@@ -1661,7 +1705,7 @@ where
|
|
|
|
|
|
| - | |
| + | |
|
|
|
|
|
@@ -1713,21 +1757,22 @@ where
|
|
|
|
|
|
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
|
|
| - | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -1863,15 +1908,11 @@ where
|
|
|
|
|
|
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| + | |
| + | |
| + | |
| + | |
|
|
| - | |
|
|
|
|
|
@@ -2181,10 +2222,46 @@ where
|
|
|
|
|
|
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
|
|
|
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
modified radicle-node/src/service/gossip.rs
@@ -2,8 +2,7 @@ pub mod store;
|
|
|
|
|
|
| - | |
| - | |
| + | |
|
|
|
|
|
modified radicle-node/src/service/gossip/store.rs
@@ -23,6 +23,9 @@ pub enum Error {
|
|
|
|
|
|
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -35,7 +38,17 @@ pub trait Store {
|
|
|
|
|
|
| - | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -78,7 +91,11 @@ impl Store for Database {
|
|
|
|
|
|
| - | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -89,7 +106,8 @@ impl Store for Database {
|
|
|
|
|
|
| - | |
| + | |
| + | |
|
|
|
|
|
@@ -112,9 +130,53 @@ impl Store for Database {
|
|
|
|
|
|
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
| - | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -124,7 +186,7 @@ impl Store for Database {
|
|
|
|
|
|
| - | |
| + | |
|
|
|
|
|
@@ -138,32 +200,9 @@ impl Store for Database {
|
|
|
|
|
|
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -251,6 +290,24 @@ impl From<wire::Error> for sql::Error {
|
|
|
|
|
|
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -297,6 +354,43 @@ impl TryFrom<&sql::Value> for GossipType {
|
|
|
|
|
|
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -304,6 +398,7 @@ mod test {
|
|
|
|
|
|
| + | |
|
|
|
|
|
@@ -326,10 +421,26 @@ mod test {
|
|
|
|
|
|
| - | |
| - | |
| + | |
| + | |
|
|
| - | |
| - | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
modified radicle-node/src/test/peer.rs
@@ -201,11 +201,13 @@ where
|
|
|
|
|
|
| - | |
| - | |
| - | |
| - | |
| - | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -271,8 +273,9 @@ where
|
|
|
|
|
|
| - | |
| + | |
|
|
| + | |
|
|
|
|
|
modified radicle-node/src/tests.rs
@@ -2,19 +2,23 @@ mod e2e;
|
|
|
|
|
|
| + | |
|
|
|
|
|
|
|
|
|
|
|
|
| + | |
|
|
| - | |
| + | |
|
|
|
|
|
|
|
|
|
|
| + | |
| + | |
|
|
|
|
|
@@ -41,6 +45,7 @@ use crate::test::peer;
|
|
|
|
|
|
| + | |
|
|
|
|
|
@@ -49,6 +54,16 @@ use crate::worker::fetch;
|
|
|
|
|
|
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -590,38 +605,47 @@ fn test_announcement_relay() {
|
|
|
|
|
|
| - | |
| - | |
| + | |
| + | |
| + | |
|
|
|
|
|
|
|
|
|
|
| - | |
| + | |
|
|
|
|
|
|
|
|
|
|
|
|
| - | |
| + | |
| + | |
| + | |
|
|
|
|
|
|
|
|
|
|
|
|
| - | |
| + | |
| + | |
| + | |
|
|
|
|
|
|
|
|
|
|
|
|
| - | |
| + | |
| + | |
| + | |
|
|
|
|
| - | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -633,7 +657,9 @@ fn test_announcement_relay() {
|
|
|
|
|
|
| - | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -688,7 +714,9 @@ fn test_refs_announcement_relay() {
|
|
|
|
|
|
| - | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -696,20 +724,26 @@ fn test_refs_announcement_relay() {
|
|
|
|
|
|
| - | |
| + | |
| + | |
| + | |
|
|
|
|
|
|
|
|
|
|
| - | |
| + | |
| + | |
| + | |
|
|
|
|
|
|
|
|
|
|
|
|
| - | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -938,6 +972,8 @@ fn test_refs_announcement_offline() {
|
|
|
|
|
|
| + | |
| + | |
|
|
|
|
|
@@ -950,16 +986,19 @@ fn test_inventory_relay() {
|
|
|
|
|
|
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -975,32 +1014,38 @@ fn test_inventory_relay() {
|
|
|
|
|
|
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
|
|
|
|
|
|
|
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -1013,16 +1058,19 @@ fn test_inventory_relay() {
|
|
|
|
|
|
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| - | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
|
|
|
|
|
@@ -1745,3 +1793,169 @@ fn prop_inventory_exchange_dense() {
|
|
|
|
|
|
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
modified radicle/src/node/db.rs
@@ -29,6 +29,7 @@ const MIGRATIONS: &[&str] = &[
|
|
|
|
|
|
| + | |
|
|
|
|
|
added radicle/src/node/db/migrations/5.sql
@@ -0,0 +1,7 @@
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |