aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2023-02-08 14:04:47 +0100
committerChristian Grothoff <christian@grothoff.org>2023-02-08 14:04:53 +0100
commitb8b3894211fc321402ffe62afac6885f6657b722 (patch)
tree452872bc181589770a79a767c3a4ae9bd6c6212c /src
parent6b83e9a453ffc9ea0347a7e725c3a9b6d2a32517 (diff)
downloadgnunet-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.c48
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;