Repository navigation
ltsm: share channel crypto copies between runtimes - #285
Merged
Merged
Conversation
|
No issues found.
All CI checks passed on
Select any unchecked box below to run or rerun that agent. Full resultsIndent Review Agent
|
highesttt
approved these changes
Oct 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Every LINE session keeps a second 16 MiB copy of the LTSM module, and it lasts as long as the process. The channel methods run on that copy so their leaks never reach the real runtime. The copy is created on the first encrypt or decrypt and then held by that runtime forever, even though it's only needed for the length of one call. On cloud bridges, these copies plus the main runtimes were 40–60% of a process's Go heap, held by 3–9% of its sessions.
Each refresh already overwrites the whole copy from its runtime, so the copy doesn't need an owner. This moves the copies into a
sync.Poolshared by all runtimes. A copy is reused without a refresh only if it was last refreshed from the same runtime state, which a generation number now tracks in place ofcryptoDirty. A copy that panics is dropped.Before / after
Harness: 20 runtimes, each with a V1 channel, 200 decrypts per pattern, 5 runs, medians.
The extra ~1 ms only happens when consecutive calls come from different runtimes, because the copy has to be refreshed (one 16 MiB memcpy).
Tag
@indentto continue the conversation here.