Skip to content

feat(blockstm): cache pre-state to optimize value-based validation#25814

Closed
mmsqe wants to merge 8 commits intocosmos:mainfrom
mmsqe:value_based
Closed

feat(blockstm): cache pre-state to optimize value-based validation#25814
mmsqe wants to merge 8 commits intocosmos:mainfrom
mmsqe:value_based

Conversation

@mmsqe
Copy link
Copy Markdown
Collaborator

@mmsqe mmsqe commented Jan 23, 2026

Description

  • optimize Has check to depend only on key existence, ignoring irrelevant version changes
  • cache pre-state for value-based validation to reduce expensive storage reads
  • replace MVData’s outer index with a sharded index to reduce contention and improve key/index operations
goos: darwin
goarch: arm64
pkg: github.com/cosmos/cosmos-sdk/internal/blockstm
cpu: Apple M4 Max
                                                    │ /private/tmp/stm_main.txt │       /private/tmp/stm_mv.txt       │
                                                    │          sec/op           │    sec/op     vs base               │
BlockSTM/random-10000/100-sequential-16                            874.4m ±  0%   871.6m ±  0%   -0.33% (p=0.009 n=6)
BlockSTM/random-10000/100-worker-1-16                              258.6m ± 29%   201.9m ±  0%  -21.93% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-5-16                              20.18m ±  5%   14.11m ±  5%  -30.07% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-10-16                             27.57m ±  1%   13.91m ±  0%  -49.55% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-15-16                             29.92m ±  5%   20.26m ±  1%  -32.28% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-20-16                             31.72m ±  8%   22.01m ±  1%  -30.60% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-sequential-16                           192.5m ±  0%   192.3m ±  0%        ~ (p=0.310 n=6)
BlockSTM/has-hit-10000/100-worker-1-16                             230.6m ±  1%   212.3m ±  0%   -7.93% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-worker-5-16                             109.4m ± 12%   115.6m ±  7%        ~ (p=0.310 n=6)
BlockSTM/has-hit-10000/100-worker-10-16                            115.5m ± 19%   119.1m ± 13%        ~ (p=0.180 n=6)
BlockSTM/has-hit-10000/100-worker-15-16                            131.7m ±  1%   137.8m ± 13%   +4.61% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-worker-20-16                            131.1m ±  2%   138.3m ± 13%   +5.46% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-sequential-16                          11.91m ±  7%   11.41m ±  0%   -4.21% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-worker-1-16                            43.23m ±  2%   27.86m ±  1%  -35.56% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-worker-5-16                            90.74m ±  7%   91.00m ±  8%        ~ (p=0.937 n=6)
BlockSTM/has-miss-10000/100-worker-10-16                           119.1m ±  9%   115.7m ±  1%        ~ (p=0.310 n=6)
BlockSTM/has-miss-10000/100-worker-15-16                           125.2m ±  1%   128.6m ±  1%   +2.72% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-worker-20-16                           125.4m ± 16%   128.4m ±  5%        ~ (p=0.699 n=6)
BlockSTM/no-conflict-10000-sequential-16                           874.7m ±  0%   874.6m ±  0%        ~ (p=0.818 n=6)
BlockSTM/no-conflict-10000-worker-1-16                             339.3m ±  2%   342.2m ±  0%        ~ (p=0.065 n=6)
BlockSTM/no-conflict-10000-worker-5-16                             37.51m ±  1%   37.82m ±  1%   +0.83% (p=0.026 n=6)
BlockSTM/no-conflict-10000-worker-10-16                            34.57m ±  1%   34.23m ±  0%   -0.98% (p=0.026 n=6)
BlockSTM/no-conflict-10000-worker-15-16                            38.16m ±  1%   38.48m ±  1%        ~ (p=0.093 n=6)
BlockSTM/no-conflict-10000-worker-20-16                            40.05m ±  1%   38.83m ±  1%   -3.04% (p=0.002 n=6)
BlockSTM/worst-case-10000-sequential-16                            870.5m ±  1%   863.7m ±  0%        ~ (p=0.065 n=6)
BlockSTM/worst-case-10000-worker-1-16                              255.6m ±  0%   201.7m ±  0%  -21.06% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-5-16                              94.46m ±  1%   85.00m ±  0%  -10.01% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-10-16                             92.52m ±  1%   85.05m ±  0%   -8.07% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-15-16                             93.05m ±  1%   85.71m ±  1%   -7.89% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-20-16                             98.26m ± 24%   85.03m ±  1%  -13.46% (p=0.002 n=6)
BlockSTM/iterate-10000/100-sequential-16                           881.1m ±  0%   881.1m ±  0%        ~ (p=0.937 n=6)
BlockSTM/iterate-10000/100-worker-1-16                             523.0m ±  1%   514.1m ±  0%   -1.70% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-5-16                             50.91m ±  3%   41.49m ±  2%  -18.51% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-10-16                            56.91m ±  1%   45.73m ±  1%  -19.65% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-15-16                            60.83m ±  2%   48.46m ±  2%  -20.33% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-20-16                            67.85m ± 13%   51.46m ±  2%  -24.16% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-sequential-16                    884.4m ±  2%   879.7m ±  0%   -0.53% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-1-16                      526.3m ±  1%   515.7m ±  0%   -2.01% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-5-16                      50.57m ±  5%   41.92m ±  1%  -17.09% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-10-16                     59.00m ± 16%   45.68m ±  1%  -22.58% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-15-16                     63.36m ±  5%   48.25m ±  1%  -23.84% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-20-16                     66.81m ±  3%   51.11m ±  1%  -23.50% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-sequential-16                        948.8µ ±  1%   947.4µ ±  0%        ~ (p=0.240 n=6)
BlockSTM/iterate-newkeys-2000-worker-1-16                          9.688m ±  2%   8.428m ±  1%  -13.01% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-5-16                          4.230m ±  2%   3.848m ±  1%   -9.03% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-10-16                         4.314m ±  2%   3.879m ±  1%  -10.07% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-15-16                         5.487m ±  2%   4.785m ±  1%  -12.78% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-20-16                         7.827m ±  4%   6.855m ±  4%  -12.42% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-sequential-16                         4.117m ±  0%   4.116m ±  0%        ~ (p=1.000 n=6)
BlockSTM/aba-samevalue-10000-worker-1-16                           21.67m ±  1%   18.48m ±  1%  -14.75% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-5-16                           42.95m ±  1%   17.71m ±  1%  -58.76% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-10-16                          45.17m ±  1%   18.76m ±  1%  -58.47% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-15-16                          48.67m ±  4%   22.09m ±  1%  -54.61% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-20-16                          49.94m ±  2%   22.52m ±  1%  -54.91% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-sequential-16                4.131m ±  0%   4.111m ±  0%   -0.48% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-1-16                  21.75m ±  1%   18.20m ±  2%  -16.29% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-5-16                  43.06m ±  1%   33.84m ±  1%  -21.43% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-10-16                 46.33m ±  3%   33.66m ±  0%  -27.35% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-15-16                 48.39m ±  2%   33.95m ±  1%  -29.85% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-20-16                 50.06m ±  1%   34.33m ±  1%  -31.42% (p=0.002 n=6)
geomean                                                            59.92m         50.19m        -16.24%

                                                    │ /private/tmp/stm_main.txt │       /private/tmp/stm_mv.txt       │
                                                    │         exec/txn          │  exec/txn   vs base                 │
BlockSTM/random-10000/100-sequential-16                              1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/random-10000/100-worker-1-16                                1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/random-10000/100-worker-5-16                                1.155 ± 3%   1.059 ± 0%   -8.31% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-10-16                               1.946 ± 1%   1.243 ± 1%  -36.17% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-15-16                               1.995 ± 0%   1.865 ± 1%   -6.54% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-20-16                               1.999 ± 0%   1.949 ± 0%   -2.53% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-sequential-16                             1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-hit-10000/100-worker-1-16                               1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-hit-10000/100-worker-5-16                               1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-hit-10000/100-worker-10-16                              1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-hit-10000/100-worker-15-16                              1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-hit-10000/100-worker-20-16                              1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-sequential-16                            1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-worker-1-16                              1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-worker-5-16                              1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-worker-10-16                             1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-worker-15-16                             1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-worker-20-16                             1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/no-conflict-10000-sequential-16                             1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/no-conflict-10000-worker-1-16                               1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/no-conflict-10000-worker-5-16                               1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/no-conflict-10000-worker-10-16                              1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/no-conflict-10000-worker-15-16                              1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/no-conflict-10000-worker-20-16                              1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/worst-case-10000-sequential-16                              1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/worst-case-10000-worker-1-16                                1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/worst-case-10000-worker-5-16                                1.954 ± 0%   1.968 ± 0%   +0.67% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-10-16                               2.021 ± 0%   2.056 ± 0%   +1.76% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-15-16                               2.014 ± 0%   2.061 ± 0%   +2.31% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-20-16                               2.005 ± 0%   2.058 ± 0%   +2.59% (p=0.002 n=6)
BlockSTM/iterate-10000/100-sequential-16                             1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-10000/100-worker-1-16                               1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-10000/100-worker-5-16                               1.321 ± 1%   1.240 ± 0%   -6.17% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-10-16                              1.933 ± 1%   1.771 ± 0%   -8.36% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-15-16                              2.128 ± 0%   2.098 ± 2%   -1.43% (p=0.026 n=6)
BlockSTM/iterate-10000/100-worker-20-16                              2.210 ± 1%   2.196 ± 1%   -0.66% (p=0.041 n=6)
BlockSTM/iterate-10000/100-prepop-sequential-16                      1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-10000/100-prepop-worker-1-16                        1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-10000/100-prepop-worker-5-16                        1.317 ± 1%   1.241 ± 0%   -5.73% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-10-16                       1.944 ± 2%   1.774 ± 0%   -8.74% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-15-16                       2.140 ± 1%   2.096 ± 1%   -2.03% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-20-16                       2.216 ± 1%   2.195 ± 0%   -0.97% (p=0.030 n=6)
BlockSTM/iterate-newkeys-2000-sequential-16                          1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-newkeys-2000-worker-1-16                            1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-newkeys-2000-worker-5-16                            1.012 ± 0%   1.013 ± 0%   +0.10% (p=0.013 n=6)
BlockSTM/iterate-newkeys-2000-worker-10-16                           1.073 ± 0%   1.051 ± 0%   -1.96% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-15-16                           1.280 ± 4%   1.196 ± 1%   -6.56% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-20-16                           1.849 ± 3%   1.764 ± 6%   -4.60% (p=0.026 n=6)
BlockSTM/aba-samevalue-10000-sequential-16                           1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-10000-worker-1-16                             1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-10000-worker-5-16                             1.993 ± 0%   1.000 ± 0%  -49.82% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-10-16                            2.002 ± 0%   1.000 ± 0%  -50.05% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-15-16                            2.003 ± 0%   1.000 ± 0%  -50.07% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-20-16                            2.003 ± 0%   1.000 ± 0%  -50.07% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-sequential-16                  1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-bigvalue-10000-worker-1-16                    1.000 ± 0%   1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-bigvalue-10000-worker-5-16                    1.993 ± 0%   2.016 ± 0%   +1.18% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-10-16                   2.002 ± 0%   2.015 ± 0%   +0.62% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-15-16                   2.003 ± 0%   2.013 ± 0%   +0.50% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-20-16                   2.003 ± 0%   2.013 ± 0%   +0.50% (p=0.002 n=6)
geomean                                                              1.315        1.235        -6.12%
¹ all samples are equal

                                                    │ /private/tmp/stm_main.txt │       /private/tmp/stm_mv.txt       │
                                                    │          val/txn          │  val/txn    vs base                 │
BlockSTM/random-10000/100-sequential-16                            0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/random-10000/100-worker-1-16                              1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/random-10000/100-worker-5-16                              1.292 ± 2%     1.191 ± 0%   -7.82% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-10-16                             2.046 ± 0%     1.752 ± 1%  -14.41% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-15-16                             2.194 ± 1%     2.444 ± 1%  +11.42% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-20-16                             2.264 ± 1%     2.622 ± 0%  +15.77% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-sequential-16                           0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-hit-10000/100-worker-1-16                             1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-hit-10000/100-worker-5-16                             1.002 ± 0%     1.004 ± 0%   +0.30% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-worker-10-16                            1.001 ± 0%     1.002 ± 0%        ~ (p=0.061 n=6)
BlockSTM/has-hit-10000/100-worker-15-16                            1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-hit-10000/100-worker-20-16                            1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-sequential-16                          0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-worker-1-16                            1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-worker-5-16                            1.001 ± 0%     1.002 ± 0%   +0.10% (p=0.015 n=6)
BlockSTM/has-miss-10000/100-worker-10-16                           1.001 ± 0%     1.001 ± 0%        ~ (p=0.455 n=6)
BlockSTM/has-miss-10000/100-worker-15-16                           1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-worker-20-16                           1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/no-conflict-10000-sequential-16                           0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/no-conflict-10000-worker-1-16                             1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/no-conflict-10000-worker-5-16                             1.002 ± 0%     1.003 ± 0%        ~ (p=0.061 n=6)
BlockSTM/no-conflict-10000-worker-10-16                            1.000 ± 0%     1.001 ± 0%   +0.10% (p=0.015 n=6)
BlockSTM/no-conflict-10000-worker-15-16                            1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6)
BlockSTM/no-conflict-10000-worker-20-16                            1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6)
BlockSTM/worst-case-10000-sequential-16                            0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/worst-case-10000-worker-1-16                              1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/worst-case-10000-worker-5-16                              2.087 ± 1%     2.068 ± 0%   -0.89% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-10-16                             2.104 ± 0%     2.152 ± 1%   +2.28% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-15-16                             2.042 ± 0%     2.139 ± 0%   +4.72% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-20-16                             2.016 ± 1%     2.123 ± 0%   +5.36% (p=0.002 n=6)
BlockSTM/iterate-10000/100-sequential-16                           0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-10000/100-worker-1-16                             1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-10000/100-worker-5-16                             1.538 ± 1%     1.445 ± 0%   -6.08% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-10-16                            2.071 ± 1%     2.047 ± 0%   -1.16% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-15-16                            2.479 ± 1%     2.388 ± 2%   -3.67% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-20-16                            2.856 ± 3%     2.652 ± 1%   -7.14% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-sequential-16                    0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-10000/100-prepop-worker-1-16                      1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-10000/100-prepop-worker-5-16                      1.534 ± 1%     1.446 ± 1%   -5.73% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-10-16                     2.088 ± 3%     2.050 ± 0%   -1.84% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-15-16                     2.515 ± 2%     2.391 ± 1%   -4.93% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-20-16                     2.796 ± 4%     2.633 ± 1%   -5.85% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-sequential-16                        0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-newkeys-2000-worker-1-16                          1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-newkeys-2000-worker-5-16                          1.016 ± 0%     1.018 ± 0%   +0.15% (p=0.013 n=6)
BlockSTM/iterate-newkeys-2000-worker-10-16                         1.081 ± 1%     1.059 ± 0%   -1.94% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-15-16                         1.359 ± 5%     1.280 ± 3%   -5.81% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-20-16                         2.119 ± 3%     2.055 ± 7%        ~ (p=0.240 n=6)
BlockSTM/aba-samevalue-10000-sequential-16                         0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-10000-worker-1-16                           1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-10000-worker-5-16                           2.107 ± 0%     1.004 ± 0%  -52.36% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-10-16                          2.025 ± 0%     1.001 ± 0%  -50.57% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-15-16                          2.013 ± 0%     1.000 ± 0%  -50.34% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-20-16                          2.007 ± 0%     1.000 ± 0%  -50.17% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-sequential-16                0.000 ± 0%     0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-bigvalue-10000-worker-1-16                  1.000 ± 0%     1.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-bigvalue-10000-worker-5-16                  2.106 ± 1%     2.125 ± 0%   +0.90% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-10-16                 2.028 ± 0%     2.074 ± 0%   +2.24% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-15-16                 2.014 ± 0%     2.053 ± 0%   +1.94% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-20-16                 2.008 ± 0%     2.048 ± 0%   +2.02% (p=0.002 n=6)
geomean                                                                       ²                -5.06%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                                    │ /private/tmp/stm_main.txt │        /private/tmp/stm_mv.txt        │
                                                    │           B/op            │     B/op      vs base                 │
BlockSTM/random-10000/100-sequential-16                         9.395Mi ±  0%     9.395Mi ± 0%        ~ (p=0.405 n=6)
BlockSTM/random-10000/100-worker-1-16                           65.74Mi ±  1%     31.80Mi ± 0%  -51.63% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-5-16                           77.68Mi ±  3%     31.17Mi ± 0%  -59.88% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-10-16                         148.69Mi ±  1%     35.66Mi ± 0%  -76.02% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-15-16                         149.95Mi ±  0%     50.77Mi ± 1%  -66.15% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-20-16                         150.99Mi ±  0%     52.86Mi ± 0%  -65.00% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-sequential-16                          0.000 ±  0%       0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-hit-10000/100-worker-1-16                         124.53Mi ±  0%     10.85Mi ± 0%  -91.29% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-worker-5-16                         124.54Mi ±  0%     10.85Mi ± 0%  -91.29% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-worker-10-16                        124.54Mi ±  0%     10.85Mi ± 0%  -91.29% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-worker-15-16                        124.54Mi ±  0%     10.85Mi ± 0%  -91.29% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-worker-20-16                        124.54Mi ±  0%     10.85Mi ± 0%  -91.29% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-sequential-16                         0.000 ±  0%       0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-worker-1-16                        124.53Mi ±  0%     10.85Mi ± 0%  -91.29% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-worker-5-16                        124.54Mi ±  0%     10.85Mi ± 0%  -91.29% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-worker-10-16                       124.54Mi ±  0%     10.85Mi ± 0%  -91.29% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-worker-15-16                       124.54Mi ±  0%     10.85Mi ± 0%  -91.29% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-worker-20-16                       124.54Mi ±  0%     10.85Mi ± 0%  -91.29% (p=0.002 n=6)
BlockSTM/no-conflict-10000-sequential-16                        10.29Mi ±  0%     10.29Mi ± 0%        ~ (p=1.000 n=6)
BlockSTM/no-conflict-10000-worker-1-16                          73.15Mi ±  0%     82.20Mi ± 0%  +12.37% (p=0.002 n=6)
BlockSTM/no-conflict-10000-worker-5-16                          102.9Mi ±  0%     101.6Mi ± 0%   -1.23% (p=0.002 n=6)
BlockSTM/no-conflict-10000-worker-10-16                         150.9Mi ±  1%     140.9Mi ± 1%   -6.67% (p=0.002 n=6)
BlockSTM/no-conflict-10000-worker-15-16                         163.6Mi ±  1%     156.1Mi ± 1%   -4.62% (p=0.002 n=6)
BlockSTM/no-conflict-10000-worker-20-16                         163.2Mi ±  1%     157.8Mi ± 1%   -3.28% (p=0.002 n=6)
BlockSTM/worst-case-10000-sequential-16                         9.155Mi ±  0%     9.155Mi ± 0%        ~ (p=0.567 n=6)
BlockSTM/worst-case-10000-worker-1-16                           77.45Mi ±  0%     28.54Mi ± 0%  -63.14% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-5-16                          223.91Mi ±  1%     49.80Mi ± 0%  -77.76% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-10-16                         283.34Mi ±  1%     52.05Mi ± 0%  -81.63% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-15-16                         302.09Mi ±  1%     52.16Mi ± 0%  -82.73% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-20-16                         292.94Mi ± 12%     52.06Mi ± 0%  -82.23% (p=0.002 n=6)
BlockSTM/iterate-10000/100-sequential-16                        16.02Mi ±  0%     16.02Mi ± 0%        ~ (p=1.000 n=6)
BlockSTM/iterate-10000/100-worker-1-16                         130.34Mi ±  0%     88.33Mi ± 0%  -32.23% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-5-16                          181.4Mi ±  1%     102.7Mi ± 0%  -43.36% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-10-16                         279.7Mi ±  0%     142.1Mi ± 0%  -49.18% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-15-16                         295.8Mi ±  0%     163.4Mi ± 2%  -44.75% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-20-16                         310.1Mi ±  1%     170.4Mi ± 1%  -45.03% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-sequential-16                 16.01Mi ±  0%     16.01Mi ± 0%        ~ (p=0.455 n=6)
BlockSTM/iterate-10000/100-prepop-worker-1-16                  130.26Mi ±  0%     88.23Mi ± 0%  -32.27% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-5-16                   180.7Mi ±  2%     102.8Mi ± 0%  -43.12% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-10-16                  280.6Mi ±  2%     142.2Mi ± 0%  -49.35% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-15-16                  297.1Mi ±  1%     163.4Mi ± 0%  -45.01% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-20-16                  310.5Mi ±  1%     170.1Mi ± 0%  -45.21% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-sequential-16                     1.217Mi ±  0%     1.217Mi ± 0%        ~ (p=0.900 n=6)
BlockSTM/iterate-newkeys-2000-worker-1-16                       17.12Mi ±  0%     19.57Mi ± 0%  +14.29% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-5-16                       20.49Mi ±  0%     22.03Mi ± 0%   +7.52% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-10-16                      27.35Mi ±  1%     27.14Mi ± 0%   -0.77% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-15-16                      32.85Mi ±  2%     32.17Mi ± 1%   -2.09% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-20-16                      43.00Mi ±  2%     42.60Mi ± 4%        ~ (p=0.485 n=6)
BlockSTM/aba-samevalue-10000-sequential-16                        0.000 ±  0%       0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-10000-worker-1-16                        38.38Mi ±  0%     39.43Mi ± 0%   +2.73% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-5-16                        81.67Mi ±  1%     64.53Mi ± 1%  -20.99% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-10-16                       148.3Mi ±  2%     104.5Mi ± 1%  -29.51% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-15-16                       163.7Mi ±  5%     116.1Mi ± 3%  -29.08% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-20-16                       169.5Mi ±  2%     119.8Mi ± 8%  -29.33% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-sequential-16               0.000 ±  0%       0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-bigvalue-10000-worker-1-16               38.38Mi ±  0%     39.35Mi ± 0%   +2.54% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-5-16               81.73Mi ±  1%     63.77Mi ± 0%  -21.97% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-10-16             144.02Mi ±  5%     87.05Mi ± 1%  -39.56% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-15-16              164.7Mi ±  2%     108.7Mi ± 1%  -33.99% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-20-16              168.7Mi ±  2%     121.5Mi ± 1%  -27.94% (p=0.002 n=6)
geomean                                                                       ²                 -53.19%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                                    │ /private/tmp/stm_main.txt │        /private/tmp/stm_mv.txt        │
                                                    │         allocs/op         │  allocs/op    vs base                 │
BlockSTM/random-10000/100-sequential-16                          220.0k ±  0%      220.0k ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/random-10000/100-worker-1-16                            766.6k ±  2%      477.4k ± 0%  -37.72% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-5-16                            888.8k ±  4%      468.6k ± 0%  -47.27% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-10-16                          1737.0k ±  1%      545.4k ± 0%  -68.60% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-15-16                          1829.5k ±  1%      803.6k ± 1%  -56.08% (p=0.002 n=6)
BlockSTM/random-10000/100-worker-20-16                          1872.0k ±  1%      839.4k ± 0%  -55.16% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-sequential-16                          0.000 ±  0%       0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-hit-10000/100-worker-1-16                           200.1k ±  0%      121.9k ± 0%  -39.07% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-worker-5-16                           200.1k ±  0%      122.0k ± 0%  -39.06% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-worker-10-16                          200.2k ±  0%      122.0k ± 0%  -39.06% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-worker-15-16                          200.2k ±  0%      122.0k ± 0%  -39.06% (p=0.002 n=6)
BlockSTM/has-hit-10000/100-worker-20-16                          200.2k ±  0%      122.0k ± 0%  -39.05% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-sequential-16                         0.000 ±  0%       0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/has-miss-10000/100-worker-1-16                          200.1k ±  0%      121.9k ± 0%  -39.07% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-worker-5-16                          200.1k ±  0%      122.0k ± 0%  -39.06% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-worker-10-16                         200.2k ±  0%      122.0k ± 0%  -39.06% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-worker-15-16                         200.2k ±  0%      122.0k ± 0%  -39.06% (p=0.002 n=6)
BlockSTM/has-miss-10000/100-worker-20-16                         200.2k ±  0%      122.0k ± 0%  -39.05% (p=0.002 n=6)
BlockSTM/no-conflict-10000-sequential-16                         220.6k ±  0%      220.6k ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/no-conflict-10000-worker-1-16                           995.3k ±  0%     1068.7k ± 0%   +7.37% (p=0.002 n=6)
BlockSTM/no-conflict-10000-worker-5-16                           1.323M ±  0%      1.279M ± 0%   -3.28% (p=0.002 n=6)
BlockSTM/no-conflict-10000-worker-10-16                          1.875M ±  1%      1.729M ± 1%   -7.82% (p=0.002 n=6)
BlockSTM/no-conflict-10000-worker-15-16                          2.040M ±  1%      1.916M ± 1%   -6.08% (p=0.002 n=6)
BlockSTM/no-conflict-10000-worker-20-16                          2.035M ±  1%      1.938M ± 1%   -4.74% (p=0.002 n=6)
BlockSTM/worst-case-10000-sequential-16                          220.0k ±  0%      220.0k ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/worst-case-10000-worker-1-16                            860.0k ±  0%      454.7k ± 0%  -47.13% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-5-16                           2380.7k ±  0%      838.8k ± 0%  -64.77% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-10-16                          2970.4k ±  1%      877.2k ± 0%  -70.47% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-15-16                          3202.3k ±  1%      879.0k ± 0%  -72.55% (p=0.002 n=6)
BlockSTM/worst-case-10000-worker-20-16                          3169.9k ± 10%      876.9k ± 0%  -72.34% (p=0.002 n=6)
BlockSTM/iterate-10000/100-sequential-16                         292.6k ±  0%      292.6k ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-10000/100-worker-1-16                          1391.1k ±  0%      993.7k ± 0%  -28.57% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-5-16                           1.895M ±  1%      1.133M ± 0%  -40.22% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-10-16                          2.934M ±  1%      1.579M ± 0%  -46.18% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-15-16                          3.292M ±  1%      1.824M ± 2%  -44.60% (p=0.002 n=6)
BlockSTM/iterate-10000/100-worker-20-16                          3.563M ±  1%      1.913M ± 1%  -46.30% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-sequential-16                  292.5k ±  0%      292.5k ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-10000/100-prepop-worker-1-16                   1390.4k ±  0%      992.9k ± 0%  -28.59% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-5-16                    1.888M ±  2%      1.134M ± 0%  -39.94% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-10-16                   2.954M ±  2%      1.579M ± 0%  -46.53% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-15-16                   3.332M ±  2%      1.823M ± 0%  -45.30% (p=0.002 n=6)
BlockSTM/iterate-10000/100-prepop-worker-20-16                   3.572M ±  1%      1.910M ± 0%  -46.53% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-sequential-16                      13.74k ±  0%      13.74k ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/iterate-newkeys-2000-worker-1-16                        187.0k ±  0%      185.4k ± 0%   -0.90% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-5-16                        225.5k ±  0%      213.2k ± 0%   -5.45% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-10-16                       306.2k ±  1%      272.1k ± 0%  -11.15% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-15-16                       372.7k ±  2%      328.4k ± 1%  -11.89% (p=0.002 n=6)
BlockSTM/iterate-newkeys-2000-worker-20-16                       489.6k ±  2%      433.1k ± 4%  -11.55% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-sequential-16                        0.000 ±  0%       0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-10000-worker-1-16                         487.5k ±  0%      470.1k ± 0%   -3.57% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-5-16                        1048.7k ±  1%      768.5k ± 1%  -26.72% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-10-16                        1.822M ±  2%      1.230M ± 1%  -32.48% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-15-16                        2.021M ±  5%      1.387M ± 3%  -31.36% (p=0.002 n=6)
BlockSTM/aba-samevalue-10000-worker-20-16                        2.093M ±  2%      1.433M ± 8%  -31.54% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-sequential-16               0.000 ±  0%       0.000 ± 0%        ~ (p=1.000 n=6) ¹
BlockSTM/aba-samevalue-bigvalue-10000-worker-1-16                487.5k ±  0%      460.1k ± 0%   -5.62% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-5-16               1049.4k ±  1%      782.9k ± 0%  -25.40% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-10-16               1.773M ±  4%      1.049M ± 0%  -40.83% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-15-16               2.032M ±  2%      1.302M ± 1%  -35.93% (p=0.002 n=6)
BlockSTM/aba-samevalue-bigvalue-10000-worker-20-16               2.083M ±  2%      1.457M ± 1%  -30.02% (p=0.002 n=6)
geomean                                                                       ²                 -32.38%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

Closes: #25777

@codecov
Copy link
Copy Markdown

codecov Bot commented Jan 23, 2026

Codecov Report

❌ Patch coverage is 59.00735% with 223 lines in your changes missing coverage. Please review.
✅ Project coverage is 68.78%. Comparing base (95b8e12) to head (45abc65).
⚠️ Report is 173 commits behind head on main.

Files with missing lines Patch % Lines
internal/blockstm/tree/small_btree.go 0.00% 73 Missing ⚠️
internal/blockstm/tree/cow_btree.go 0.00% 56 Missing ⚠️
internal/blockstm/tree/btree.go 0.00% 24 Missing ⚠️
internal/blockstm/mviterator.go 73.43% 17 Missing ⚠️
internal/blockstm/keycursor.go 74.19% 16 Missing ⚠️
internal/blockstm/mvdata.go 84.53% 15 Missing ⚠️
internal/blockstm/mvindex.go 88.76% 10 Missing ⚠️
internal/blockstm/mvview.go 68.96% 9 Missing ⚠️
internal/blockstm/stm.go 86.95% 3 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main   #25814      +/-   ##
==========================================
- Coverage   68.85%   68.78%   -0.08%     
==========================================
  Files         926      930       +4     
  Lines       60567    60956     +389     
==========================================
+ Hits        41706    41931     +225     
- Misses      18861    19025     +164     
Files with missing lines Coverage Δ
internal/blockstm/mergeiterator.go 94.84% <100.00%> (+2.80%) ⬆️
internal/blockstm/types.go 100.00% <ø> (ø)
internal/blockstm/stm.go 88.88% <86.95%> (+4.27%) ⬆️
internal/blockstm/mvview.go 82.17% <68.96%> (-4.24%) ⬇️
internal/blockstm/mvindex.go 88.76% <88.76%> (ø)
internal/blockstm/mvdata.go 87.73% <84.53%> (-9.30%) ⬇️
internal/blockstm/keycursor.go 74.19% <74.19%> (ø)
internal/blockstm/mviterator.go 81.11% <73.43%> (-18.89%) ⬇️
internal/blockstm/tree/btree.go 0.00% <0.00%> (ø)
internal/blockstm/tree/cow_btree.go 0.00% <0.00%> (ø)
... and 1 more

... and 3 files with indirect coverage changes

Impacted file tree graph

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

const minSnapshotKeysCap = 1024

type mvIndexEntry[V any] struct {
key []byte
Copy link
Copy Markdown
Collaborator

@yihuang yihuang Jan 26, 2026

Choose a reason for hiding this comment

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

If we'll choose an unordered data structure, you may give sync.Map a try?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

sec/op and B/op are similar on average, but seems syncmap allocate more (allocs/op geomean +10.08%).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

allocs/op don't matter if sec/op and B/op is the same right?

The main trade-off in all unordered data structure based approach, is the heavy iteration overhead.

* add Has operation validation that ignores version changes, only checking for existence state (Found/Deleted)
* reduce memory overhead by packing HasDescriptor into ReadDescriptor
* add negative caching for Has lookups to prevent repeated fallback to storage for non-existent keys
* add readFound

skip large value

* handle snapshots
* avoid storage.Get for Has()

resolve

fix
* add mvIndex sharded key->version-tree map
* update mvData iterator/snapshot paths to use key snapshots
* refactor MVIterator to iterate snapshot keys
* cache mvIndex key snapshot
switch per-key version trees to an in-place, locked tidwall/btree to avoid btree.Copy on updates
* replace lock-holding btree iteration with a chunked cursor that releases locks between refills
* use COW key snapshots so iterators stay serializable without blocking writers while waiting on dependencies
* avoid per-key COW snapshots: keep 0/1 item inline and promote to a locked B-tree on demand
* avoid per-Set allocations on the single-item path
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 8, 2026

This pull request has been automatically marked as stale because it has not had recent activity. It will be closed in 7 days-before-close if no further activity occurs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

blockstm: cache pre-state in MVMemory to support value based validation

2 participants