libgnunetchat

library for GNUnet Messenger
Log | Files | Refs | README | LICENSE

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:
Abenchmark/scaling.sh | 26++++++++++++++++++++++++++
Mtools/gnunet_messenger_ping.c | 64++++++++++++++++++++++++++++++++++++++++++----------------------
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",