Skip to content

statedb: avoid revision bumps for missing deletes#163

Merged
joamaki merged 1 commit into
mainfrom
pr/tklauser/no-op-delete-revision
Jun 11, 2026
Merged

statedb: avoid revision bumps for missing deletes#163
joamaki merged 1 commit into
mainfrom
pr/tklauser/no-op-delete-revision

Conversation

@tklauser

Copy link
Copy Markdown
Member

Currently, (*writeTxnState).delete increments the table revision before checking whether the target object even exists. A committed delete of a missing object could thus advance the table revision without producing a corresponding revision index entry or watch notification.

Fix this by moving the revision allocation until after the primary key lookup succeeded and any CompareAndDelete guard passed.

Currently, (*writeTxnState).delete increments the table revision before
checking whether the target object even exists. A committed delete of a
missing object could thus advance the table revision without producing a
corresponding revision index entry or watch notification.

Fix this by moving the revision allocation until after the primary key
lookup succeeded and any CompareAndDelete guard passed.

Signed-off-by: Tobias Klauser <tobias@cilium.io>
@tklauser tklauser requested a review from a team as a code owner June 11, 2026 12:29
@tklauser tklauser requested review from derailed and removed request for a team June 11, 2026 12:29
@github-actions

Copy link
Copy Markdown
$ make
go build ./...
go: downloading go.yaml.in/yaml/v3 v3.0.3
go: downloading github.com/cilium/hive v1.0.0
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/spf13/cast v1.6.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/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
go: downloading golang.org/x/text v0.14.0
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	422.752s	coverage: 78.5% of statements
ok  	github.com/cilium/statedb/index	0.010s	coverage: 33.7% of statements
ok  	github.com/cilium/statedb/internal	0.015s	coverage: 42.9% of statements
ok  	github.com/cilium/statedb/lpm	4.977s	coverage: 77.6% of statements
ok  	github.com/cilium/statedb/part	65.685s	coverage: 87.7% of statements
ok  	github.com/cilium/statedb/reconciler	0.303s	coverage: 92.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.180s
ok  	github.com/cilium/statedb/index	1.014s
ok  	github.com/cilium/statedb/internal	1.031s
ok  	github.com/cilium/statedb/lpm	2.960s
ok  	github.com/cilium/statedb/part	36.428s
ok  	github.com/cilium/statedb/reconciler	1.358s
?   	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                      	  655262	      1720 ns/op	    581356 objects/sec	    1000 B/op	      16 allocs/op
BenchmarkDB_WriteTxn_10-4                     	 1654710	       726.7 ns/op	   1376062 objects/sec	     520 B/op	       8 allocs/op
BenchmarkDB_WriteTxn_100-4                    	 1944289	       670.1 ns/op	   1492248 objects/sec	     536 B/op	       7 allocs/op
BenchmarkDB_WriteTxn_1000-4                   	 1688647	       707.7 ns/op	   1413072 objects/sec	     522 B/op	       7 allocs/op
BenchmarkDB_WriteTxn_100_SecondaryIndex-4     	  751794	      1411 ns/op	    708530 objects/sec	    1100 B/op	      20 allocs/op
BenchmarkDB_WriteTxn_CommitOnly_100Tables-4   	  968059	      1226 ns/op	    1112 B/op	       5 allocs/op
BenchmarkDB_WriteTxn_CommitOnly_1Table-4      	 1580541	       760.0 ns/op	     224 B/op	       5 allocs/op
BenchmarkDB_NewWriteTxn-4                     	 1762317	       681.2 ns/op	     200 B/op	       4 allocs/op
BenchmarkDB_WriteTxnCommit100-4               	  981097	      1205 ns/op	    1096 B/op	       5 allocs/op
BenchmarkDB_NewReadTxn-4                      	640758927	         1.873 ns/op	       0 B/op	       0 allocs/op
BenchmarkDB_Modify-4                          	    1297	    800846 ns/op	   1248680 objects/sec	  546084 B/op	    8094 allocs/op
BenchmarkDB_GetInsert-4                       	    1430	    845621 ns/op	   1182563 objects/sec	  530069 B/op	    8094 allocs/op
BenchmarkDB_RandomInsert-4                    	    1687	    720733 ns/op	   1387477 objects/sec	  522021 B/op	    7094 allocs/op
BenchmarkDB_RandomReplace-4                   	     430	   2775817 ns/op	    360254 objects/sec	 2073402 B/op	   29146 allocs/op
BenchmarkDB_SequentialInsert-4                	    1688	    713239 ns/op	   1402056 objects/sec	  522020 B/op	    7094 allocs/op
BenchmarkDB_SequentialInsert_Prefix-4         	     471	   2532953 ns/op	    394796 objects/sec	 3562870 B/op	   45541 allocs/op
BenchmarkDB_Changes_Baseline-4                	    1452	    832217 ns/op	   1201609 objects/sec	  582200 B/op	    9185 allocs/op
BenchmarkDB_Changes-4                         	     882	   1369276 ns/op	    730313 objects/sec	  783473 B/op	   12336 allocs/op
BenchmarkDB_RandomLookup-4                    	   22198	     53944 ns/op	  18537764 objects/sec	       0 B/op	       0 allocs/op
BenchmarkDB_SequentialLookup-4                	   26175	     45144 ns/op	  22151568 objects/sec	       0 B/op	       0 allocs/op
BenchmarkDB_Prefix_SecondaryIndex-4           	    6853	    164940 ns/op	   6062825 objects/sec	  124920 B/op	    1025 allocs/op
BenchmarkDB_FullIteration_All-4               	    1077	   1110722 ns/op	  90031521 objects/sec	     104 B/op	       4 allocs/op
BenchmarkDB_FullIteration_Prefix-4            	     966	   1186319 ns/op	  84294357 objects/sec	     136 B/op	       5 allocs/op
BenchmarkDB_FullIteration_Get-4               	     226	   5286322 ns/op	  18916743 objects/sec	       0 B/op	       0 allocs/op
BenchmarkDB_FullIteration_Get_Secondary-4     	     120	   9887381 ns/op	  10113902 objects/sec	       0 B/op	       0 allocs/op
BenchmarkDB_FullIteration_ReadTxnGet-4        	     216	   5565533 ns/op	  17967731 objects/sec	       0 B/op	       0 allocs/op
BenchmarkDB_PropagationDelay-4                	  597692	      1794 ns/op	        15.00 50th_µs	        19.00 90th_µs	        59.00 99th_µs	    1121 B/op	      19 allocs/op
BenchmarkDB_WriteTxn_100_LPMIndex-4           	  496675	      2355 ns/op	    424591 objects/sec	    1825 B/op	      37 allocs/op
BenchmarkDB_WriteTxn_1_LPMIndex-4             	  135589	     14424 ns/op	     69330 objects/sec	   15804 B/op	      81 allocs/op
BenchmarkDB_LPMIndex_Get-4                    	     394	   2981807 ns/op	   3353671 objects/sec	       0 B/op	       0 allocs/op
BenchmarkWatchSet_4-4                         	 2220138	       532.8 ns/op	     296 B/op	       4 allocs/op
BenchmarkWatchSet_16-4                        	  746055	      1588 ns/op	    1096 B/op	       5 allocs/op
BenchmarkWatchSet_128-4                       	   85210	     13901 ns/op	    8904 B/op	       5 allocs/op
BenchmarkWatchSet_1024-4                      	    8469	    139733 ns/op	   73743 B/op	       5 allocs/op
PASS
ok  	github.com/cilium/statedb	43.883s
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   	 6124650	       195.8 ns/op	       0 B/op	       0 allocs/op
PASS
ok  	github.com/cilium/statedb/internal	1.203s
goos: linux
goarch: amd64
pkg: github.com/cilium/statedb/lpm
cpu: AMD EPYC 7763 64-Core Processor                
Benchmark_txn_insert/batchSize=1-4         	    1870	    645651 ns/op	   1548824 objects/sec	  838410 B/op	   13975 allocs/op
Benchmark_txn_insert/batchSize=10-4        	    3055	    399410 ns/op	   2503694 objects/sec	  385196 B/op	    6668 allocs/op
Benchmark_txn_insert/batchSize=100-4       	    3253	    373668 ns/op	   2676175 objects/sec	  345613 B/op	    6027 allocs/op
Benchmark_txn_delete/batchSize=1-4         	    1522	    772287 ns/op	   1294856 objects/sec	 1286474 B/op	   13976 allocs/op
Benchmark_txn_delete/batchSize=10-4        	    3151	    382348 ns/op	   2615421 objects/sec	  372417 B/op	    5769 allocs/op
Benchmark_txn_delete/batchSize=100-4       	    3428	    345051 ns/op	   2898124 objects/sec	  286754 B/op	    5038 allocs/op
Benchmark_LPM_Lookup-4                     	    7746	    153343 ns/op	   6521327 objects/sec	       0 B/op	       0 allocs/op
Benchmark_LPM_All-4                        	  132922	      9008 ns/op	 111011794 objects/sec	      32 B/op	       1 allocs/op
Benchmark_LPM_Prefix-4                     	  132102	      9111 ns/op	 109759698 objects/sec	      32 B/op	       1 allocs/op
Benchmark_LPM_LowerBound-4                 	  242035	      4877 ns/op	 102514362 objects/sec	     288 B/op	       2 allocs/op
PASS
ok  	github.com/cilium/statedb/lpm	11.988s
goos: linux
goarch: amd64
pkg: github.com/cilium/statedb/part
cpu: AMD EPYC 7763 64-Core Processor                
Benchmark_Uint64Map_Random-4                  	    1545	    766673 ns/op	   1304336 items/sec	 2526873 B/op	    6055 allocs/op
Benchmark_Uint64Map_Sequential-4              	    1885	    648836 ns/op	   1541221 items/sec	 2216724 B/op	    5754 allocs/op
Benchmark_Uint64Map_Sequential_Insert-4       	    2012	    586108 ns/op	   1706172 items/sec	 2208721 B/op	    4753 allocs/op
Benchmark_Uint64Map_Sequential_Txn_Insert-4   	   10000	    103412 ns/op	   9670068 items/sec	   86352 B/op	    2028 allocs/op
Benchmark_Uint64Map_Random_Insert-4           	    1684	    703115 ns/op	   1422243 items/sec	 2513937 B/op	    5041 allocs/op
Benchmark_Uint64Map_Random_Txn_Insert-4       	    6937	    169027 ns/op	   5916212 items/sec	  119976 B/op	    2424 allocs/op
Benchmark_Insert_RootOnlyWatch-4              	   10000	    117839 ns/op	   8486131 objects/sec	   71504 B/op	    2033 allocs/op
Benchmark_Insert-4                            	    7891	    152828 ns/op	   6543307 objects/sec	  186937 B/op	    3060 allocs/op
Benchmark_Modify-4                            	   12394	     96755 ns/op	  10335421 objects/sec	   58224 B/op	    1007 allocs/op
Benchmark_GetInsert-4                         	    9126	    127228 ns/op	   7859917 objects/sec	   58224 B/op	    1007 allocs/op
Benchmark_Replace-4                           	31992230	        37.59 ns/op	  26600596 objects/sec	       0 B/op	       0 allocs/op
Benchmark_Replace_RootOnlyWatch-4             	31902332	        37.53 ns/op	  26643904 objects/sec	       0 B/op	       0 allocs/op
Benchmark_txn_1-4                             	 6214448	       192.5 ns/op	   5195275 objects/sec	     168 B/op	       3 allocs/op
Benchmark_txn_10-4                            	10064242	       117.8 ns/op	   8485931 objects/sec	      86 B/op	       2 allocs/op
Benchmark_txn_100-4                           	11656044	       100.8 ns/op	   9924851 objects/sec	      80 B/op	       2 allocs/op
Benchmark_txn_1000-4                          	10202618	       116.3 ns/op	   8600289 objects/sec	      65 B/op	       2 allocs/op
Benchmark_txn_delete_1-4                      	 4839506	       245.6 ns/op	   4071906 objects/sec	     664 B/op	       4 allocs/op
Benchmark_txn_delete_10-4                     	11341920	       106.0 ns/op	   9431934 objects/sec	     106 B/op	       1 allocs/op
Benchmark_txn_delete_100-4                    	12382335	        95.39 ns/op	  10482962 objects/sec	      47 B/op	       1 allocs/op
Benchmark_txn_delete_1000-4                   	14809774	        79.42 ns/op	  12591139 objects/sec	      24 B/op	       1 allocs/op
Benchmark_Get-4                               	   44940	     26760 ns/op	  37369798 objects/sec	       0 B/op	       0 allocs/op
Benchmark_All-4                               	  115450	     10473 ns/op	  95485954 objects/sec	       0 B/op	       0 allocs/op
Benchmark_Iterator_All-4                      	  130034	     10124 ns/op	  98771802 objects/sec	       0 B/op	       0 allocs/op
Benchmark_Iterator_Next-4                     	  159374	      7405 ns/op	 135038748 objects/sec	     896 B/op	       1 allocs/op
Benchmark_Hashmap_Insert-4                    	   14754	     81226 ns/op	  12311368 objects/sec	   74264 B/op	      20 allocs/op
Benchmark_Hashmap_Get_Uint64-4                	  136858	      8736 ns/op	 114468445 objects/sec	       0 B/op	       0 allocs/op
Benchmark_Hashmap_Get_Bytes-4                 	  111541	     10756 ns/op	  92972924 objects/sec	       0 B/op	       0 allocs/op
Benchmark_Delete_Random-4                     	      92	  13625069 ns/op	   7339412 objects/sec	 2111844 B/op	  102364 allocs/op
Benchmark_find16-4                            	202206778	         5.928 ns/op	       0 B/op	       0 allocs/op
Benchmark_findIndex16-4                       	100000000	        12.45 ns/op	       0 B/op	       0 allocs/op
Benchmark_find48-4                            	385192455	         3.122 ns/op	       0 B/op	       0 allocs/op
Benchmark_findIndex48_hit-4                   	427725128	         2.805 ns/op	       0 B/op	       0 allocs/op
Benchmark_findIndex48_miss-4                  	384252355	         3.127 ns/op	       0 B/op	       0 allocs/op
Benchmark_find4-4                             	423627786	         2.833 ns/op	       0 B/op	       0 allocs/op
Benchmark_findIndex4-4                        	319774023	         3.746 ns/op	       0 B/op	       0 allocs/op
PASS
ok  	github.com/cilium/statedb/part	43.168s
PASS
ok  	github.com/cilium/statedb/reconciler	0.004s
?   	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 1.95 seconds (batch size 1000)
Throughput 513815.69 objects per second
888MB total allocated, 6015241 in-use objects, 338MB bytes in use

@tklauser tklauser requested review from a team, derailed and pippolo84 and removed request for a team and derailed June 11, 2026 13:05
@joamaki

joamaki commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Thanks! Just missed StateDB v0.8.2. Should've checked the open PRs first..

@joamaki joamaki merged commit b3a6670 into main Jun 11, 2026
1 check passed
@joamaki joamaki deleted the pr/tklauser/no-op-delete-revision branch June 11, 2026 14:21
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.

2 participants