diff options
| author | Garrett D'Amore <garrett@damore.org> | 2024-10-13 15:43:49 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2024-10-13 15:43:49 -0700 |
| commit | b5ed36cabc3ffd16953665642a7bac6738c90ee8 (patch) | |
| tree | 15364f8c67d540472af4322f7ff6005c374c4dca /src/sp/transport | |
| parent | fd11edd9d94fdd43ba541abc30b7868f79ffadb6 (diff) | |
| download | nng-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.c | 45 | ||||
| -rw-r--r-- | src/sp/transport/udp/udp_tran_test.c | 50 |
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, ©_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, ©_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 }, }; |
