aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2022-04-16 14:36:27 -0700
committerGarrett D'Amore <garrett@damore.org>2022-04-16 14:36:27 -0700
commit60bf092d3e6e68d0af55c78b679310b1687016e8 (patch)
tree9644e6ff61b4f23e4c77b01965fdfb928082b6a2 /src
parentef929a35833fed8eac4aaaf7739d4df1ed72ae00 (diff)
downloadnng-60bf092d3e6e68d0af55c78b679310b1687016e8.tar.gz
nng-60bf092d3e6e68d0af55c78b679310b1687016e8.tar.bz2
nng-60bf092d3e6e68d0af55c78b679310b1687016e8.zip
fixes #1577 nng_stat_find_socket always returns the same stats node
Also this fixes problems with uninitialized socket names, and the socket name stat not being adjusted correctly when set via API.
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt1
-rw-r--r--src/core/socket.c18
-rw-r--r--src/core/stats.c6
-rw-r--r--src/core/stats_test.c96
4 files changed, 115 insertions, 6 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 8ff5a80d..eb511a83 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -82,4 +82,5 @@ nng_test(list_test)
nng_test(message_test)
nng_test(reconnect_test)
nng_test(sock_test)
+nng_test(stats_test)
nng_test(url_test)
diff --git a/src/core/socket.c b/src/core/socket.c
index 75c9eedc..7d15f3cb 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -1,5 +1,5 @@
//
-// Copyright 2021 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2022 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
@@ -237,8 +237,13 @@ sock_get_sockname(void *s, void *buf, size_t *szp, nni_type t)
static int
sock_set_sockname(void *s, const void *buf, size_t sz, nni_type t)
{
- return (nni_copyin_str(
+ int rv;
+ rv = (nni_copyin_str(
SOCK(s)->s_name, buf, sizeof(SOCK(s)->s_name), sz, t));
+ if (rv == 0) {
+ nni_stat_set_string(&SOCK(s)->st_name, SOCK(s)->s_name);
+ }
+ return (rv);
}
static int
@@ -646,8 +651,11 @@ nni_sock_open(nni_sock **sockp, const nni_proto *proto)
(void) snprintf(s->s_name, sizeof(s->s_name), "%u", s->s_id);
#ifdef NNG_ENABLE_STATS
- // Set up basic stat values.
+ // Set up basic stat values. The socket id wasn't
+ // known at stat creation time, so we set it now.
nni_stat_set_id(&s->st_id, (int) s->s_id);
+ nni_stat_set_id(&s->st_root, (int) s->s_id);
+ nni_stat_set_string(&s->st_name, s->s_name);
// Add our stats chain.
nni_stat_register(&s->st_root);
@@ -1488,6 +1496,8 @@ nni_dialer_add_pipe(nni_dialer *d, void *tpipe)
return;
}
#ifdef NNG_ENABLE_STATS
+ nni_stat_set_id(&p->st_root, (int) p->p_id);
+ nni_stat_set_id(&p->st_id, (int) p->p_id);
nni_stat_register(&p->st_root);
#endif
nni_pipe_run_cb(p, NNG_PIPE_EV_ADD_POST);
@@ -1599,6 +1609,8 @@ nni_listener_add_pipe(nni_listener *l, void *tpipe)
return;
}
#ifdef NNG_ENABLE_STATS
+ nni_stat_set_id(&p->st_root, (int) p->p_id);
+ nni_stat_set_id(&p->st_id, (int) p->p_id);
nni_stat_register(&p->st_root);
#endif
nni_pipe_run_cb(p, NNG_PIPE_EV_ADD_POST);
diff --git a/src/core/stats.c b/src/core/stats.c
index f9de055e..50f24e29 100644
--- a/src/core/stats.c
+++ b/src/core/stats.c
@@ -1,5 +1,5 @@
//
-// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2022 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
@@ -463,7 +463,7 @@ nng_stat *
nng_stat_find_scope(nng_stat *stat, const char *name, int id)
{
nng_stat *child;
- if (stat == NULL) {
+ if (stat == NULL || stat->s_info->si_type != NNG_STAT_SCOPE) {
return (NULL);
}
if ((stat->s_val.sv_id == id) &&
@@ -473,7 +473,7 @@ nng_stat_find_scope(nng_stat *stat, const char *name, int id)
}
NNI_LIST_FOREACH (&stat->s_children, child) {
nng_stat *result;
- if ((result = nng_stat_find(child, name)) != NULL) {
+ if ((result = nng_stat_find_scope(child, name, id)) != NULL) {
return (result);
}
}
diff --git a/src/core/stats_test.c b/src/core/stats_test.c
new file mode 100644
index 00000000..ba4198ab
--- /dev/null
+++ b/src/core/stats_test.c
@@ -0,0 +1,96 @@
+//
+// Copyright 2022 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2018 Capitar IT Group BV <info@capitar.com>
+//
+// This software is supplied under the terms of the MIT License, a
+// copy of which should be located in the distribution where this
+// file was obtained (LICENSE.txt). A copy of the license may also be
+// found online at https://opensource.org/licenses/MIT.
+//
+
+#include <nuts.h>
+
+#define SECONDS(x) ((x) *1000)
+
+void
+test_stats_socket(void)
+{
+#ifdef NNG_ENABLE_STATS
+ nng_socket s1;
+ nng_socket s2;
+ nng_stat *st1;
+ nng_stat *st2;
+ nng_stat *item;
+ nng_stat *stats;
+
+ NUTS_OPEN(s1);
+ NUTS_OPEN(s2);
+ nng_socket_set_string(s2, NNG_OPT_SOCKNAME, "second");
+ NUTS_MARRY(s1, s2);
+ NUTS_SEND(s1, "ping");
+ NUTS_RECV(s2, "ping");
+
+ nng_stats_get(&stats);
+ NUTS_ASSERT(stats != NULL);
+ st1 = nng_stat_find_socket(stats, s1);
+ st2 = nng_stat_find_socket(stats, s2);
+ NUTS_ASSERT(st1 != NULL);
+ NUTS_ASSERT(st2 != NULL);
+ NUTS_ASSERT(st1 != st2);
+ item = nng_stat_find(st1, "name");
+ NUTS_ASSERT(item != NULL);
+ NUTS_ASSERT(nng_stat_string(item) != NULL);
+ NUTS_MATCH(nng_stat_string(item), "1");
+ item = nng_stat_find(st2, "name");
+ NUTS_ASSERT(item != NULL);
+ NUTS_ASSERT(nng_stat_string(item) != NULL);
+ NUTS_MATCH(nng_stat_string(item), "second");
+ item = nng_stat_find(st1, "tx_msgs");
+ NUTS_ASSERT(item != NULL);
+ NUTS_ASSERT(nng_stat_value(item) == 1);
+ NUTS_ASSERT(nng_stat_unit(item) == NNG_UNIT_MESSAGES);
+ item = nng_stat_find(st2, "rx_msgs");
+ NUTS_ASSERT(item != NULL);
+ NUTS_ASSERT(nng_stat_value(item) == 1);
+ NUTS_ASSERT(nng_stat_unit(item) == NNG_UNIT_MESSAGES);
+ NUTS_CLOSE(s1);
+ NUTS_CLOSE(s2);
+ nng_stats_free(stats);
+#endif
+}
+
+void
+test_stats_dump(void)
+{
+#ifdef NNG_ENABLE_STATS
+ nng_socket s1;
+ nng_socket s2;
+ nng_stat *st1;
+ nng_stat *st2;
+ nng_stat *stats;
+
+ NUTS_OPEN(s1);
+ NUTS_OPEN(s2);
+ nng_socket_set_string(s2, NNG_OPT_SOCKNAME, "second");
+ NUTS_MARRY(s1, s2);
+ NUTS_SEND(s1, "ping");
+ NUTS_RECV(s2, "ping");
+ nng_stats_get(&stats);
+ NUTS_ASSERT(stats != NULL);
+ st1 = nng_stat_find_socket(stats, s1);
+ st2 = nng_stat_find_socket(stats, s2);
+ NUTS_ASSERT(st1 != NULL);
+ NUTS_ASSERT(st2 != NULL);
+ NUTS_ASSERT(st1 != st2);
+ nng_stats_dump(stats);
+ nng_stats_free(stats);
+ NUTS_CLOSE(s1);
+ NUTS_CLOSE(s2);
+#endif
+}
+
+NUTS_TESTS = {
+ { "socket stats", test_stats_socket },
+ { "dump stats", test_stats_dump },
+ { NULL, NULL },
+};