Skip to content

Conversation

@joamaki
Copy link
Contributor

@joamaki joamaki commented Jan 14, 2026

  • Rework the LPM benchmarks
  • Add "PART_VALIDATE" style LPM validation
  • Fix a compression bug (imaginary nodes with no or single child were left in tree sometimes)
  • Use txnID for detecting if a node can be mutated in-place
    Benchmark before:
    Benchmark_txn_insert/batchSize=1-8                  1339            849781 ns/op           1176773 objects/sec   3094433 B/op      13975 allocs/op
    Benchmark_txn_insert/batchSize=10-8                 3534            326227 ns/op           3065346 objects/sec    610990 B/op       6671 allocs/op
    Benchmark_txn_insert/batchSize=100-8                4123            293279 ns/op           3409722 objects/sec    370742 B/op       6068 allocs/op
    Benchmark_txn_delete/batchSize=1-8                  1212            954251 ns/op           1047943 objects/sec   3542515 B/op      13976 allocs/op
    Benchmark_txn_delete/batchSize=10-8                 3284            351354 ns/op           2846131 objects/sec    598123 B/op       5770 allocs/op
    Benchmark_txn_delete/batchSize=100-8                3901            298353 ns/op           3351731 objects/sec    310827 B/op       5061 allocs/op
    Benchmark_LPM_Lookup-8                             10000            112214 ns/op           8911511 objects/sec         0 B/op          0 allocs/op
    Benchmark_LPM_All-8                               168121              7029 ns/op         142269460 objects/sec        32 B/op          1 allocs/op
    Benchmark_LPM_Prefix-8                            174777              6902 ns/op         144883606 objects/sec        32 B/op          1 allocs/op
    Benchmark_LPM_LowerBound-8                        374746              3264 ns/op         153166999 objects/sec       288 B/op          2 allocs/op
    
    after:
    Benchmark_txn_insert/batchSize=1-8                  2746            432946 ns/op           2309755 objects/sec    838440 B/op      13975 allocs/op
    Benchmark_txn_insert/batchSize=10-8                 4345            276700 ns/op           3614016 objects/sec    385206 B/op       6668 allocs/op
    Benchmark_txn_insert/batchSize=100-8                4484            263860 ns/op           3789882 objects/sec    345622 B/op       6027 allocs/op
    Benchmark_txn_delete/batchSize=1-8                  2011            572303 ns/op           1747327 objects/sec   1286481 B/op      13976 allocs/op
    Benchmark_txn_delete/batchSize=10-8                 4078            279905 ns/op           3572641 objects/sec    372422 B/op       5769 allocs/op
    Benchmark_txn_delete/batchSize=100-8                4495            257997 ns/op           3876007 objects/sec    286756 B/op       5038 allocs/op
    Benchmark_LPM_Lookup-8                             10000            110770 ns/op           9027736 objects/sec         0 B/op          0 allocs/op
    Benchmark_LPM_All-8                               184435              6684 ns/op         149605322 objects/sec        32 B/op          1 allocs/op
    Benchmark_LPM_Prefix-8                            189956              6363 ns/op         157162374 objects/sec        32 B/op          1 allocs/op
    Benchmark_LPM_LowerBound-8                        376872              3158 ns/op         158336418 objects/sec       288 B/op          2 allocs/op

@github-actions
Copy link

github-actions bot commented Jan 14, 2026

$ make
go build ./...
go: downloading go1.24.0 (linux/amd64)
go: downloading go.yaml.in/yaml/v3 v3.0.3
go: downloading github.com/cilium/hive v0.0.0-20250731144630-28e7a35ed227
go: downloading golang.org/x/time v0.5.0
go: downloading github.com/spf13/cobra v1.8.0
go: downloading github.com/spf13/pflag v1.0.5
go: downloading github.com/cilium/stream v0.0.0-20240209152734-a0792b51812d
go: downloading github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de
go: downloading github.com/spf13/viper v1.18.2
go: downloading go.uber.org/dig v1.17.1
go: downloading golang.org/x/term v0.16.0
go: downloading github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
go: downloading github.com/mitchellh/mapstructure v1.5.0
go: downloading golang.org/x/sys v0.17.0
go: downloading golang.org/x/tools v0.17.0
go: downloading github.com/fsnotify/fsnotify v1.7.0
go: downloading github.com/sagikazarmark/slog-shim v0.1.0
go: downloading github.com/spf13/afero v1.11.0
go: downloading github.com/spf13/cast v1.6.0
go: downloading golang.org/x/text v0.14.0
go: downloading github.com/subosito/gotenv v1.6.0
go: downloading github.com/hashicorp/hcl v1.0.0
go: downloading gopkg.in/ini.v1 v1.67.0
go: downloading github.com/magiconair/properties v1.8.7
go: downloading github.com/pelletier/go-toml/v2 v2.1.0
go: downloading gopkg.in/yaml.v3 v3.0.1
STATEDB_VALIDATE=1 go test ./... -cover -vet=all -test.count 1
go: downloading github.com/stretchr/testify v1.8.4
go: downloading go.uber.org/goleak v1.3.0
go: downloading golang.org/x/exp v0.0.0-20240119083558-1b970713d09a
go: downloading github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2
ok  	github.com/cilium/statedb	453.564s	coverage: 78.3% of statements
ok  	github.com/cilium/statedb/index	0.006s	coverage: 28.7% of statements
ok  	github.com/cilium/statedb/internal	0.011s	coverage: 42.9% of statements
ok  	github.com/cilium/statedb/lpm	4.142s	coverage: 77.9% of statements
ok  	github.com/cilium/statedb/part	60.406s	coverage: 87.6% of statements
ok  	github.com/cilium/statedb/reconciler	0.258s	coverage: 88.7% of statements
	github.com/cilium/statedb/reconciler/benchmark		coverage: 0.0% of statements
	github.com/cilium/statedb/reconciler/example		coverage: 0.0% of statements
go test -race ./... -test.count 1
ok  	github.com/cilium/statedb	39.668s
ok  	github.com/cilium/statedb/index	1.014s
ok  	github.com/cilium/statedb/internal	1.028s
ok  	github.com/cilium/statedb/lpm	3.118s
ok  	github.com/cilium/statedb/part	35.393s
ok  	github.com/cilium/statedb/reconciler	1.344s
?   	github.com/cilium/statedb/reconciler/benchmark	[no test files]
?   	github.com/cilium/statedb/reconciler/example	[no test files]
go test ./... -bench . -benchmem -test.run xxx
goos: linux
goarch: amd64
pkg: github.com/cilium/statedb
cpu: AMD EPYC 7763 64-Core Processor                
BenchmarkDB_WriteTxn_1-4                    	  617612	      1679 ns/op	    595725 objects/sec	     976 B/op	      18 allocs/op
BenchmarkDB_WriteTxn_10-4                   	 1674574	       709.6 ns/op	   1409173 objects/sec	     474 B/op	       8 allocs/op
BenchmarkDB_WriteTxn_100-4                  	 2112744	       565.4 ns/op	   1768789 objects/sec	     442 B/op	       7 allocs/op
BenchmarkDB_WriteTxn_1000-4                 	 1923656	       620.1 ns/op	   1612556 objects/sec	     399 B/op	       7 allocs/op
BenchmarkDB_WriteTxn_100_SecondaryIndex-4   	  871892	      1276 ns/op	    783936 objects/sec	     959 B/op	      22 allocs/op
BenchmarkDB_NewWriteTxn-4                   	 1861372	       643.7 ns/op	     192 B/op	       3 allocs/op
BenchmarkDB_WriteTxnCommit100-4             	  452439	      2880 ns/op	    8314 B/op	       4 allocs/op
BenchmarkDB_NewReadTxn-4                    	481644220	         2.494 ns/op	       0 B/op	       0 allocs/op
BenchmarkDB_Modify-4                        	    1650	    713027 ns/op	   1402471 objects/sec	  431670 B/op	    8074 allocs/op
BenchmarkDB_GetInsert-4                     	    1580	    757051 ns/op	   1320915 objects/sec	  407659 B/op	    8074 allocs/op
BenchmarkDB_RandomInsert-4                  	    1888	    655263 ns/op	   1526105 objects/sec	  399648 B/op	    7074 allocs/op
BenchmarkDB_RandomReplace-4                 	     453	   2664211 ns/op	    375346 objects/sec	 1948817 B/op	   32106 allocs/op
BenchmarkDB_SequentialInsert-4              	    1866	    634997 ns/op	   1574811 objects/sec	  399649 B/op	    7074 allocs/op
BenchmarkDB_SequentialInsert_Prefix-4       	     493	   2492128 ns/op	    401264 objects/sec	 3515514 B/op	   45543 allocs/op
BenchmarkDB_Changes_Baseline-4              	    1558	    778801 ns/op	   1284025 objects/sec	  459816 B/op	    9169 allocs/op
BenchmarkDB_Changes-4                       	     900	   1330878 ns/op	    751384 objects/sec	  661667 B/op	   12322 allocs/op
BenchmarkDB_RandomLookup-4                  	   21356	     55129 ns/op	  18139213 objects/sec	       0 B/op	       0 allocs/op
BenchmarkDB_SequentialLookup-4              	   26704	     44935 ns/op	  22254244 objects/sec	       0 B/op	       0 allocs/op
BenchmarkDB_Prefix_SecondaryIndex-4         	    6384	    166377 ns/op	   6010448 objects/sec	  124922 B/op	    1026 allocs/op
BenchmarkDB_FullIteration_All-4             	     846	   1370637 ns/op	  72958796 objects/sec	     104 B/op	       5 allocs/op
BenchmarkDB_FullIteration_Prefix-4          	     762	   1476383 ns/op	  67733082 objects/sec	     136 B/op	       6 allocs/op
BenchmarkDB_FullIteration_Get-4             	     181	   6682676 ns/op	  14964065 objects/sec	       0 B/op	       0 allocs/op
BenchmarkDB_FullIteration_Get_Secondary-4   	      80	  14459823 ns/op	   6915714 objects/sec	       0 B/op	       0 allocs/op
BenchmarkDB_FullIteration_ReadTxnGet-4      	     182	   6779445 ns/op	  14750470 objects/sec	       0 B/op	       0 allocs/op
BenchmarkDB_PropagationDelay-4              	  623679	      1748 ns/op	        15.00 50th_µs	        18.00 90th_µs	        42.00 99th_µs	    1040 B/op	      20 allocs/op
BenchmarkDB_WriteTxn_100_LPMIndex-4         	  487850	      2383 ns/op	    419580 objects/sec	    1778 B/op	      37 allocs/op
BenchmarkDB_WriteTxn_1_LPMIndex-4           	  124707	     16229 ns/op	     61620 objects/sec	   15662 B/op	      81 allocs/op
BenchmarkDB_LPMIndex_Get-4                  	     228	   5365922 ns/op	   1863612 objects/sec	       0 B/op	       0 allocs/op
BenchmarkWatchSet_4-4                       	 2227257	       535.3 ns/op	     320 B/op	       5 allocs/op
BenchmarkWatchSet_16-4                      	  766005	      1571 ns/op	    1096 B/op	       5 allocs/op
BenchmarkWatchSet_128-4                     	   87321	     13910 ns/op	    8904 B/op	       5 allocs/op
BenchmarkWatchSet_1024-4                    	    8653	    141056 ns/op	   73744 B/op	       5 allocs/op
PASS
ok  	github.com/cilium/statedb	41.632s
PASS
ok  	github.com/cilium/statedb/index	0.004s
goos: linux
goarch: amd64
pkg: github.com/cilium/statedb/internal
cpu: AMD EPYC 7763 64-Core Processor                
Benchmark_SortableMutex-4   	 6207099	       193.3 ns/op	       0 B/op	       0 allocs/op
PASS
ok  	github.com/cilium/statedb/internal	1.205s
goos: linux
goarch: amd64
pkg: github.com/cilium/statedb/lpm
cpu: AMD EPYC 7763 64-Core Processor                
Benchmark_txn_insert/batchSize=1-4         	    1887	    638935 ns/op	   1565103 objects/sec	  838420 B/op	   13975 allocs/op
Benchmark_txn_insert/batchSize=10-4        	    3104	    394273 ns/op	   2536314 objects/sec	  385200 B/op	    6669 allocs/op
Benchmark_txn_insert/batchSize=100-4       	    3134	    376348 ns/op	   2657112 objects/sec	  345617 B/op	    6028 allocs/op
Benchmark_txn_delete/batchSize=1-4         	    1506	    767418 ns/op	   1303071 objects/sec	 1286486 B/op	   13976 allocs/op
Benchmark_txn_delete/batchSize=10-4        	    3175	    381162 ns/op	   2623560 objects/sec	  372422 B/op	    5769 allocs/op
Benchmark_txn_delete/batchSize=100-4       	    3476	    362174 ns/op	   2761102 objects/sec	  286756 B/op	    5038 allocs/op
Benchmark_LPM_Lookup-4                     	    7873	    148681 ns/op	   6725826 objects/sec	       0 B/op	       0 allocs/op
Benchmark_LPM_All-4                        	  135116	      9350 ns/op	 106950007 objects/sec	      32 B/op	       1 allocs/op
Benchmark_LPM_Prefix-4                     	  130872	      9477 ns/op	 105518921 objects/sec	      32 B/op	       1 allocs/op
Benchmark_LPM_LowerBound-4                 	  241848	      4957 ns/op	 100874680 objects/sec	     288 B/op	       2 allocs/op
PASS
ok  	github.com/cilium/statedb/lpm	12.120s
goos: linux
goarch: amd64
pkg: github.com/cilium/statedb/part
cpu: AMD EPYC 7763 64-Core Processor                
Benchmark_Uint64Map_Random-4                  	    1476	    761930 ns/op	   1312457 items/sec	 2575961 B/op	    7038 allocs/op
Benchmark_Uint64Map_Sequential-4              	    1891	    642510 ns/op	   1556395 items/sec	 2264721 B/op	    6754 allocs/op
Benchmark_Uint64Map_Sequential_Insert-4       	    2035	    592157 ns/op	   1688741 items/sec	 2256718 B/op	    5753 allocs/op
Benchmark_Uint64Map_Sequential_Txn_Insert-4   	   10000	    115696 ns/op	   8643370 items/sec	   86425 B/op	    2029 allocs/op
Benchmark_Uint64Map_Random_Insert-4           	    1642	    742589 ns/op	   1346640 items/sec	 2566876 B/op	    6040 allocs/op
Benchmark_Uint64Map_Random_Txn_Insert-4       	    7228	    171526 ns/op	   5830020 items/sec	  118731 B/op	    2417 allocs/op
Benchmark_Insert_RootOnlyWatch-4              	    9499	    123467 ns/op	   8099324 objects/sec	   71577 B/op	    2034 allocs/op
Benchmark_Insert-4                            	    6928	    170169 ns/op	   5876506 objects/sec	  187011 B/op	    3061 allocs/op
Benchmark_Modify-4                            	   10000	    101925 ns/op	   9811096 objects/sec	   58273 B/op	    1008 allocs/op
Benchmark_GetInsert-4                         	    8698	    136217 ns/op	   7341248 objects/sec	   58273 B/op	    1008 allocs/op
Benchmark_Replace-4                           	14088490	        74.21 ns/op	  13474786 objects/sec	      48 B/op	       1 allocs/op
Benchmark_Replace_RootOnlyWatch-4             	 2581718	       445.8 ns/op	   2243014 objects/sec	     218 B/op	       2 allocs/op
Benchmark_txn_1-4                             	 5230131	       217.1 ns/op	   4605155 objects/sec	     216 B/op	       4 allocs/op
Benchmark_txn_10-4                            	 9025581	       130.0 ns/op	   7692237 objects/sec	      91 B/op	       2 allocs/op
Benchmark_txn_100-4                           	10666209	       111.6 ns/op	   8961365 objects/sec	      80 B/op	       2 allocs/op
Benchmark_txn_1000-4                          	 9327872	       126.7 ns/op	   7891959 objects/sec	      65 B/op	       2 allocs/op
Benchmark_txn_delete_1-4                      	 4870182	       248.6 ns/op	   4023071 objects/sec	     648 B/op	       4 allocs/op
Benchmark_txn_delete_10-4                     	11228278	       106.9 ns/op	   9358615 objects/sec	     104 B/op	       1 allocs/op
Benchmark_txn_delete_100-4                    	11775093	       100.1 ns/op	   9991616 objects/sec	      47 B/op	       1 allocs/op
Benchmark_txn_delete_1000-4                   	14663029	        81.74 ns/op	  12233655 objects/sec	      24 B/op	       1 allocs/op
Benchmark_Get-4                               	   45322	     26443 ns/op	  37816534 objects/sec	       0 B/op	       0 allocs/op
Benchmark_All-4                               	  118449	     10088 ns/op	  99123723 objects/sec	       0 B/op	       0 allocs/op
Benchmark_Iterator_All-4                      	  121812	     10100 ns/op	  99013649 objects/sec	       0 B/op	       0 allocs/op
Benchmark_Iterator_Next-4                     	  149442	      7937 ns/op	 125996849 objects/sec	     896 B/op	       1 allocs/op
Benchmark_Hashmap_Insert-4                    	   14856	     80952 ns/op	  12352973 objects/sec	   74265 B/op	      20 allocs/op
Benchmark_Hashmap_Get_Uint64-4                	  139015	      8632 ns/op	 115845798 objects/sec	       0 B/op	       0 allocs/op
Benchmark_Hashmap_Get_Bytes-4                 	  111258	     10783 ns/op	  92740619 objects/sec	       0 B/op	       0 allocs/op
Benchmark_Delete_Random-4                     	      54	  19176465 ns/op	   5214725 objects/sec	 2111866 B/op	  102364 allocs/op
Benchmark_find16-4                            	240054327	         4.997 ns/op	       0 B/op	       0 allocs/op
Benchmark_findIndex16-4                       	100000000	        10.45 ns/op	       0 B/op	       0 allocs/op
Benchmark_find4-4                             	411742291	         2.911 ns/op	       0 B/op	       0 allocs/op
Benchmark_findIndex4-4                        	321460083	         3.732 ns/op	       0 B/op	       0 allocs/op
PASS
ok  	github.com/cilium/statedb/part	38.937s
PASS
ok  	github.com/cilium/statedb/reconciler	0.005s
?   	github.com/cilium/statedb/reconciler/benchmark	[no test files]
?   	github.com/cilium/statedb/reconciler/example	[no test files]
go run ./reconciler/benchmark -quiet
1000000 objects reconciled in 2.10 seconds (batch size 1000)
Throughput 476168.73 objects per second
817MB total allocated, 6015193 in-use objects, 338MB bytes in use

@joamaki joamaki force-pushed the pr/joamaki/lpm-txnid branch from 6540fd5 to 3b3c221 Compare January 14, 2026 17:28
@joamaki joamaki marked this pull request as ready for review January 14, 2026 17:29
@joamaki joamaki requested a review from a team as a code owner January 14, 2026 17:29
@joamaki joamaki requested review from pippolo84 and removed request for a team January 14, 2026 17:30
@joamaki joamaki force-pushed the pr/joamaki/lpm-txnid branch from 3b3c221 to 31a3853 Compare January 14, 2026 17:32
@joamaki joamaki requested a review from bimmlerd January 14, 2026 17:33
@joamaki joamaki force-pushed the pr/joamaki/lpm-txnid branch from 31a3853 to 2624227 Compare January 15, 2026 10:15
Copy link
Member

@bimmlerd bimmlerd left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Dedup the insert benchmark. Add delete, lookup, all, prefix and lowerbound
benchmarks.

Signed-off-by: Jussi Maki <jussi.maki@isovalent.com>
The final root wasn't checked whether it become an imaginary
single child node which can be then removed completely.

Signed-off-by: Jussi Maki <jussi.maki@isovalent.com>
Similar to previous commit that implemented this for 'part', implement the same
change from 'nodeMutated' to holding a 'txnID' inside each LPM node.

Benchmark before:
Benchmark_txn_insert/batchSize=1-8                  1339            849781 ns/op           1176773 objects/sec   3094433 B/op      13975 allocs/op
Benchmark_txn_insert/batchSize=10-8                 3534            326227 ns/op           3065346 objects/sec    610990 B/op       6671 allocs/op
Benchmark_txn_insert/batchSize=100-8                4123            293279 ns/op           3409722 objects/sec    370742 B/op       6068 allocs/op
Benchmark_txn_delete/batchSize=1-8                  1212            954251 ns/op           1047943 objects/sec   3542515 B/op      13976 allocs/op
Benchmark_txn_delete/batchSize=10-8                 3284            351354 ns/op           2846131 objects/sec    598123 B/op       5770 allocs/op
Benchmark_txn_delete/batchSize=100-8                3901            298353 ns/op           3351731 objects/sec    310827 B/op       5061 allocs/op
Benchmark_LPM_Lookup-8                             10000            112214 ns/op           8911511 objects/sec         0 B/op          0 allocs/op
Benchmark_LPM_All-8                               168121              7029 ns/op         142269460 objects/sec        32 B/op          1 allocs/op
Benchmark_LPM_Prefix-8                            174777              6902 ns/op         144883606 objects/sec        32 B/op          1 allocs/op
Benchmark_LPM_LowerBound-8                        374746              3264 ns/op         153166999 objects/sec       288 B/op          2 allocs/op

after:
Benchmark_txn_insert/batchSize=1-8                  2746            432946 ns/op           2309755 objects/sec    838440 B/op      13975 allocs/op
Benchmark_txn_insert/batchSize=10-8                 4345            276700 ns/op           3614016 objects/sec    385206 B/op       6668 allocs/op
Benchmark_txn_insert/batchSize=100-8                4484            263860 ns/op           3789882 objects/sec    345622 B/op       6027 allocs/op
Benchmark_txn_delete/batchSize=1-8                  2011            572303 ns/op           1747327 objects/sec   1286481 B/op      13976 allocs/op
Benchmark_txn_delete/batchSize=10-8                 4078            279905 ns/op           3572641 objects/sec    372422 B/op       5769 allocs/op
Benchmark_txn_delete/batchSize=100-8                4495            257997 ns/op           3876007 objects/sec    286756 B/op       5038 allocs/op
Benchmark_LPM_Lookup-8                             10000            110770 ns/op           9027736 objects/sec         0 B/op          0 allocs/op
Benchmark_LPM_All-8                               184435              6684 ns/op         149605322 objects/sec        32 B/op          1 allocs/op
Benchmark_LPM_Prefix-8                            189956              6363 ns/op         157162374 objects/sec        32 B/op          1 allocs/op
Benchmark_LPM_LowerBound-8                        376872              3158 ns/op         158336418 objects/sec       288 B/op          2 allocs/op

Signed-off-by: Jussi Maki <jussi.maki@isovalent.com>
Add validation code to check lpm trie invariants.

There was still a further issue with compression. We were checking the
index of the child to decide whether to compress but this wasn't necessary
since the prefix was the same.

Signed-off-by: Jussi Maki <jussi.maki@isovalent.com>
No need to have these separately and "STATEDB_VALIDATE" is less
likely to collide with existing environment variables.

Signed-off-by: Jussi Maki <jussi.maki@isovalent.com>
@joamaki joamaki force-pushed the pr/joamaki/lpm-txnid branch from 2624227 to 09d7e02 Compare January 16, 2026 09:26
@joamaki joamaki merged commit 0f37ca1 into main Jan 16, 2026
1 check passed
@joamaki joamaki deleted the pr/joamaki/lpm-txnid branch January 16, 2026 14:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants