aboutsummaryrefslogtreecommitdiff
path: root/src/sp/transport
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2024-10-13 15:43:49 -0700
committerGarrett D'Amore <garrett@damore.org>2024-10-13 15:43:49 -0700
commitb5ed36cabc3ffd16953665642a7bac6738c90ee8 (patch)
tree15364f8c67d540472af4322f7ff6005c374c4dca /src/sp/transport
parentfd11edd9d94fdd43ba541abc30b7868f79ffadb6 (diff)
downloadnng-b5ed36cabc3ffd16953665642a7bac6738c90ee8.tar.gz
nng-b5ed36cabc3ffd16953665642a7bac6738c90ee8.tar.bz2
nng-b5ed36cabc3ffd16953665642a7bac6738c90ee8.zip
fixes #1890 stats could support an inline lock - remove most atomics
This starts by updating UDP to use this approach, since we already have a convenient lock. We should look at doing the same for other stats.
Diffstat (limited to 'src/sp/transport')
-rw-r--r--src/sp/transport/udp/udp.c45
-rw-r--r--src/sp/transport/udp/udp_tran_test.c50
2 files changed, 73 insertions, 22 deletions
diff --git a/src/sp/transport/udp/udp.c b/src/sp/transport/udp/udp.c
index fd513386..165b118d 100644
--- a/src/sp/transport/udp/udp.c
+++ b/src/sp/transport/udp/udp.c
@@ -1347,49 +1347,50 @@ udp_ep_init(udp_ep **epp, nng_url *url, nni_sock *sock, nni_dialer *dialer,
nni_aio_init(&ep->resaio, udp_resolv_cb, ep);
nni_aio_completions_init(&ep->complq);
- NNI_STAT_ATOMIC(rcv_max_info, "rcv_max", "maximum receive size",
+ NNI_STAT_LOCK(rcv_max_info, "rcv_max", "maximum receive size",
NNG_STAT_LEVEL, NNG_UNIT_BYTES);
- NNI_STAT_ATOMIC(copy_max_info, "copy_max",
+ NNI_STAT_LOCK(copy_max_info, "copy_max",
"threshold to switch to loan-up", NNG_STAT_LEVEL, NNG_UNIT_BYTES);
- NNI_STAT_ATOMIC(rcv_reorder_info, "rcv_reorder",
+ NNI_STAT_LOCK(rcv_reorder_info, "rcv_reorder",
"messages received out of order", NNG_STAT_COUNTER,
NNG_UNIT_MESSAGES);
- NNI_STAT_ATOMIC(rcv_nomatch_info, "rcv_nomatch",
+ NNI_STAT_LOCK(rcv_nomatch_info, "rcv_nomatch",
"messages without a matching connection", NNG_STAT_COUNTER,
NNG_UNIT_MESSAGES);
- NNI_STAT_ATOMIC(rcv_toobig_info, "rcv_toobig",
+ NNI_STAT_LOCK(rcv_toobig_info, "rcv_toobig",
"received messages rejected because too big", NNG_STAT_COUNTER,
NNG_UNIT_MESSAGES);
- NNI_STAT_ATOMIC(rcv_copy_info, "rcv_copy",
+ NNI_STAT_LOCK(rcv_copy_info, "rcv_copy",
"received messages copied (small)", NNG_STAT_COUNTER,
NNG_UNIT_MESSAGES);
- NNI_STAT_ATOMIC(rcv_nocopy_info, "rcv_nocopy",
+ NNI_STAT_LOCK(rcv_nocopy_info, "rcv_nocopy",
"received messages zero copy (large)", NNG_STAT_COUNTER,
NNG_UNIT_MESSAGES);
- NNI_STAT_ATOMIC(rcv_nobuf_info, "rcv_nobuf",
+ NNI_STAT_LOCK(rcv_nobuf_info, "rcv_nobuf",
"received messages dropped no buffer", NNG_STAT_COUNTER,
NNG_UNIT_MESSAGES);
- NNI_STAT_ATOMIC(snd_toobig_info, "snd_toobig",
+ NNI_STAT_LOCK(snd_toobig_info, "snd_toobig",
"sent messages rejected because too big", NNG_STAT_COUNTER,
NNG_UNIT_MESSAGES);
- NNI_STAT_ATOMIC(snd_nobuf_info, "snd_nobuf",
+ NNI_STAT_LOCK(snd_nobuf_info, "snd_nobuf",
"sent messages dropped no buffer", NNG_STAT_COUNTER,
NNG_UNIT_MESSAGES);
- NNI_STAT_ATOMIC(peer_inactive_info, "peer_inactive",
+ NNI_STAT_LOCK(peer_inactive_info, "peer_inactive",
"connections closed due to inactive peer", NNG_STAT_COUNTER,
NNG_UNIT_EVENTS);
- nni_stat_init(&ep->st_rcv_max, &rcv_max_info);
- nni_stat_init(&ep->st_copy_max, &copy_max_info);
- nni_stat_init(&ep->st_rcv_copy, &rcv_copy_info);
- nni_stat_init(&ep->st_rcv_nocopy, &rcv_nocopy_info);
- nni_stat_init(&ep->st_rcv_reorder, &rcv_reorder_info);
- nni_stat_init(&ep->st_rcv_toobig, &rcv_toobig_info);
- nni_stat_init(&ep->st_rcv_nomatch, &rcv_nomatch_info);
- nni_stat_init(&ep->st_rcv_nobuf, &rcv_nobuf_info);
- nni_stat_init(&ep->st_snd_toobig, &snd_toobig_info);
- nni_stat_init(&ep->st_snd_nobuf, &snd_nobuf_info);
- nni_stat_init(&ep->st_peer_inactive, &peer_inactive_info);
+ nni_stat_init_lock(&ep->st_rcv_max, &rcv_max_info, &ep->mtx);
+ nni_stat_init_lock(&ep->st_copy_max, &copy_max_info, &ep->mtx);
+ nni_stat_init_lock(&ep->st_rcv_copy, &rcv_copy_info, &ep->mtx);
+ nni_stat_init_lock(&ep->st_rcv_nocopy, &rcv_nocopy_info, &ep->mtx);
+ nni_stat_init_lock(&ep->st_rcv_reorder, &rcv_reorder_info, &ep->mtx);
+ nni_stat_init_lock(&ep->st_rcv_toobig, &rcv_toobig_info, &ep->mtx);
+ nni_stat_init_lock(&ep->st_rcv_nomatch, &rcv_nomatch_info, &ep->mtx);
+ nni_stat_init_lock(&ep->st_rcv_nobuf, &rcv_nobuf_info, &ep->mtx);
+ nni_stat_init_lock(&ep->st_snd_toobig, &snd_toobig_info, &ep->mtx);
+ nni_stat_init_lock(&ep->st_snd_nobuf, &snd_nobuf_info, &ep->mtx);
+ nni_stat_init_lock(
+ &ep->st_peer_inactive, &peer_inactive_info, &ep->mtx);
if (listener) {
nni_listener_add_stat(listener, &ep->st_rcv_max);
diff --git a/src/sp/transport/udp/udp_tran_test.c b/src/sp/transport/udp/udp_tran_test.c
index fe567e7b..beebb2cd 100644
--- a/src/sp/transport/udp/udp_tran_test.c
+++ b/src/sp/transport/udp/udp_tran_test.c
@@ -309,6 +309,55 @@ test_udp_multi_small_burst(void)
NUTS_CLOSE(s1);
}
+void
+test_udp_stats(void)
+{
+ char msg[256];
+ char buf[256];
+ nng_socket s0;
+ nng_socket s1;
+ nng_listener l;
+ nng_dialer d;
+ size_t sz;
+ char *addr;
+ nng_stat *stat;
+
+ NUTS_ADDR(addr, "udp");
+
+ NUTS_OPEN(s0);
+ NUTS_PASS(nng_socket_set_ms(s0, NNG_OPT_RECVTIMEO, 100));
+ NUTS_PASS(nng_socket_set_ms(s0, NNG_OPT_SENDTIMEO, 100));
+ NUTS_PASS(nng_listener_create(&l, s0, addr));
+ NUTS_PASS(nng_listener_set_size(l, NNG_OPT_UDP_COPY_MAX, 100));
+ NUTS_PASS(nng_listener_get_size(l, NNG_OPT_UDP_COPY_MAX, &sz));
+ NUTS_TRUE(sz == 100);
+ NUTS_PASS(nng_listener_start(l, 0));
+
+ NUTS_OPEN(s1);
+ NUTS_PASS(nng_socket_set_ms(s1, NNG_OPT_RECVTIMEO, 100));
+ NUTS_PASS(nng_socket_set_ms(s1, NNG_OPT_SENDTIMEO, 100));
+ NUTS_PASS(nng_dialer_create(&d, s1, addr));
+ NUTS_PASS(nng_dialer_set_size(d, NNG_OPT_UDP_COPY_MAX, 100));
+ NUTS_PASS(nng_dialer_get_size(d, NNG_OPT_UDP_COPY_MAX, &sz));
+ NUTS_PASS(nng_dialer_start(d, 0));
+ nng_msleep(100);
+
+ for (int i = 0; i < 50; i++) {
+ NUTS_PASS(nng_send(s1, msg, 95, 0));
+ NUTS_PASS(nng_recv(s0, buf, &sz, 0));
+ NUTS_TRUE(sz == 95);
+ NUTS_PASS(nng_send(s0, msg, 95, 0));
+ NUTS_PASS(nng_recv(s1, buf, &sz, 0));
+ NUTS_TRUE(sz == 95);
+ }
+ NUTS_PASS(nng_stats_get(&stat));
+ nng_stats_dump(stat);
+ nng_stats_free(stat);
+
+ NUTS_CLOSE(s0);
+ NUTS_CLOSE(s1);
+}
+
NUTS_TESTS = {
{ "udp wild card connect fail", test_udp_wild_card_connect_fail },
@@ -321,5 +370,6 @@ NUTS_TESTS = {
{ "udp recv copy", test_udp_recv_copy },
{ "udp multi send recv", test_udp_multi_send_recv },
{ "udp multi small burst", test_udp_multi_small_burst },
+ { "udp stats", test_udp_stats },
{ NULL, NULL },
};