Needed these while rewriting LSDB iteration.
NB: this commit fails because of a bug in ospf_lsdb_get_next, which will
SEGV when the LSDB is actually empty. Whooo... (this is fixed in the
following commits.)
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
pytest.mark.skipif apparently iterates through a class's methods,
applying itself onto the various methods. Now, since we're deriving
from a parent class, the method is actually the same object inherited
from the parent, so the decorator will apply itself on the parent's
testrunning method (test_refout). The result is that any TestRefout
tests after "test_commands.py" will be skipped...
This only became apparent after adding ospf6d/test_lsdb.py; before,
test_commands.py was the last test in the list so it didn't matter...
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
hash_cmd_init will overwrite _hashes with a new list, while _hashes
already has been initialised from cmd_init(), thread_master_create(), or
any other function that may have created a hash.
Found while valgrind'ing ospf6d/test_lsdb.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Most read accesses of route_table are actually exact matches where
walking down the tree is wildly inefficient. Use a parallel hash
structure instead.
This significantly speeds up processes that are performance-bound by
table accesses, e.g. BGP withdraw processing. In other locations, the
improvement is not seen as strongly, e.g. when filter processing is the
limiting factor.
[includes fix to ignore prefix host bits in hash comparison]
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
route_node->parent and route_node->link shouldn't be touched by user
code since that is a recipe for trouble once we have a hash table in
parallel.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This allows passing struct prefix_{ipv4,ipv6,evpn} * in addition to
struct prefix * without an extra cast (since the union uses the gcc
transparent-union extension present in all compilers that we support.)
Also applies some "const" while we're at it.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Consuming va_args modifies its internal bits, hence the need to copy
it... but the copying wasn't quite right just yet.
Fixes: 4d5f445 ("lib: add vty_outln()")
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
When making improvements to error handling in this code I accidentally
introduced an off-by-one. Fix it.
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
NetBSD can't take the square root of a long double
and we should be fine just using a double here anyway
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Adds the ability to name hash tables, and a new cli command that will
show various summary statistics for named hash tables.
Statistics computed are
- load factor
- full load factor (see comments)
- stddev of full load factor
Standard deviation is computed by storing the sum of squares of bucket
lengths. This is somewhat susceptible to overflow. On platforms where a
double is 32 bits, placing 65535 or more elements into a hash table
opens up the potential for overflow, depending on how they are arranged
in buckets (which depends on the hash function). For example, placing
65535 elements into one hash bucket would cause ssq overflow, but
distributing 40000000 elements evenly among 400000 buckets (100 elements
per bucket) would not.
These cases are extremely degenerate, so the vague possibility of
overflow in an informational command is deemed an acceptable tradeoff
for constant time calculation of variance without locks or compromising
efficiency of actual table operations.
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Adds a function that calculates various statistics on our implementation
of a hash table. These are useful for evaluating performance.
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>