diff options
author | Christian Grothoff <christian@grothoff.org> | 2023-02-08 14:04:47 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2023-02-08 14:04:53 +0100 |
commit | b8b3894211fc321402ffe62afac6885f6657b722 (patch) | |
tree | 452872bc181589770a79a767c3a4ae9bd6c6212c /src | |
parent | 6b83e9a453ffc9ea0347a7e725c3a9b6d2a32517 (diff) | |
download | gnunet-b8b3894211fc321402ffe62afac6885f6657b722.tar.gz gnunet-b8b3894211fc321402ffe62afac6885f6657b722.zip |
DHT: probabilistically verify blocks if CPU load is high-ish (fixes #7602)
Diffstat (limited to 'src')
-rw-r--r-- | src/dht/gnunet-service-dht_neighbours.c | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/src/dht/gnunet-service-dht_neighbours.c b/src/dht/gnunet-service-dht_neighbours.c index fe8106bca..010a7dd62 100644 --- a/src/dht/gnunet-service-dht_neighbours.c +++ b/src/dht/gnunet-service-dht_neighbours.c | |||
@@ -666,7 +666,8 @@ send_find_peer_message (void *cls) | |||
666 | NULL, | 666 | NULL, |
667 | 0, | 667 | 0, |
668 | "set-seen-size", | 668 | "set-seen-size", |
669 | GNUNET_CONTAINER_multipeermap_size (all_connected_peers), | 669 | GNUNET_CONTAINER_multipeermap_size ( |
670 | all_connected_peers), | ||
670 | NULL); | 671 | NULL); |
671 | GNUNET_CONTAINER_multipeermap_iterate (all_connected_peers, | 672 | GNUNET_CONTAINER_multipeermap_iterate (all_connected_peers, |
672 | &add_known_to_bloom, | 673 | &add_known_to_bloom, |
@@ -1996,14 +1997,45 @@ handle_dht_p2p_put (void *cls, | |||
1996 | GNUNET_NO); | 1997 | GNUNET_NO); |
1997 | return; | 1998 | return; |
1998 | } | 1999 | } |
1999 | if (GNUNET_NO == | ||
2000 | GNUNET_BLOCK_check_block (GDS_block_context, | ||
2001 | bd.type, | ||
2002 | bd.data, | ||
2003 | bd.data_size)) | ||
2004 | { | 2000 | { |
2005 | GNUNET_break_op (0); | 2001 | /* Only call 'check_block' if that keeps our CPU load (from |
2006 | return; | 2002 | the cryptography) below 50% on average */ |
2003 | static struct GNUNET_TIME_Relative avg_latency; | ||
2004 | static struct GNUNET_TIME_Absolute next_time; | ||
2005 | |||
2006 | if (GNUNET_TIME_absolute_is_past (next_time)) | ||
2007 | { | ||
2008 | struct GNUNET_TIME_Absolute now | ||
2009 | = GNUNET_TIME_absolute_get (); | ||
2010 | struct GNUNET_TIME_Relative latency; | ||
2011 | struct GNUNET_TIME_Relative delta; | ||
2012 | |||
2013 | if (GNUNET_NO == | ||
2014 | GNUNET_BLOCK_check_block (GDS_block_context, | ||
2015 | bd.type, | ||
2016 | bd.data, | ||
2017 | bd.data_size)) | ||
2018 | { | ||
2019 | GNUNET_break_op (0); | ||
2020 | return; | ||
2021 | } | ||
2022 | latency = GNUNET_TIME_absolute_get_duration (now); | ||
2023 | /* Use *moving average* to estimate check_block latency */ | ||
2024 | avg_latency | ||
2025 | = GNUNET_TIME_relative_divide ( | ||
2026 | GNUNET_TIME_relative_add ( | ||
2027 | GNUNET_TIME_relative_multiply (avg_latency, | ||
2028 | 7), | ||
2029 | latency), | ||
2030 | 8); | ||
2031 | /* average delay = 50% of avg_latency => 50% CPU load from crypto (at most) */ | ||
2032 | delta.rel_value_us | ||
2033 | = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, | ||
2034 | avg_latency.rel_value_us > 0 | ||
2035 | ? avg_latency.rel_value_us | ||
2036 | : 1LLU); | ||
2037 | next_time = GNUNET_TIME_relative_to_absolute (delta); | ||
2038 | } | ||
2007 | } | 2039 | } |
2008 | if (! has_path) | 2040 | if (! has_path) |
2009 | putlen = 0; | 2041 | putlen = 0; |