Brad Fitzpatrick
0ff474ff37
all: fix new lint warnings from bumping staticcheck
...
In prep for updating to new staticcheck required for Go 1.23.
Updates #12912
Change-Id: If77892a023b79c6fa798f936fc80428fd4ce0673
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2024-08-22 12:31:08 -07:00
Brad Fitzpatrick
7c1d6e35a5
all: use Go 1.22 range-over-int
...
Updates #11058
Change-Id: I35e7ef9b90e83cac04ca93fd964ad00ed5b48430
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2024-04-16 15:32:38 -07:00
Andrew Lytvynov
2716250ee8
all: cleanup unused code, part 2 ( #10670 )
...
And enable U1000 check in staticcheck.
Updates #cleanup
Signed-off-by: Andrew Lytvynov <awly@tailscale.com>
2023-12-21 17:40:03 -08:00
David Anderson
e92adfe5e4
net/art: allow non-pointers as values
...
Values are still turned into pointers internally to maintain the
invariants of strideTable, but from the user's perspective it's
now possible to tbl.Insert(pfx, true) rather than
tbl.Insert(pfx, ptr.To(true)).
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-08-17 10:43:18 -07:00
David Anderson
623d72c83b
net/art: move child table pointers out of strideEntry
...
In preparation for a different refactor, but incidentally also saves
10-25% memory on overall table size in benchmarks.
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-08-16 12:17:25 -07:00
David Anderson
6afffece8a
net/art: use more intelligible, go-ish state tracking in table.Get
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
4f14ed2ad6
net/art: use encoding/binary for address bit twiddling
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
f1cd67488d
net/art: move slice closer to its use
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
44ad7b3746
net/art: factor out picking the right strideTable for addr family
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
125b982ba5
net/art: make Table.Get alloc-free
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
b76d8a88ae
net/art: document return value of strideTable.delete
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
b242e2c2cb
net/art: reword confusing function docstring
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
8478358d77
net/art: use "index", not "idx" in function names
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
de5c6ed4be
net/art: document valid values of strideTable.prefix
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
736a44264f
net/art: fix comment typo
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
1e6f0bb608
net/art: fix slowPrefixTable bugs found by fuzzing
...
One is a straight "I forgot how to Go" bug, the others are semantic
mismatches with the main implementation around masking the prefixes
passed to insert/delete.
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
aaca911904
net/art: add another consistency test for insert/delete
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
b145a22f55
net/art: add more exhaustive table testing
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
9cc3f7a3d6
net/art: fix format of debug output
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
ac657caaf1
net/art: add debug hooks to strideTable
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
fcf4d044fa
net/art: implement path compression optimization
...
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
486195edf0
net/art: make each strideTable track the IP prefix it represents
...
This is a prerequisite for path compression, so that insert/delete
can determine when compression occurred.
Updates #7781
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
David Anderson
45b5d0983c
net/art: fix running tests outside of CI
...
Updates #7866
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-07-24 13:33:48 -07:00
Brad Fitzpatrick
c889254b42
net/art: skip tests on CI for now
...
To get the tree green again for other people.
Updates #7866
Change-Id: Ibdad2e1408e5f0c97e49a148bfd77aad17c2c5e5
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2023-04-14 10:24:38 -07:00
David Anderson
a5fd51ebdc
net/art: disable the IPv6 100k routes benchmark.
...
At the current unoptimized memory utilization of the various data structures,
100k IPv6 routes consumes in the ballpark of 3-4GiB, which risks OOMing our
386 test machine.
Until we have the optimizations to (drastically) reduce that consumption,
skip the test that bloats too much for 32-bit machines.
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-04-13 09:04:17 -07:00
David Anderson
a7c910e361
net/art: implement the Table type, a multi-level art route table.
...
Updates #7781
│ sec/op │
TableInsertion/ipv4/10 1.562µ ± 2%
TableInsertion/ipv4/100 2.398µ ± 5%
TableInsertion/ipv4/1000 2.097µ ± 3%
TableInsertion/ipv4/10000 2.756µ ± 4%
TableInsertion/ipv4/100000 2.473µ ± 13%
TableInsertion/ipv6/10 7.649µ ± 2%
TableInsertion/ipv6/100 12.09µ ± 3%
TableInsertion/ipv6/1000 14.84µ ± 5%
TableInsertion/ipv6/10000 14.72µ ± 8%
TableInsertion/ipv6/100000 13.23µ ± 41%
TableDelete/ipv4/10 378.4n ± 5%
TableDelete/ipv4/100 366.9n ± 3%
TableDelete/ipv4/1000 418.6n ± 3%
TableDelete/ipv4/10000 609.2n ± 11%
TableDelete/ipv4/100000 679.2n ± 28%
TableDelete/ipv6/10 504.2n ± 4%
TableDelete/ipv6/100 959.5n ± 12%
TableDelete/ipv6/1000 1.436µ ± 6%
TableDelete/ipv6/10000 1.772µ ± 15%
TableDelete/ipv6/100000 1.172µ ± 113%
TableGet/ipv4/10 32.14n ± 11%
TableGet/ipv4/100 38.58n ± 2%
TableGet/ipv4/1000 45.03n ± 2%
TableGet/ipv4/10000 52.90n ± 7%
TableGet/ipv4/100000 135.2n ± 11%
TableGet/ipv6/10 41.55n ± 1%
TableGet/ipv6/100 44.78n ± 2%
TableGet/ipv6/1000 49.03n ± 2%
TableGet/ipv6/10000 65.38n ± 5%
TableGet/ipv6/100000 525.0n ± 39%
│ avg-B/op │
TableInsertion/ipv4/10 25.18Ki ± 0%
TableInsertion/ipv4/100 17.63Ki ± 0%
TableInsertion/ipv4/1000 14.14Ki ± 0%
TableInsertion/ipv4/10000 12.92Ki ± 0%
TableInsertion/ipv4/100000 11.13Ki ± 0%
TableInsertion/ipv6/10 76.87Ki ± 0%
TableInsertion/ipv6/100 98.33Ki ± 0%
TableInsertion/ipv6/1000 91.44Ki ± 0%
TableInsertion/ipv6/10000 90.39Ki ± 0%
TableInsertion/ipv6/100000 87.19Ki ± 0%
TableDelete/ipv4/10 3.230 ± 0%
TableDelete/ipv4/100 4.020 ± 0%
TableDelete/ipv4/1000 3.990 ± 0%
TableDelete/ipv4/10000 4.000 ± 0%
TableDelete/ipv4/100000 4.000 ± 0%
TableDelete/ipv6/10 16.00 ± 0%
TableDelete/ipv6/100 16.00 ± 0%
TableDelete/ipv6/1000 16.00 ± 0%
TableDelete/ipv6/10000 16.00 ± 0%
TableDelete/ipv6/100000 16.00 ± 0%
│ avg-allocs/op │
TableInsertion/ipv4/10 2.900 ± 0%
TableInsertion/ipv4/100 2.330 ± 0%
TableInsertion/ipv4/1000 2.070 ± 0%
TableInsertion/ipv4/10000 1.980 ± 0%
TableInsertion/ipv4/100000 1.840 ± 0%
TableInsertion/ipv6/10 6.800 ± 0%
TableInsertion/ipv6/100 8.420 ± 0%
TableInsertion/ipv6/1000 7.900 ± 0%
TableInsertion/ipv6/10000 7.820 ± 0%
TableInsertion/ipv6/100000 7.580 ± 0%
TableDelete/ipv4/10 1.000 ± 0%
TableDelete/ipv4/100 1.000 ± 0%
TableDelete/ipv4/1000 1.000 ± 0%
TableDelete/ipv4/10000 1.000 ± 0%
TableDelete/ipv4/100000 1.000 ± 0%
TableDelete/ipv6/10 1.000 ± 0%
TableDelete/ipv6/100 1.000 ± 0%
TableDelete/ipv6/1000 1.000 ± 0%
TableDelete/ipv6/10000 1.000 ± 0%
TableDelete/ipv6/100000 1.000 ± 0%
│ routes/s │
TableInsertion/ipv4/10 640.3k ± 2%
TableInsertion/ipv4/100 417.1k ± 5%
TableInsertion/ipv4/1000 477.0k ± 3%
TableInsertion/ipv4/10000 362.8k ± 5%
TableInsertion/ipv4/100000 404.5k ± 15%
TableInsertion/ipv6/10 130.7k ± 1%
TableInsertion/ipv6/100 82.69k ± 3%
TableInsertion/ipv6/1000 67.37k ± 5%
TableInsertion/ipv6/10000 67.93k ± 9%
TableInsertion/ipv6/100000 75.63k ± 29%
TableDelete/ipv4/10 2.642M ± 6%
TableDelete/ipv4/100 2.726M ± 3%
TableDelete/ipv4/1000 2.389M ± 3%
TableDelete/ipv4/10000 1.641M ± 12%
TableDelete/ipv4/100000 1.472M ± 27%
TableDelete/ipv6/10 1.984M ± 4%
TableDelete/ipv6/100 1.042M ± 11%
TableDelete/ipv6/1000 696.5k ± 6%
TableDelete/ipv6/10000 564.4k ± 13%
TableDelete/ipv6/100000 853.6k ± 53%
│ addrs/s │
TableGet/ipv4/10 31.11M ± 10%
TableGet/ipv4/100 25.92M ± 2%
TableGet/ipv4/1000 22.21M ± 2%
TableGet/ipv4/10000 18.91M ± 8%
TableGet/ipv4/100000 7.397M ± 12%
TableGet/ipv6/10 24.07M ± 1%
TableGet/ipv6/100 22.33M ± 2%
TableGet/ipv6/1000 20.40M ± 2%
TableGet/ipv6/10000 15.30M ± 5%
TableGet/ipv6/100000 1.905M ± 28%
│ B/op │
TableGet/ipv4/10 4.000 ± 0%
TableGet/ipv4/100 4.000 ± 0%
TableGet/ipv4/1000 4.000 ± 0%
TableGet/ipv4/10000 4.000 ± 0%
TableGet/ipv4/100000 4.000 ± 0%
TableGet/ipv6/10 16.00 ± 0%
TableGet/ipv6/100 16.00 ± 0%
TableGet/ipv6/1000 16.00 ± 0%
TableGet/ipv6/10000 16.00 ± 0%
TableGet/ipv6/100000 16.00 ± 0%
│ allocs/op │
TableGet/ipv4/10 1.000 ± 0%
TableGet/ipv4/100 1.000 ± 0%
TableGet/ipv4/1000 1.000 ± 0%
TableGet/ipv4/10000 1.000 ± 0%
TableGet/ipv4/100000 1.000 ± 0%
TableGet/ipv6/10 1.000 ± 0%
TableGet/ipv6/100 1.000 ± 0%
TableGet/ipv6/1000 1.000 ± 0%
TableGet/ipv6/10000 1.000 ± 0%
TableGet/ipv6/100000 1.000 ± 0%
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-04-13 09:04:17 -07:00
David Anderson
4d1b3bc26f
net/art: implement the stride table building block of ART
...
A stride table is an 8-bit routing table implemented as an array binary
tree, with a special tree updating function (allot) that enables lightning
fast address lookups and reasonably fast insertion and deletion.
Insertion, deletion and lookup are all allocation-free.
Updates #7781
│ sec/op │
StrideTableInsertion/10/random_order 16.79n ± 2%
StrideTableInsertion/10/largest_first 16.83n ± 1%
StrideTableInsertion/10/smallest_first 16.83n ± 0%
StrideTableInsertion/50/random_order 17.84n ± 1%
StrideTableInsertion/50/largest_first 20.04n ± 1%
StrideTableInsertion/50/smallest_first 16.39n ± 0%
StrideTableInsertion/100/random_order 14.63n ± 0%
StrideTableInsertion/100/largest_first 17.45n ± 4%
StrideTableInsertion/100/smallest_first 12.98n ± 0%
StrideTableInsertion/200/random_order 12.51n ± 4%
StrideTableInsertion/200/largest_first 18.36n ± 3%
StrideTableInsertion/200/smallest_first 9.609n ± 3%
StrideTableDeletion/10/random_order 19.50n ± 1%
StrideTableDeletion/10/largest_first 19.34n ± 0%
StrideTableDeletion/10/smallest_first 19.43n ± 0%
StrideTableDeletion/50/random_order 14.58n ± 1%
StrideTableDeletion/50/largest_first 14.27n ± 2%
StrideTableDeletion/50/smallest_first 15.51n ± 0%
StrideTableDeletion/100/random_order 12.02n ± 3%
StrideTableDeletion/100/largest_first 10.64n ± 0%
StrideTableDeletion/100/smallest_first 13.21n ± 3%
StrideTableDeletion/200/random_order 14.05n ± 4%
StrideTableDeletion/200/largest_first 9.288n ± 5%
StrideTableDeletion/200/smallest_first 18.51n ± 1%
StrideTableGet 0.5010n ± 0%
│ routes/s │
StrideTableInsertion/10/random_order 59.55M ± 2%
StrideTableInsertion/10/largest_first 59.42M ± 1%
StrideTableInsertion/10/smallest_first 59.43M ± 0%
StrideTableInsertion/50/random_order 56.04M ± 1%
StrideTableInsertion/50/largest_first 49.91M ± 1%
StrideTableInsertion/50/smallest_first 61.00M ± 0%
StrideTableInsertion/100/random_order 68.35M ± 0%
StrideTableInsertion/100/largest_first 57.32M ± 3%
StrideTableInsertion/100/smallest_first 77.06M ± 0%
StrideTableInsertion/200/random_order 79.93M ± 4%
StrideTableInsertion/200/largest_first 54.47M ± 3%
StrideTableInsertion/200/smallest_first 104.1M ± 3%
StrideTableDeletion/10/random_order 51.28M ± 1%
StrideTableDeletion/10/largest_first 51.70M ± 0%
StrideTableDeletion/10/smallest_first 51.48M ± 0%
StrideTableDeletion/50/random_order 68.60M ± 1%
StrideTableDeletion/50/largest_first 70.09M ± 2%
StrideTableDeletion/50/smallest_first 64.45M ± 0%
StrideTableDeletion/100/random_order 83.21M ± 3%
StrideTableDeletion/100/largest_first 94.03M ± 0%
StrideTableDeletion/100/smallest_first 75.69M ± 3%
StrideTableDeletion/200/random_order 71.20M ± 5%
StrideTableDeletion/200/largest_first 107.7M ± 5%
StrideTableDeletion/200/smallest_first 54.02M ± 1%
StrideTableGet 1.996G ± 0%
Signed-off-by: David Anderson <danderson@tailscale.com>
2023-04-04 09:00:24 -07:00