Skip to content

Commit

Permalink
fixes nanomsg#1577 nng_stat_find_socket always returns the same stats…
Browse files Browse the repository at this point in the history
… node

Also this fixes problems with uninitialized socket names, and the
socket name stat not being adjusted correctly when set via API.
  • Loading branch information
gdamore committed Apr 16, 2022
1 parent ef929a3 commit 60bf092
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 82 deletions.
2 changes: 1 addition & 1 deletion docs/man/nng_options.5.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ return value of `NNG_ETIMEDOUT`.
(((name, socket)))
(string)
This the socket name.
By default this is a string corresponding to the value of the socket.
By default, this is a string corresponding to the value of the socket.
The string must fit within 64-bytes, including the terminating
`NUL` byte.
The value is intended for application use, and is not used for anything
Expand Down
1 change: 1 addition & 0 deletions src/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
18 changes: 15 additions & 3 deletions src/core/socket.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// Copyright 2021 Staysail Systems, Inc. <[email protected]>
// Copyright 2022 Staysail Systems, Inc. <[email protected]>
// Copyright 2018 Capitar IT Group BV <[email protected]>
//
// This software is supplied under the terms of the MIT License, a
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
6 changes: 3 additions & 3 deletions src/core/stats.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// Copyright 2020 Staysail Systems, Inc. <[email protected]>
// Copyright 2022 Staysail Systems, Inc. <[email protected]>
// Copyright 2018 Capitar IT Group BV <[email protected]>
//
// This software is supplied under the terms of the MIT License, a
Expand Down Expand Up @@ -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) &&
Expand All @@ -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);
}
}
Expand Down
96 changes: 96 additions & 0 deletions src/core/stats_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
//
// Copyright 2022 Staysail Systems, Inc. <[email protected]>
// Copyright 2018 Capitar IT Group BV <[email protected]>
//
// 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 },
};
1 change: 0 additions & 1 deletion tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,6 @@ add_nng_test(options 5)
add_nng_test(pipe 5)
add_nng_test(pollfd 5)
add_nng_test(scalability 20 ON)
add_nng_test1(stats 5 NNG_ENABLE_STATS)
add_nng_test(synch 5)
add_nng_test(tls 60)
add_nng_test(tcpsupp 10)
Expand Down
74 changes: 0 additions & 74 deletions tests/stats.c

This file was deleted.

0 comments on commit 60bf092

Please sign in to comment.