Skip to content

examples/suspense: buffer the slot channel so producers can't leak#1401

Open
c-tonneslan wants to merge 1 commit into
a-h:mainfrom
c-tonneslan:fix/suspense-example-buffered-channel
Open

examples/suspense: buffer the slot channel so producers can't leak#1401
c-tonneslan wants to merge 1 commit into
a-h:mainfrom
c-tonneslan:fix/suspense-example-buffered-channel

Conversation

@c-tonneslan

Copy link
Copy Markdown

From #1352: the suspense example creates an unbuffered channel for the three deferred slots. Each producer goroutine sends one SlotContents value to it, and the Page template reads them via for sc := range data. If the client disconnects (or templ.WithStreaming() aborts) before the for-range loop has read every value, the producer goroutines block on send forever and the goroutines (plus the templ.Component they captured) stay pinned for the life of the process.

The WaitGroup already states the producer count up front (three slots, wg.Add(3)), so the bound is known. Buffer the channel by 3, then a producer always completes even if no one is reading.

Updated the templ source and the generated main_templ.go; running templ generate again won't change anything else.

Closes #1352.

The example creates an unbuffered channel for the three deferred
slots. If the client disconnects before the page's for-range loop
reads from it, the producer goroutines block on send forever and
the goroutines (plus their captured component data) stay pinned.

The wait group already knows there are exactly three sends, so
buffer the channel by 3. Each goroutine can finish even if no one
reads.

Closes a-h#1352

Signed-off-by: Charlie Tonneslan <cst0520@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unbuffered channel in Suspense example could leak goroutines

1 participant