Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
244 commits
Select commit Hold shift + click to select a range
a5af845
Stage primary-only no-index updates
snissn May 4, 2026
c5c1e14
Make indexed flush publish batches explicit
snissn May 4, 2026
d76e85d
Update mongo gateway no-index update writeback test
snissn May 4, 2026
d4bfd37
Polish no-index writeback accounting and tests
snissn May 4, 2026
5497146
Clarify indexed write-domain precedence
snissn May 4, 2026
3631b88
Preserve staged no-index updates across retries
snissn May 4, 2026
31eb7d0
Require exact indexed publish ownership
snissn May 4, 2026
56e981f
Capture raw semantic indexed update records
snissn May 4, 2026
6dcfc0d
Tighten PR3b semantic record staging
snissn May 5, 2026
dc4cf16
Polish no-index writeback staging copies
snissn May 5, 2026
ef3eae0
Preserve no-index staged writes across non-barrier ops
snissn May 5, 2026
e8a6df2
Add PR3b coalescing acceptance metrics
snissn May 5, 2026
0082636
collections: count skipped secondary roots by unique root
snissn May 5, 2026
7c3e93c
bench: tighten PR3b acceptance metrics
snissn May 5, 2026
7a8e17a
bench: drop ambiguous acceptance ratios
snissn May 5, 2026
b39e274
bench: count async net-zero coalesced batches
snissn May 5, 2026
cddfbd1
bench: observe insert root delta metrics
snissn May 5, 2026
9f2face
collections: publish safe semantic secondary deltas
snissn May 5, 2026
c065df7
collections: tighten semantic secondary publish accounting
snissn May 5, 2026
aa6d572
collections: preflight indexed flush publishes
snissn May 5, 2026
912ad31
db: clone zippers for serialized parallel root apply
snissn May 5, 2026
44850ff
db: add root install guard scaffolding
snissn May 5, 2026
6f6aa8a
db: name guarded retire lists as pending
snissn May 5, 2026
c5c967b
db: expose install guard mismatch sentinel
snissn May 5, 2026
8d170fc
db: preserve cold system tombstones in batch publish
snissn May 5, 2026
2ad685a
db: count optimistic install guard failures
snissn May 5, 2026
29cbc81
db: add prepared root apply metadata
snissn May 5, 2026
bfc5fe6
db: tighten prepared root metadata accounting
snissn May 5, 2026
7bba87e
db: avoid prepared root key span aliases
snissn May 5, 2026
f55c7aa
collections: count semantic records when staged
snissn May 5, 2026
bfbeb98
bench: avoid redundant single-unit raw stat scan
snissn May 5, 2026
c2427f5
db: cover optimistic prepared root fallback stats
snissn May 5, 2026
0470708
Merge PR3b observability into semantic secondary coalescing
snissn May 5, 2026
b9362ac
Merge PR3b semantic coalescing into publish preflight
snissn May 5, 2026
fa11036
Merge PR3c publish preflight into install guard
snissn May 5, 2026
38b35fe
Merge PR4a install guard into prepared root metadata
snissn May 5, 2026
a7ebf34
collections: avoid extra semantic state allocations
snissn May 5, 2026
86d5de8
Merge semantic allocation cleanup into publish preflight
snissn May 5, 2026
03dc17f
db: free serialized root apply allocations on error
snissn May 5, 2026
ad6ebfd
Merge publish preflight cleanup into install guard
snissn May 5, 2026
c59f8f7
Merge install guard cleanup into prepared root metadata
snissn May 5, 2026
4e1cc18
db: invalidate leaf stats after tracked serialized publish
snissn May 5, 2026
bca49c2
Merge install guard cache invalidation into prepared root metadata
snissn May 5, 2026
932ae0b
db: free tracked serialized pages on finalize errors
snissn May 5, 2026
72d9276
Merge finalize cleanup into prepared root metadata
snissn May 5, 2026
5aeac54
db: tighten prepared root edge accounting
snissn May 5, 2026
ebdc48d
db: keep pre-lock optimistic errors out of publish calls
snissn May 5, 2026
635f545
collections: allow no-index insert after staged tombstone
snissn May 5, 2026
5d5abec
db: account for partial parallel prepared roots
snissn May 5, 2026
2874c94
collections: release coalesced no-index tables
snissn May 5, 2026
9d4b83b
zipper: add read-only prepare span discovery
snissn May 5, 2026
8a8e39d
zipper: tighten read-only prepare edge cases
snissn May 5, 2026
52ad2e4
bench: avoid redundant root-delta stat scans
snissn May 5, 2026
e20b5ae
db: route ordered root apply through zipper results
snissn May 5, 2026
7b4bc57
db: preserve apply metrics on publish errors
snissn May 5, 2026
d8210c5
Avoid published snapshot GetAppend probe allocations
snissn May 5, 2026
87bb5d6
bench: preserve raw indexed root-delta stats
snissn May 5, 2026
0193c87
db: preserve allocator apply metrics on errors
snissn May 5, 2026
98245fc
Merge remote-tracking branch 'origin/codex/1242-bench-report-acceptan…
snissn May 5, 2026
58f34d1
Preserve published snapshot append misses
snissn May 5, 2026
d41a941
Arena-copy published GetMany values
snissn May 5, 2026
a4c85dd
Forward unsafe iterator views through wrappers
snissn May 5, 2026
9038934
db: preserve iterator apply metrics on errors
snissn May 5, 2026
466b749
Merge remote-tracking branch 'origin/codex/1242-pr4a-engine-install-g…
snissn May 5, 2026
a55c58d
Merge remote-tracking branch 'origin/codex/1242-pr4a-prepared-root-me…
snissn May 5, 2026
153b3c4
Clarify cached snapshot append source
snissn May 5, 2026
f5f986d
Merge remote-tracking branch 'origin/codex/1242-pr4b-readonly-zipper-…
snissn May 5, 2026
f366108
db: reduce benchmark builder allocations
snissn May 5, 2026
acfc1ae
Merge remote-tracking branch 'origin/codex/1242-pr4a-engine-install-g…
snissn May 5, 2026
f65fbfc
Merge remote-tracking branch 'origin/codex/1242-pr4a-prepared-root-me…
snissn May 5, 2026
0893ea4
Merge remote-tracking branch 'origin/codex/1242-pr4b-readonly-zipper-…
snissn May 5, 2026
7e22901
zipper: fix read-only nested span bounds
snissn May 5, 2026
619f1b4
Merge remote-tracking branch 'origin/codex/1242-pr4b-readonly-zipper-…
snissn May 5, 2026
a618097
db: tighten install guard cleanup tests
snissn May 5, 2026
0e7c871
Merge remote-tracking branch 'origin/codex/1242-pr4a-engine-install-g…
snissn May 5, 2026
99b20ec
Merge remote-tracking branch 'origin/codex/1242-pr4a-prepared-root-me…
snissn May 5, 2026
d1eccca
Merge remote-tracking branch 'origin/codex/1242-pr4b-readonly-zipper-…
snissn May 5, 2026
450920a
db: document apply result error metrics
snissn May 5, 2026
ba659e1
db: add prepared output allocation ownership
snissn May 5, 2026
614372b
db: centralize ordered root apply result handling
snissn May 5, 2026
7c1edb5
Merge remote-tracking branch 'origin/codex/1242-pr4b-ordered-apply-re…
snissn May 5, 2026
27d8271
db: fix optimistic prepared root retry metadata
snissn May 5, 2026
fd58222
Merge remote-tracking branch 'origin/codex/1242-pr4a-prepared-root-me…
snissn May 5, 2026
94a13b1
Tighten published snapshot append misses
snissn May 5, 2026
e25b364
zipper: cover read-only prepare edge cases
snissn May 5, 2026
184e504
Merge remote-tracking branch 'origin/codex/1242-pr4b-readonly-zipper-…
snissn May 5, 2026
d8396fd
Merge branch 'codex/1242-pr4b-ordered-apply-result' of github.com:sni…
snissn May 5, 2026
20770d4
Merge remote-tracking branch 'origin/codex/random-readparallel-alloc-…
snissn May 5, 2026
ce9b163
db: fix prepared output test restack
snissn May 5, 2026
2684dd2
Merge remote-tracking branch 'origin/codex/read-suite-getmany-arena' …
snissn May 5, 2026
f7b5822
db: tighten prepared output tracker states
snissn May 5, 2026
ac11d0d
Align published snapshot miss reads
snissn May 5, 2026
63bbf17
Merge remote-tracking branch 'origin/codex/random-readparallel-alloc-…
snissn May 5, 2026
888fc2f
Merge remote-tracking branch 'origin/codex/read-suite-getmany-arena' …
snissn May 5, 2026
d4f54ef
db: track prepared leaf-log output inventory
snissn May 5, 2026
dbc9de3
db: pass apply options through helper
snissn May 5, 2026
f109f0e
Merge branch 'codex/1242-pr4b-ordered-apply-result' of github.com:sni…
snissn May 5, 2026
b343419
Merge branch 'codex/1242-pr5a-prepared-output-tracker' of github.com:…
snissn May 5, 2026
e7d596e
Preserve published entry read errors
snissn May 5, 2026
7f7010a
Merge remote-tracking branch 'origin/codex/random-readparallel-alloc-…
snissn May 5, 2026
d58f57a
Merge remote-tracking branch 'origin/codex/read-suite-getmany-arena' …
snissn May 5, 2026
bf4e765
db: expose prepared output inventory counters
snissn May 5, 2026
0ede009
db: mark superseded prepared output abandoned
snissn May 5, 2026
3acada4
Merge branch 'codex/1242-pr5b-prepared-side-output' of github.com:sni…
snissn May 5, 2026
5f2e9c8
db: count shared prepared root output once
snissn May 5, 2026
3426441
db: capture final shared prepared output snapshot
snissn May 5, 2026
b93fdf8
Merge remote-tracking branch 'origin/codex/1242-pr5b-prepared-side-ou…
snissn May 5, 2026
092bbcf
db: clarify prepared output pointer counters
snissn May 5, 2026
1f205f2
Add end-to-end GetAppend hit test through installed backend lookup
Copilot May 5, 2026
d370c2b
zipper: validate read-only leaf span plans
snissn May 5, 2026
d11b7db
Strengthen installed backend append test
snissn May 5, 2026
8d746c0
Merge remote-tracking branch 'origin/codex/random-readparallel-alloc-…
snissn May 5, 2026
4acbf4c
Merge remote-tracking branch 'origin/codex/read-suite-getmany-arena' …
snissn May 5, 2026
34000e8
db: count prepared output only for successful roots
snissn May 5, 2026
cebf890
Merge remote-tracking branch 'origin/codex/1242-pr5c-prepared-output-…
snissn May 5, 2026
02432b6
zipper: summarize read-only leaf span plans
snissn May 5, 2026
d012f7e
Align published snapshot entry misses
snissn May 5, 2026
9e9a3ce
Merge remote-tracking branch 'origin/codex/random-readparallel-alloc-…
snissn May 5, 2026
dc04539
Merge remote-tracking branch 'origin/codex/read-suite-getmany-arena' …
snissn May 5, 2026
9eb897d
zipper: partition read-only leaf spans for workers
snissn May 5, 2026
fed2767
zipper: redact read-only span validation keys
snissn May 5, 2026
8881d15
Merge remote-tracking branch 'origin/codex/1242-pr6a-leaf-span-plan' …
snissn May 5, 2026
bffd587
Merge remote-tracking branch 'origin/codex/1242-pr6b-leaf-span-summar…
snissn May 5, 2026
b57cc12
zipper: factor read-only span validation errors
snissn May 5, 2026
c87a16c
Merge remote-tracking branch 'origin/codex/1242-pr6a-leaf-span-plan' …
snissn May 5, 2026
90a1e9c
Merge remote-tracking branch 'origin/codex/1242-pr6b-leaf-span-summar…
snissn May 5, 2026
4a702e7
Tighten published snapshot allocation tests
snissn May 5, 2026
63fa98a
Merge branch 'codex/random-readparallel-alloc-profile' into codex/rea…
snissn May 5, 2026
58605af
Merge branch 'codex/read-suite-getmany-arena' into codex/read-suite-i…
snissn May 5, 2026
f881b46
Strengthen unsafe iterator forwarding test
snissn May 5, 2026
621b9e3
Drop stale snapshot entry wrappers
snissn May 5, 2026
bc8541d
Merge branch 'codex/random-readparallel-alloc-profile' into codex/rea…
snissn May 5, 2026
fc10e37
Merge branch 'codex/read-suite-getmany-arena' into codex/read-suite-i…
snissn May 5, 2026
843b121
db: reduce prepared output counter contention
snissn May 5, 2026
8d3ac73
Clarify GetMany arena capacity comment
snissn May 5, 2026
fbbc082
Merge branch 'codex/read-suite-getmany-arena' into codex/read-suite-i…
snissn May 5, 2026
4004e42
Merge remote-tracking branch 'origin/codex/1242-pr5c-prepared-output-…
snissn May 5, 2026
e9f5af6
Merge remote-tracking branch 'origin/codex/1242-pr6a-leaf-span-plan' …
snissn May 5, 2026
45141cd
Merge remote-tracking branch 'origin/codex/1242-pr6b-leaf-span-summar…
snissn May 5, 2026
11cb67c
zipper: clarify leaf span summary semantics
snissn May 5, 2026
fa4e63e
Merge remote-tracking branch 'origin/codex/1242-pr6b-leaf-span-summar…
snissn May 5, 2026
0e8d257
zipper: tighten leaf span worker partitioning
snissn May 5, 2026
0384ce5
zipper: validate read-only span bounds order
snissn May 5, 2026
60079a1
Merge remote-tracking branch 'origin/codex/1242-pr6a-leaf-span-plan' …
snissn May 5, 2026
1495df3
Merge remote-tracking branch 'origin/codex/1242-pr6b-leaf-span-summar…
snissn May 5, 2026
0efc12c
zipper: tighten leaf span summary benchmark
snissn May 5, 2026
d4b60bd
Merge remote-tracking branch 'origin/codex/1242-pr6b-leaf-span-summar…
snissn May 5, 2026
50dabf5
Preserve Snapshot Has backend fast path
snissn May 5, 2026
3a23a3f
Merge branch 'codex/random-readparallel-alloc-profile' into codex/rea…
snissn May 5, 2026
7c1658e
Merge branch 'codex/read-suite-getmany-arena' into codex/read-suite-i…
snissn May 5, 2026
e9d9ecd
Cache direct published root lookups
snissn May 5, 2026
180ee11
Merge branch 'codex/random-readparallel-alloc-profile' into codex/rea…
snissn May 5, 2026
3fc892b
Merge branch 'codex/read-suite-getmany-arena' into codex/read-suite-i…
snissn May 5, 2026
fac8f71
Document unsafe iterator fallback semantics
snissn May 5, 2026
35140ca
zipper: preserve appended worker ranges on no-op
snissn May 5, 2026
06afde3
treedb: avoid key update lock closure allocations
snissn May 5, 2026
2dfe9fc
Stabilize unsafe iterator wrapper tests
snissn May 5, 2026
08e05b6
zipper: harden leaf span worker range tests
snissn May 5, 2026
edd0d0e
zipper: return optional read-only prepare from apply
snissn May 5, 2026
df0bf87
db: report ordered-root read-only prepare stats
snissn May 5, 2026
73d46f0
zipper: clarify apply read-only prepare tests
snissn May 5, 2026
7e1a482
db: report ordered-root read-only prepare stats
snissn May 5, 2026
d2950de
Merge remote-tracking branch 'origin/codex/1242-pr6e-ordered-readonly…
snissn May 5, 2026
1ae4071
db: count requested read-only prepare stats explicitly
snissn May 5, 2026
83d4fb1
db: reuse ordered read-only prepare buffers
snissn May 5, 2026
1025ad0
db: harden read-only prepare stats accounting
snissn May 5, 2026
73e9e7d
Stabilize async backpressure wait test
snissn May 5, 2026
5d2be71
db: reuse ordered read-only prepare buffers
snissn May 5, 2026
84487a2
Merge remote-tracking branch 'origin/codex/1242-pr6f-ordered-readonly…
snissn May 5, 2026
add3355
db: validate read-only prepare reuse ownership
snissn May 5, 2026
8a3c7f1
db: report read-only prepare worker ranges
snissn May 5, 2026
9112d95
Address iterator fallback review comments
snissn May 5, 2026
b0c9abd
db: clarify read-only prepare reuse validation
snissn May 5, 2026
3cab9e8
db: report read-only prepare worker ranges
snissn May 5, 2026
67e778b
Merge remote-tracking branch 'origin/codex/1242-pr6g-readonly-worker-…
snissn May 5, 2026
a8d015d
db: report read-only prepare worker ranges
snissn May 5, 2026
96f2d8e
db: report read-only prepare worker ranges
snissn May 5, 2026
14b1b97
Clamp async wait metric duration
snissn May 5, 2026
9557d8a
db: preserve requested read-only worker target
snissn May 5, 2026
cb808f7
collections: opt into read-only prepare telemetry
snissn May 5, 2026
1a9af2f
bench: report read-only prepare metrics
snissn May 5, 2026
3a5e3ba
bench: tighten read-only prepare artifact flags
snissn May 5, 2026
febd27f
Merge remote-tracking branch 'origin/codex/1242-pr6h-collection-reado…
snissn May 5, 2026
3290c67
collections: reuse read-only prepare results
snissn May 5, 2026
8d35225
bench: complete read-only prepare report columns
snissn May 5, 2026
f20627d
Merge remote-tracking branch 'origin/codex/1242-pr6i-readonly-prepare…
snissn May 5, 2026
c9df2e4
docs: document read-only prepare benchmark metrics
snissn May 5, 2026
1d9b277
bench: add read-only prepare collection variants
snissn May 5, 2026
2059354
bench: split read-only prepare root apply metrics
snissn May 5, 2026
1973b00
db: pool temporary read-only prepare results
snissn May 5, 2026
81fa18c
db: pool read-only prepare iterator buffers
snissn May 5, 2026
66e66cc
db: bound read-only prepare result pooling
snissn May 5, 2026
ffda47a
zipper: trim read-only prepare reuse buffers
snissn May 5, 2026
1ba46ce
db: cover iterator read-only prepare pooling
snissn May 5, 2026
e430bba
zipper: add multi-leaf read-only prepare benchmark
snissn May 5, 2026
d96b015
zipper: add many-leaf read-only prepare benchmark
snissn May 5, 2026
5d999d1
zipper: add many-leaf warm apply benchmark
snissn May 5, 2026
643b4d3
zipper: clarify read-only prepare reuse benchmarks
snissn May 5, 2026
a35d5cb
Merge remote-tracking branch 'origin/codex/1242-pr6b-leafspan-bench' …
snissn May 5, 2026
0037077
zipper: recycle retired pages in warm apply benchmark
snissn May 5, 2026
15f5d48
zipper: make warm apply benchmark allocator safe
snissn May 5, 2026
9349eeb
zipper: enable sparse parallel internal apply
snissn May 5, 2026
a7ae8b7
zipper: keep sparse parallel gate off leaf-log rewrites
snissn May 5, 2026
a3b5f0f
zipper: cover sparse parallel apply values
snissn May 5, 2026
834e0a3
bench: expose internal parallel apply counters
snissn May 5, 2026
758c049
zipper: cap internal merge worker fan-out
snissn May 5, 2026
a277b11
zipper: pre-grow parallel retired page output
snissn May 5, 2026
3352231
node: reuse internal fence builder scratch
snissn May 5, 2026
4b2a41c
zipper: pool child work buffers by pointer
snissn May 5, 2026
5d183d0
zipper: bypass child work pool for oversized requests
snissn May 5, 2026
26cc8ea
collections: fast-path semantic single-value diffs
snissn May 5, 2026
f78067b
collections: avoid recloning semantic publish value sets
snissn May 5, 2026
972f35c
collections: preserve semantic diff fast-path semantics
snissn May 5, 2026
9a5a789
tmp: aggregate 1242 optimization benchmark branch
snissn May 5, 2026
d3dbd8b
collections: reuse direct primary semantic document IDs
snissn May 5, 2026
0360d9f
Merge remote-tracking branch 'origin/codex/1242-pr3b-semantic-record-…
snissn May 5, 2026
e143230
Merge remote-tracking branch 'origin/codex/perf-keyupdate-lock-alloca…
snissn May 5, 2026
763d96c
Merge branch 'tmp/pr1351-read-suite' into tmp/1242-aggregate-refresh-…
snissn May 5, 2026
adac971
caching: size GetMany copy arena by unique probes
snissn May 5, 2026
804b2df
scratch: include GetMany unique arena sizing
snissn May 5, 2026
d1357ce
collections: avoid cloning immutable semantic checkpoint records
snissn May 5, 2026
9a85723
collections: pack semantic index deltas per batch
snissn May 5, 2026
2e15c96
Merge remote-tracking branch 'origin/codex/1242-pr3b-semantic-delta-a…
snissn May 5, 2026
c33fff8
bench: expose update batch shape measurements
snissn May 5, 2026
77a5384
bench: drill into update batch phase costs
snissn May 5, 2026
38cdffa
bench: add 1242 acceptance shape benchmarks
snissn May 5, 2026
216099a
collections: avoid semantic publish work for noncoalescing batches
snissn May 5, 2026
01c0f05
collections: skip semantic records without index deltas
snissn May 5, 2026
4ecfcac
collections: trim UpdateBatch hot allocations
snissn May 5, 2026
e67c43c
Merge commit '4ecfcacfe1176b6faa7df9028ea24455a5697c0b' into tmp/1242…
snissn May 5, 2026
9a09f2d
bench: allow wider collection shape index sweeps
snissn May 5, 2026
fb5e0f8
bench: profile measured update batch phase
snissn May 5, 2026
6b4a0a4
bench: profile measured update batch allocations
snissn May 5, 2026
f3f8d44
collections: avoid low-fanout insert buffering overhead
snissn May 5, 2026
93573a6
collections: trim update batch staging overhead
snissn May 5, 2026
4897763
collections: avoid duplicate primary index key arenas
snissn May 5, 2026
d03896d
collections: trim update batch allocation hotspots
snissn May 6, 2026
a50679a
collections: compact update batch staging metadata
snissn May 6, 2026
4f7c51c
collections: tighten update batch document arena hint
snissn May 6, 2026
872ad04
bench: measure update combiner batch formation
snissn May 6, 2026
e44f1f6
collections: preserve root delta stats iterator fast paths
snissn May 6, 2026
f9e6e5e
Merge PR #1381 into #1242 aggregate full validation
snissn May 6, 2026
06d2064
Merge PR #1336 current head into #1242 aggregate full validation
snissn May 6, 2026
f064dea
Merge PR #1334 into #1242 aggregate full validation
snissn May 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
210 changes: 156 additions & 54 deletions TreeDB/caching/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -19428,7 +19428,7 @@ func (db *DB) Set(key, value []byte) error {
}
db.waitForCheckpoint()
unlock := db.lockUpdateKey(key)
defer unlock()
defer unlock.Unlock()
return db.set(key, value, false)
}

Expand All @@ -19441,7 +19441,7 @@ func (db *DB) SetSync(key, value []byte) error {
}
db.waitForCheckpoint()
unlock := db.lockUpdateKey(key)
defer unlock()
defer unlock.Unlock()
return db.set(key, value, true)
}

Expand Down Expand Up @@ -19469,7 +19469,7 @@ func (db *DB) update(key []byte, fn backenddb.UpdateFunc, syncWrite bool) error
for {
unlock := db.lockUpdateKey(key)
old, err := db.getForUpdate(key)
unlock()
unlock.Unlock()
if err != nil {
return err
}
Expand All @@ -19489,28 +19489,28 @@ func (db *DB) update(key []byte, fn backenddb.UpdateFunc, syncWrite bool) error
unlock = db.lockUpdateKey(key)
latest, err := db.getForUpdate(key)
if err != nil {
unlock()
unlock.Unlock()
return err
}
if !sameUpdateValue(observed, latest) {
unlock()
unlock.Unlock()
continue
}

switch result.Op {
case backenddb.UpdateNoop:
unlock()
unlock.Unlock()
return nil
case backenddb.UpdateSet:
err = db.set(key, result.Value, syncWrite)
unlock()
unlock.Unlock()
return err
case backenddb.UpdateDelete:
err = db.delete(key, syncWrite)
unlock()
unlock.Unlock()
return err
default:
unlock()
unlock.Unlock()
return fmt.Errorf("treedb: unknown update op %d", result.Op)
}
}
Expand Down Expand Up @@ -19781,7 +19781,7 @@ func (db *DB) Delete(key []byte) error {
}
db.waitForCheckpoint()
unlock := db.lockUpdateKey(key)
defer unlock()
defer unlock.Unlock()
return db.delete(key, false)
}

Expand Down Expand Up @@ -20395,13 +20395,13 @@ func (db *DB) DeleteSync(key []byte) error {
}
db.waitForCheckpoint()
unlock := db.lockUpdateKey(key)
defer unlock()
defer unlock.Unlock()
return db.delete(key, true)
}

func (db *DB) lockUpdateKey(key []byte) func() {
func (db *DB) lockUpdateKey(key []byte) keyupdate.Unlocker {
if db == nil {
return func() {}
return keyupdate.Unlocker{}
}
return db.updateLocks.Lock(key)
}
Expand Down Expand Up @@ -22792,14 +22792,42 @@ type getManyProbeRef struct {
shard int
}

func copyGetManyValueToRefs(out [][]byte, refs []getManyProbeRef, val []byte) {
const (
getManyValueGuessBytes = 128
getManyMaxArenaInitialCapBytes = 1 << 20
)

var getManyEmptyValue = []byte{}

type getManyValueCopyArena struct {
buf []byte
}

func newGetManyValueCopyArena(n int) getManyValueCopyArena {
arenaCap := n * getManyValueGuessBytes
if arenaCap < 0 {
arenaCap = 0
}
if arenaCap > getManyMaxArenaInitialCapBytes {
arenaCap = getManyMaxArenaInitialCapBytes
}
return getManyValueCopyArena{buf: make([]byte, 0, arenaCap)}
}

func (arena *getManyValueCopyArena) copyToRefs(out [][]byte, refs []getManyProbeRef, val []byte) {
if val == nil {
return
}
if len(val) == 0 {
for _, ref := range refs {
out[ref.idx] = getManyEmptyValue
}
return
}
for _, ref := range refs {
cpy := make([]byte, len(val))
copy(cpy, val)
out[ref.idx] = cpy
start := len(arena.buf)
arena.buf = append(arena.buf, val...)
out[ref.idx] = arena.buf[start:len(arena.buf):len(arena.buf)]
}
}

Expand Down Expand Up @@ -22834,6 +22862,7 @@ func (db *DB) getManyFromPublishedRootPointShards(view *memtableView, keys [][]b
db.noteRootDomainGetManyNative(len(keys), len(unique))

results := make([]rootDomainProbeResult, len(unique))
arena := newGetManyValueCopyArena(len(unique))
start := 0
for start < len(unique) {
end := start + 1
Expand All @@ -22849,8 +22878,8 @@ func (db *DB) getManyFromPublishedRootPointShards(view *memtableView, keys [][]b
start = end
}

backendIdx := make([]int, 0, len(unique))
backendKeys := make([][]byte, 0, len(unique))
var backendIdx []int
var backendKeys [][]byte
for i, res := range results {
groupEnd := len(refs)
if i+1 < len(groupStarts) {
Expand All @@ -22859,23 +22888,28 @@ func (db *DB) getManyFromPublishedRootPointShards(view *memtableView, keys [][]b
groupRefs := refs[groupStarts[i]:groupEnd]
switch {
case !res.found:
if backendIdx == nil {
backendCap := len(unique) - i
backendIdx = make([]int, 0, backendCap)
backendKeys = make([][]byte, 0, backendCap)
}
backendIdx = append(backendIdx, i)
backendKeys = append(backendKeys, unique[i].key)
case res.flags&node.FlagTombstone != 0:
case res.flags&node.FlagPointer != 0:
if res.val != nil {
copyGetManyValueToRefs(out, groupRefs, res.val)
arena.copyToRefs(out, groupRefs, res.val)
break
}
readVal, err := db.readValueLog(unique[i].key, res.ptr)
if err != nil {
return nil, err
}
copyGetManyValueToRefs(out, groupRefs, readVal)
arena.copyToRefs(out, groupRefs, readVal)
case res.val == nil:
copyGetManyValueToRefs(out, groupRefs, []byte{})
arena.copyToRefs(out, groupRefs, getManyEmptyValue)
default:
copyGetManyValueToRefs(out, groupRefs, res.val)
arena.copyToRefs(out, groupRefs, res.val)
}
}
if len(backendKeys) > 0 {
Expand All @@ -22892,7 +22926,7 @@ func (db *DB) getManyFromPublishedRootPointShards(view *memtableView, keys [][]b
if uniqueIdx+1 < len(groupStarts) {
groupEnd = groupStarts[uniqueIdx+1]
}
copyGetManyValueToRefs(out, refs[groupStarts[uniqueIdx]:groupEnd], backendVals[i])
arena.copyToRefs(out, refs[groupStarts[uniqueIdx]:groupEnd], backendVals[i])
}
}
return out, nil
Expand Down Expand Up @@ -23149,25 +23183,13 @@ func (db *DB) GetMany(keys [][]byte) ([][]byte, error) {
//
// The cache layer may need to resolve value-log pointers for memtable hits;
// by using the append path, those decodes can write directly into this arena
// instead of allocating per key. The limit below bounds only the initial
// arena capacity; subsequent appends may still grow the backing array, so
// multiple underlying allocations may be retained.
const (
getManyValueGuessBytes = 128
getManyMaxArenaInitialCapBytes = 1 << 20
)
arenaCap := len(keys) * getManyValueGuessBytes
if arenaCap < 0 {
arenaCap = 0
}
if arenaCap > getManyMaxArenaInitialCapBytes {
arenaCap = getManyMaxArenaInitialCapBytes
}
arena := make([]byte, 0, arenaCap)
emptyValue := []byte{}
// instead of allocating per key. newGetManyValueCopyArena caps only the
// initial arena capacity; subsequent appends may still grow the backing
// array, so multiple underlying allocations may be retained.
arena := newGetManyValueCopyArena(len(keys))
for i, key := range keys {
start := len(arena)
nextArena, found, err := db.getMemtableAppend(key, arena)
start := len(arena.buf)
nextArena, found, err := db.getMemtableAppend(key, arena.buf)
if err != nil {
if err == tree.ErrKeyNotFound {
// Tombstone in cache layers: treat as a missing key and do not fall
Expand All @@ -23182,12 +23204,12 @@ func (db *DB) GetMany(keys [][]byte) ([][]byte, error) {
}
}
if found {
arena = nextArena
if len(arena) == start {
out[i] = emptyValue
arena.buf = nextArena
if len(arena.buf) == start {
out[i] = getManyEmptyValue
continue
}
out[i] = arena[start:len(arena):len(arena)]
out[i] = arena.buf[start:len(arena.buf):len(arena.buf)]
continue
}
backendIdx = append(backendIdx, i)
Expand Down Expand Up @@ -25836,19 +25858,75 @@ func (db *DB) Iterator(start, end []byte) (merging.Iterator, error) {

type debugIterator struct {
merging.Iterator
queueLen int
sourcesUsed int
queueLen int
sourcesUsed int
keyScratch []byte
valueScratch []byte
}

type unsafeIteratorView interface {
// UnsafeKey and UnsafeValue return views owned by the iterator and valid
// only until the iterator moves or closes. Wrappers may return safe Key/Value
// copies when the wrapped iterator does not expose unsafe views.
UnsafeKey() []byte
UnsafeValue() []byte
}

func unsafeIteratorViewKey(it merging.Iterator, scratch *[]byte) []byte {
if it == nil {
return nil
}
if u, ok := it.(unsafeIteratorView); ok {
return u.UnsafeKey()
}
if scratch == nil {
return it.Key()
}
*scratch = it.KeyCopy((*scratch)[:0])
return *scratch
}

func unsafeIteratorViewValue(it merging.Iterator, scratch *[]byte) []byte {
if it == nil {
return nil
}
if u, ok := it.(unsafeIteratorView); ok {
return u.UnsafeValue()
}
if scratch == nil {
return it.Value()
}
*scratch = it.ValueCopy((*scratch)[:0])
return *scratch
}

func (it *debugIterator) DebugStats() (queueLen int, sourcesUsed int) {
return it.queueLen, it.sourcesUsed
}

func (it *debugIterator) UnsafeKey() []byte {
return unsafeIteratorViewKey(it.Iterator, &it.keyScratch)
}

func (it *debugIterator) UnsafeValue() []byte {
return unsafeIteratorViewValue(it.Iterator, &it.valueScratch)
}

type leasedMergingIterator struct {
merging.Iterator
closeOnce sync.Once
closeErr error
release func()
closeOnce sync.Once
closeErr error
release func()
keyScratch []byte
valueScratch []byte
}

func (it *leasedMergingIterator) UnsafeKey() []byte {
return unsafeIteratorViewKey(it.Iterator, &it.keyScratch)
}

func (it *leasedMergingIterator) UnsafeValue() []byte {
return unsafeIteratorViewValue(it.Iterator, &it.valueScratch)
}

func (it *leasedMergingIterator) Close() error {
Expand All @@ -25863,9 +25941,19 @@ func (it *leasedMergingIterator) Close() error {

type foregroundTrackedIterator struct {
merging.Iterator
db *DB
closeOnce sync.Once
closeErr error
db *DB
closeOnce sync.Once
closeErr error
keyScratch []byte
valueScratch []byte
}

func (it *foregroundTrackedIterator) UnsafeKey() []byte {
return unsafeIteratorViewKey(it.Iterator, &it.keyScratch)
}

func (it *foregroundTrackedIterator) UnsafeValue() []byte {
return unsafeIteratorViewValue(it.Iterator, &it.valueScratch)
}

func (it *foregroundTrackedIterator) Close() error {
Expand Down Expand Up @@ -25962,6 +26050,20 @@ func (it *concatUnsafeIterator) Value() []byte {
return it.cur.Value()
}

func (it *concatUnsafeIterator) UnsafeKey() []byte {
if !it.valid {
panic("iterator invalid")
}
return it.cur.UnsafeKey()
}

func (it *concatUnsafeIterator) UnsafeValue() []byte {
if !it.valid {
panic("iterator invalid")
}
return it.cur.UnsafeValue()
}

func (it *concatUnsafeIterator) KeyCopy(dst []byte) []byte {
if !it.valid {
panic("iterator invalid")
Expand Down
Loading
Loading