Skip to content

fix memory leak in recently closed table - #205

Merged
HoneyryderChuck merged 1 commit into
igrigorik:mainfrom
jcs:main
Sep 9, 2026
Merged

HoneyryderChuck merged 1 commit into
igrigorik:mainfrom
jcs:main

Conversation

@jcs

@jcs jcs commented Sep 6, 2026

Copy link
Copy Markdown

fac31e7 only pruned @streams_recently_closed after checking @oldest_stream_recently_closed which only ever gets set by the very same conditional.

On a busy HTTP-2 client (the same one that ran into #73), it will leak many hundreds of megabytes over a few days.

A simple reproducer:

$LOAD_PATH.unshift(File.dirname(__FILE__) + "/lib/")
require "http/2"

client = HTTP2::Client.new
client.on(:frame) {|bytes| }

100_000.times do
  client.new_stream.close
end

sleep 16
client.new_stream.close

puts "entries in @streams_recently_closed: " \
  "#{client.instance_variable_get(:@streams_recently_closed).size}"

Before this fix:

~/code/http-2$ ruby leak.rb                                       
entries in @streams_recently_closed: 100001

After:

~/code/http-2$ ruby leak.rb 
entries in @streams_recently_closed: 1

fac31e7 only pruned @streams_recently_closed after checking
@oldest_stream_recently_closed which only ever gets set by the very
same conditional.
@HoneyryderChuck

Copy link
Copy Markdown
Collaborator

awesome find 👍

@HoneyryderChuck
HoneyryderChuck merged commit 23337a5 into igrigorik:main Sep 9, 2026
9 of 10 checks passed
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.

2 participants