commit b3f3c5c6a855472fd2b33a0a95502ff283af4af3
parent 36f3b287077765eb4a8c33a3ebd3c3097f96642c
Author: Jacki <jacki@thejackimonster.de>
Date: Sun, 16 Feb 2025 17:35:18 +0100
Implement benchmark for scaling during client growth using delayed pings
Signed-off-by: Jacki <jacki@thejackimonster.de>
Diffstat:
2 files changed, 68 insertions(+), 22 deletions(-)
diff --git a/benchmark/scaling.sh b/benchmark/scaling.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+COUNT=$1
+shift 1
+
+$(dirname $0)/.setup.sh
+PING=$(dirname $0)/../.build_benchmark/tools/messenger_ping
+
+pong() {
+ local INDEX=$1
+ shift 1
+
+ local PONGS=$((1 + $COUNT - $INDEX))
+ local TIMEOUT=$((1 + $PONGS))
+
+ sleep $INDEX
+ $PING -P -c $PONGS -t $TIMEOUT $@ > /dev/null
+}
+
+for INDEX in $(seq $COUNT); do
+ pong $INDEX $@ &
+done
+
+sleep 1.25
+$PING -c $COUNT -d 1 -t 1 $@
+
+wait
diff --git a/tools/gnunet_messenger_ping.c b/tools/gnunet_messenger_ping.c
@@ -63,6 +63,7 @@ struct GNUNET_MESSENGER_PingTool
char *room_name;
uint count;
uint timeout;
+ uint delay;
int public_room;
int auto_pong;
@@ -153,22 +154,6 @@ finish (void *cls)
}
}
-static enum GNUNET_GenericReturnValue
-member_callback (void *cls,
- struct GNUNET_MESSENGER_Room *room,
- const struct GNUNET_MESSENGER_Contact *contact)
-{
- struct GNUNET_MESSENGER_Ping *ping = cls;
-
- if (contact == ping->sender)
- return GNUNET_YES;
-
- GNUNET_CONTAINER_multishortmap_put(ping->pong_map, hash_contact (contact), NULL,
- GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
-
- return GNUNET_YES;
-}
-
static void
send_ping (struct GNUNET_MESSENGER_PingTool *tool,
struct GNUNET_MESSENGER_Room *room)
@@ -218,6 +203,16 @@ send_pong (struct GNUNET_MESSENGER_PingTool *tool,
}
static void
+delay_ping (void *cls)
+{
+ struct GNUNET_MESSENGER_PingTool *tool = cls;
+
+ tool->task = NULL;
+
+ send_ping(tool, tool->room);
+}
+
+static void
finish_ping (struct GNUNET_MESSENGER_PingTool *tool,
struct GNUNET_MESSENGER_Ping *ping,
struct GNUNET_MESSENGER_Room *room)
@@ -298,20 +293,38 @@ finish_ping (struct GNUNET_MESSENGER_PingTool *tool,
if (ping == tool->last_ping)
tool->last_ping = NULL;
+
+ if (tool->task)
+ GNUNET_SCHEDULER_cancel(tool->task);
if ((tool->permanent) || (tool->counter < tool->count))
- send_ping(tool, room);
+ tool->task = GNUNET_SCHEDULER_add_delayed_with_priority(
+ GNUNET_TIME_relative_multiply(GNUNET_TIME_relative_get_second_(), tool->delay),
+ GNUNET_SCHEDULER_PRIORITY_IDLE,
+ delay_ping,
+ tool);
else
- {
- if (tool->task)
- GNUNET_SCHEDULER_cancel(tool->task);
-
tool->task = GNUNET_SCHEDULER_add_delayed_with_priority(
GNUNET_TIME_relative_get_second_(),
GNUNET_SCHEDULER_PRIORITY_IDLE,
finish,
tool);
- }
+}
+
+static enum GNUNET_GenericReturnValue
+member_callback (void *cls,
+ struct GNUNET_MESSENGER_Room *room,
+ const struct GNUNET_MESSENGER_Contact *contact)
+{
+ struct GNUNET_MESSENGER_Ping *ping = cls;
+
+ if (contact == ping->sender)
+ return GNUNET_YES;
+
+ GNUNET_CONTAINER_multishortmap_put(ping->pong_map, hash_contact (contact), NULL,
+ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+
+ return GNUNET_YES;
}
static void
@@ -616,6 +629,13 @@ main (int argc,
"stop after a timeout in seconds",
&(tool.timeout)
),
+ GNUNET_GETOPT_option_uint(
+ 'd',
+ "delay",
+ "<delay>",
+ "delay next iteration in seconds",
+ &(tool.delay)
+ ),
GNUNET_GETOPT_option_flag(
'p',
"public",