Skip to content

Commit 99808b1

Browse files
committed
Workaround a GC crash in ObjectSpace::WeakKeyMap
Being investigated at byroot#3 It seems that it's caused by using Thread or Fiber as keys.
1 parent e356c63 commit 99808b1

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -118,26 +118,24 @@ def dirties_query_cache
118118
# * private methods that require being called in a +synchronize+ blocks
119119
# are now explicitly documented
120120
class ConnectionPool
121-
if ObjectSpace.const_defined?(:WeakKeyMap) # RUBY_VERSION >= 3.3
122-
WeakThreadKeyMap = ::ObjectSpace::WeakKeyMap # :nodoc:
123-
else
124-
class WeakThreadKeyMap # :nodoc:
125-
def initialize
126-
@map = {}
127-
end
121+
class WeakThreadKeyMap # :nodoc:
122+
# FIXME: On 3.3 we could use ObjectSpace::WeakKeyMap
123+
# but it currently cause GC crashes: https://github.com/byroot/rails/pull/3
124+
def initialize
125+
@map = {}
126+
end
128127

129-
def clear
130-
@map.clear
131-
end
128+
def clear
129+
@map.clear
130+
end
132131

133-
def [](key)
134-
@map[key]
135-
end
132+
def [](key)
133+
@map[key]
134+
end
136135

137-
def []=(key, value)
138-
@map.select! { |c, _| c.alive? }
139-
@map[key] = value
140-
end
136+
def []=(key, value)
137+
@map.select! { |c, _| c.alive? }
138+
@map[key] = value
141139
end
142140
end
143141

0 commit comments

Comments
 (0)