Skip to content

perf(compression): pool zstd src/dst buffers in stream upload#2804

Closed
ValentaTomas wants to merge 2 commits into
mainfrom
lev-compression-perf-fixes
Closed

perf(compression): pool zstd src/dst buffers in stream upload#2804
ValentaTomas wants to merge 2 commits into
mainfrom
lev-compression-perf-fixes

Conversation

@ValentaTomas
Copy link
Copy Markdown
Member

@ValentaTomas ValentaTomas commented May 22, 2026

Pulls the two pool fixes out of #2803 so the correctness PR can land independently.

  • B6 / O2 Pool the zstd EncodeAll dst buffer; recycle in the part-upload completion goroutine. Audit pprof had it at ~40% of total alloc bytes and ~3% of CPU.
  • O4 Pool the readLoop per-frame source buffer (~32% of total alloc bytes). addFrame now takes a *[]byte + valid length and recycles via defer once the compressor has consumed it.

Local bench (M1 Pro, BenchmarkCompress/w4_unlimited, -benchtime=2s):

  • B/op drops from ~810 MB to ~279 MB (-66%)
  • throughput rises from ~750 MB/s to ~843 MB/s (+13%)

Race tests on the full storage package pass.

Independent of the other compression-audit fixes; can land before or after #2803.


How much further could the pipeline copy be reduced (analysis, not in scope here)

Tracing the full upload path with these fixes applied:

file → srcBuf  →  zstd.EncodeAll(src, dst)  →  dstBuf
                                                  ↓
                                     bytes.NewReader(dst)        no copy (slice wrapper)
                                     io.MultiReader(...)         no copy (reader wrapper)
                                     retryablehttp.ReaderFunc    no copy (replays bytes.Reader)
                                                  ↓
                                     net/http transport          1 copy: bytes.Reader.Read → write buf
                                                  ↓
                                     crypto/tls record encrypt   1 copy, runtime
                                                  ↓
                                     kernel copy_from_user       1 copy, kernel

uploadPartSlices already does the right thing — bytes.NewReader + io.MultiReader are pure wrappers around our dstBuf slices, MD5 is computed in place over each slice, and retryablehttp.ReaderFunc is replayed on retry without buffering. So no extra copy occurs between dstBuf and the http body.

What's left, and whether it's recoverable:

  1. io.ReadFull(in, *buf) in readLoop (kernel page cache → srcBuf). Recoverable via mmap of the source file and passing mmap'd slices into addFrame. Bounded gain: at ~50 GB/s memcpy ceiling, ~80 ms on a 4 GiB memfile vs ~3 s of zstd cost at workers=4. Plus extra lifetime/munmap plumbing (mmap regions can't go in sync.Pool). Not worth it given current zstd-bound numbers.
  2. zstd.EncodeAll src → dst. This is the compression itself, not a "copy". The streaming alternative zstd.Writer could pipe directly into an io.Pipe reader serving as the HTTP body, eliminating dstBuf, but:
    • a multipart part contains multiple frames concatenated, and frame workers finish out of order;
    • to stream you'd either serialize frame compression per part (kills frameEncodeWorkers parallelism, ~4× slower at workers=4) or stage frames somewhere — i.e. the dstBuf you just removed.
    • One-frame-per-PUT removes the staging but trades it for thousands of small HTTPS round-trips instead of ~16 parallel multipart parts; net throughput is meaningfully worse.
  3. bytes.Reader.Read → http transport write buffer. Could be avoided with a custom RoundTripper using net.Buffers.WriteTo (writev(2)), but crypto/tls.Conn.Write reads the body in chunks regardless because each chunk is encrypted into a TLS record — the gain over HTTPS rounds back to zero.
  4. TLS encrypt + copy_from_user. Owned by Go runtime / kernel.

Net: after B6 + O4, the only user-space copy that's both recoverable and architecturally simple is the kernel→srcBuf one (option 1), and it's tiny. True zero-copy would require giving up either multipart amortization or frame-level parallelism — both make the pipeline slower, not faster.

zstdCompressor.compress allocated make([]byte, 0, len(src)) per frame
(2 MiB at default config) which survived until the part upload
completed; nothing recycled it. Drove ~40% of total alloc bytes and
~3% of CPU per the compression-audit pprof. Pull dst from a sync.Pool
sized at the requested frame width and recycle in the part-upload
completion goroutine, after UploadPart returns (retryablehttp replays
happen inside client.Do, which returns before UploadPart, so recycling
is safe).
readLoop allocated make([]byte, frameSize) per frame, ~32% of total
alloc bytes per the compression-audit pprof. Pull source buffers from a
sync.Pool sized at frame width and recycle inside addFrame's goroutine
once the compressor has consumed the bytes (defer Put runs on success
and error paths). Couples cleanly with the B6 dst pool — both add the
same coordination idiom.
@cla-bot cla-bot Bot added the cla-signed label May 22, 2026
@cursor
Copy link
Copy Markdown

cursor Bot commented May 22, 2026

PR Summary

Medium Risk
Changes buffer ownership and lifetime across concurrent compression/upload goroutines; incorrect recycling could cause data corruption or races if any code retains slices longer than expected. Risk is contained to the compression/upload path but is concurrency-sensitive.

Overview
This change reduces allocation pressure in compressStream by pooling the per-frame read buffer and reusing it across frames, with recycling moved into the compression goroutine after the encoder consumes the data.

It also pools the zstd EncodeAll destination buffer and explicitly returns compressed frame buffers to the pool after each part upload completes, clearing frame.compressed to avoid accidental reuse.

Reviewed by Cursor Bugbot for commit 7923cc2. Bugbot is set up for automated code reviews on this repo. Configure here.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 22, 2026

❌ 4 Tests Failed:

Tests completed Failed Passed Skipped
2708 4 2704 7
View the full list of 4 ❄️ flaky test(s)
github.com/e2b-dev/infra/tests/integration/internal/tests/api/sandboxes::TestSnapshotTemplateCreateSandbox

Flake rate in main: 47.34% (Passed 535 times, Failed 481 times)

Stack Traces | 0s run time
=== RUN   TestSnapshotTemplateCreateSandbox
=== PAUSE TestSnapshotTemplateCreateSandbox
=== CONT  TestSnapshotTemplateCreateSandbox
--- FAIL: TestSnapshotTemplateCreateSandbox (0.00s)
github.com/e2b-dev/infra/tests/integration/internal/tests/api/sandboxes::TestSnapshotTemplateCreateSandbox/overwritten_snapshot_build_is_served_immediately_on_sandbox_create

Flake rate in main: 47.29% (Passed 535 times, Failed 480 times)

Stack Traces | 16.7s run time
=== RUN   TestSnapshotTemplateCreateSandbox/overwritten_snapshot_build_is_served_immediately_on_sandbox_create
=== PAUSE TestSnapshotTemplateCreateSandbox/overwritten_snapshot_build_is_served_immediately_on_sandbox_create
=== CONT  TestSnapshotTemplateCreateSandbox/overwritten_snapshot_build_is_served_immediately_on_sandbox_create
    snapshot_template_test.go:283: 
        	Error Trace:	.../api/sandboxes/snapshot_template_test.go:37
        	            				.../api/sandboxes/snapshot_template_test.go:283
        	Error:      	Not equal: 
        	            	expected: 201
        	            	actual  : 500
        	Test:       	TestSnapshotTemplateCreateSandbox/overwritten_snapshot_build_is_served_immediately_on_sandbox_create
--- FAIL: TestSnapshotTemplateCreateSandbox/overwritten_snapshot_build_is_served_immediately_on_sandbox_create (16.68s)
github.com/e2b-dev/infra/tests/integration/internal/tests/orchestrator::TestSandboxMemoryIntegrity

Flake rate in main: 60.87% (Passed 540 times, Failed 840 times)

Stack Traces | 80.4s run time
=== RUN   TestSandboxMemoryIntegrity
=== PAUSE TestSandboxMemoryIntegrity
=== CONT  TestSandboxMemoryIntegrity
    sandbox_memory_integrity_test.go:27: Build completed successfully
--- FAIL: TestSandboxMemoryIntegrity (80.36s)
github.com/e2b-dev/infra/tests/integration/internal/tests/orchestrator::TestSandboxMemoryIntegrity/tmpfs_hash

Flake rate in main: 61.09% (Passed 530 times, Failed 832 times)

Stack Traces | 125s run time
=== RUN   TestSandboxMemoryIntegrity/tmpfs_hash
=== PAUSE TestSandboxMemoryIntegrity/tmpfs_hash
=== CONT  TestSandboxMemoryIntegrity/tmpfs_hash
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{start:{pid:1259}}
Executing command bash in sandbox i89ku323kwd5gp7vde4r3 (user: root)
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stdout:"Total memory: 985 MB\nUsed memory before tmpfs mount: 191 MB\nFree memory before tmpfs mount: 793 MB\nMemory to use in integrity test (80% of free, min 64MB): 634 MB\n"}}
Executing command bash in sandbox i89ku323kwd5gp7vde4r3 (user: root)
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"634+0 records in\n634+0 records out\n664797184 bytes (665 MB, 634 MiB) copied, 14.0566 s, 47.3 MB/s\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"\t"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"C"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"o"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"m"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"m"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"a"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"d"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:" "}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"b"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"e"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"i"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"g"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:" "}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"t"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"i"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"m"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"e"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"d"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:":"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:" "}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"\""}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"dd"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:" "}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"if=/dev/urandom"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:" "}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"of=/mnt/testfile"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:" "}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"bs=1M"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:" "}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"count=634"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"\""}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"\t"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"U"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"s"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"e"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"r"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:" "}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"t"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"i"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"m"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"e (seconds): 0.01\n\tSystem time (seconds): 13.83\n\tPercent of CPU this job got: 98%\n\tElapsed (wall clock) time (h:mm:ss or m:ss): 0:14.11\n\tAverage shared text size (kbytes): 0\n\tAverage unshared data size (kbytes): 0\n\tAverage stack size (kbytes): 0\n\tAverage total size (kbytes): 0\n\tMaximum resident set size"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:" "}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"("}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"k"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"b"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"y"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"t"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"e"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"s"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:")"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:":"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:" "}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"2644"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"\t"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"A"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"v"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"e"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"r"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"a"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"g"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"e"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:" "}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stdout:"Used memory after tmpfs mount and file fill: 832 MB\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{data:{stderr:"resident set size (kbytes): 0\n\tMajor (requiring I/O) page faults: 3\n\tMinor (reclaiming a frame) page faults: 342\n\tVoluntary context switches: 4\n\tInvoluntary context switches: 69\n\tSwaps: 0\n\tFile system inputs: 176\n\tFile system outputs: 0\n\tSocket messages sent: 0\n\tSocket messages received: 0\n\tSignals delivered: 0\n\tPage size (bytes): 4096\n\tExit status: 0\n"}}
    sandbox_memory_integrity_test.go:70: Command [bash] output: event:{end:{exited:true status:"exit status 0"}}
    sandbox_memory_integrity_test.go:70: Command [bash] completed successfully in sandbox iensv2rb9k1qqh9bh70kp
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
    sandbox_memory_integrity_test.go:80: Command [bash] output: event:{start:{pid:1275}}
    sandbox_memory_integrity_test.go:80: Command [bash] output: event:{data:{stdout:"dedd45d74173873f83054e433ef68645e1af1a3bdbeca3c7831ee45221fda1df\n"}}
    sandbox_memory_integrity_test.go:80: Command [bash] output: event:{end:{exited:true status:"exit status 0"}}
    sandbox_memory_integrity_test.go:80: Command [bash] completed successfully in sandbox iensv2rb9k1qqh9bh70kp
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
    sandbox_memory_integrity_test.go:80: Command [bash] output: event:{start:{pid:1278}}
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
Executing command bash in sandbox iensv2rb9k1qqh9bh70kp (user: root)
    sandbox_memory_integrity_test.go:110: 
        	Error Trace:	.../tests/orchestrator/sandbox_memory_integrity_test.go:81
        	            				.../hostedtoolcache/go/1.26.3.../src/runtime/asm_amd64.s:1771
        	Error:      	Received unexpected error:
        	            	failed to execute command bash in sandbox iensv2rb9k1qqh9bh70kp: unavailable: HTTP status 502 Bad Gateway
    sandbox_memory_integrity_test.go:110: 
        	Error Trace:	.../tests/orchestrator/sandbox_memory_integrity_test.go:78
        	            				.../tests/orchestrator/sandbox_memory_integrity_test.go:110
        	Error:      	Condition never satisfied
        	Test:       	TestSandboxMemoryIntegrity/tmpfs_hash
--- FAIL: TestSandboxMemoryIntegrity/tmpfs_hash (125.02s)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

The putDstBuf function incorrectly stores the address of a local slice header in the sync.Pool, which leads to memory corruption because the stack pointer becomes invalid once the function returns. The pool should store the slice directly to ensure proper reuse and memory safety.

Comment on lines +46 to +69
// dstBufPool holds frame-sized scratch buffers reused for zstd EncodeAll dst.
// Caller recycles via putDstBuf after the part upload completes.
var dstBufPool = sync.Pool{
New: func() any {
b := make([]byte, 0)
return &b
},
}

func getDstBuf(want int) []byte {
b := dstBufPool.Get().(*[]byte)
if cap(*b) < want {
*b = make([]byte, 0, want)
}
return (*b)[:0]
}

func putDstBuf(b []byte) {
if cap(b) == 0 {
return
}
b = b[:0]
dstBufPool.Put(&b)
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

critical

The putDstBuf function incorrectly stores the address of its local parameter b in the sync.Pool. Since b is a slice header passed by value, &b points to the stack, which becomes invalid once the function returns, leading to memory corruption when the pointer is later retrieved from the pool. Additionally, getDstBuf returns the slice by value, losing the association with the pointer retrieved from the pool and preventing proper reuse. To fix this correctly while adhering to the compressor interface, the pool should store []byte directly instead of *[]byte.

// dstBufPool holds frame-sized scratch buffers reused for zstd EncodeAll dst.
// Caller recycles via putDstBuf after the part upload completes.
var dstBufPool = sync.Pool{
	New: func() any {
		return make([]byte, 0)
	},
}

func getDstBuf(want int) []byte {
	b, _ := dstBufPool.Get().([]byte)
	if cap(b) < want {
		b = make([]byte, 0, want)
	}
	return b[:0]
}

func putDstBuf(b []byte) {
	if cap(b) == 0 {
		return
	}
	dstBufPool.Put(b[:0])
}

@ValentaTomas
Copy link
Copy Markdown
Member Author

Closing for now—originally opened to illustrate the necessary changes for reference.

@ValentaTomas ValentaTomas deleted the lev-compression-perf-fixes branch May 26, 2026 01:07
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.

1 participant