trace_location 0.9.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/.travis.yml +8 -2
- data/Gemfile.lock +4 -8
- data/README.md +43 -316
- data/examples/active_record_establish_connection/result.csv +265 -0
- data/examples/active_record_establish_connection/result.log +271 -0
- data/examples/active_record_establish_connection/result.md +2279 -0
- data/examples/active_record_validation_process/result.csv +11 -0
- data/examples/active_record_validation_process/result.log +17 -0
- data/examples/active_record_validation_process/result.md +69 -0
- data/examples/has_secure_password/result.csv +41 -0
- data/examples/has_secure_password/result.log +47 -0
- data/examples/has_secure_password/result.md +395 -0
- data/examples/lifecycle_of_rails_application/result.csv +2769 -0
- data/examples/lifecycle_of_rails_application/result.log +2775 -0
- data/examples/lifecycle_of_rails_application/result.md +21437 -0
- data/examples/rendering_process/result.csv +617 -0
- data/examples/rendering_process/result.log +623 -0
- data/examples/rendering_process/result.md +4414 -0
- data/lib/trace_location.rb +2 -1
- data/lib/trace_location/collector.rb +19 -10
- data/lib/trace_location/config.rb +3 -3
- data/lib/trace_location/generator/csv.rb +12 -2
- data/lib/trace_location/generator/log.rb +6 -7
- data/lib/trace_location/generator/markdown.rb +5 -4
- data/lib/trace_location/report.rb +1 -0
- data/lib/trace_location/version.rb +1 -1
- data/trace_location.gemspec +3 -4
- metadata +21 -19
- data/CHANGELOG.md +0 -19
@@ -0,0 +1,2279 @@
|
|
1
|
+
Generated by [trace_location](https://github.com/yhirano55/trace_location) at 2019-06-08 01:09:55 +0900
|
2
|
+
|
3
|
+
<details open>
|
4
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_handling.rb:49</summary>
|
5
|
+
|
6
|
+
##### ActiveRecord::ConnectionHandling.establish_connection
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
def establish_connection(config = nil)
|
10
|
+
raise "Anonymous class is not allowed." unless name
|
11
|
+
|
12
|
+
config ||= DEFAULT_ENV.call.to_sym
|
13
|
+
spec_name = self == Base ? "primary" : name
|
14
|
+
self.connection_specification_name = spec_name
|
15
|
+
|
16
|
+
resolver = ConnectionAdapters::ConnectionSpecification::Resolver.new(Base.configurations)
|
17
|
+
spec = resolver.resolve(config).symbolize_keys
|
18
|
+
spec[:name] = spec_name
|
19
|
+
|
20
|
+
connection_handler.establish_connection(spec)
|
21
|
+
end
|
22
|
+
# called from (irb):4
|
23
|
+
```
|
24
|
+
</details>
|
25
|
+
<details open>
|
26
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/core.rb:59</summary>
|
27
|
+
|
28
|
+
##### ActiveRecord::Base.configurations
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
def self.configurations
|
32
|
+
@@configurations
|
33
|
+
end
|
34
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_handling.rb:56
|
35
|
+
```
|
36
|
+
</details>
|
37
|
+
<details open>
|
38
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:121</summary>
|
39
|
+
|
40
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver#initialize
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
def initialize(configurations)
|
44
|
+
@configurations = configurations
|
45
|
+
end
|
46
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_handling.rb:56
|
47
|
+
```
|
48
|
+
</details>
|
49
|
+
<details open>
|
50
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:141</summary>
|
51
|
+
|
52
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver#resolve
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
def resolve(config)
|
56
|
+
if config
|
57
|
+
resolve_connection config
|
58
|
+
elsif env = ActiveRecord::ConnectionHandling::RAILS_ENV.call
|
59
|
+
resolve_symbol_connection env.to_sym
|
60
|
+
else
|
61
|
+
raise AdapterNotSpecified
|
62
|
+
end
|
63
|
+
end
|
64
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_handling.rb:57
|
65
|
+
```
|
66
|
+
</details>
|
67
|
+
<details open>
|
68
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:238</summary>
|
69
|
+
|
70
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver#resolve_connection
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
def resolve_connection(spec)
|
74
|
+
case spec
|
75
|
+
when Symbol
|
76
|
+
resolve_symbol_connection spec
|
77
|
+
when String
|
78
|
+
resolve_url_connection spec
|
79
|
+
when Hash
|
80
|
+
resolve_hash_connection spec
|
81
|
+
end
|
82
|
+
end
|
83
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:143
|
84
|
+
```
|
85
|
+
</details>
|
86
|
+
<details open>
|
87
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:268</summary>
|
88
|
+
|
89
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver#resolve_hash_connection
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
def resolve_hash_connection(spec)
|
93
|
+
if spec["url"] && spec["url"] !~ /^jdbc:/
|
94
|
+
connection_hash = resolve_url_connection(spec.delete("url"))
|
95
|
+
spec.merge!(connection_hash)
|
96
|
+
end
|
97
|
+
spec
|
98
|
+
end
|
99
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:245
|
100
|
+
```
|
101
|
+
</details>
|
102
|
+
<details open>
|
103
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/hash/keys.rb:56</summary>
|
104
|
+
|
105
|
+
##### Hash#symbolize_keys
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
def symbolize_keys
|
109
|
+
transform_keys { |key| key.to_sym rescue key }
|
110
|
+
end
|
111
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_handling.rb:57
|
112
|
+
```
|
113
|
+
</details>
|
114
|
+
<details open>
|
115
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/core.rb:130</summary>
|
116
|
+
|
117
|
+
##### ActiveRecord::Base.connection_handler
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
def self.connection_handler
|
121
|
+
ActiveRecord::RuntimeRegistry.connection_handler || default_connection_handler
|
122
|
+
end
|
123
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_handling.rb:60
|
124
|
+
```
|
125
|
+
</details>
|
126
|
+
<details open>
|
127
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/runtime_registry.rb:20</summary>
|
128
|
+
|
129
|
+
##### ActiveRecord::RuntimeRegistry.connection_handler
|
130
|
+
|
131
|
+
```ruby
|
132
|
+
class_eval %{ def self.#{val}; instance.#{val}; end }, __FILE__, __LINE__
|
133
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/core.rb:131
|
134
|
+
```
|
135
|
+
</details>
|
136
|
+
<details open>
|
137
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/per_thread_registry.rb:46</summary>
|
138
|
+
|
139
|
+
##### ActiveSupport::PerThreadRegistry.instance
|
140
|
+
|
141
|
+
```ruby
|
142
|
+
def instance
|
143
|
+
Thread.current[@per_thread_registry_key] ||= new
|
144
|
+
end
|
145
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/runtime_registry.rb:20
|
146
|
+
```
|
147
|
+
</details>
|
148
|
+
<details open>
|
149
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/class/attribute.rb:106</summary>
|
150
|
+
|
151
|
+
##### ActiveRecord::Base.default_connection_handler
|
152
|
+
|
153
|
+
```ruby
|
154
|
+
redefine_method(name) { val }
|
155
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/core.rb:131
|
156
|
+
```
|
157
|
+
</details>
|
158
|
+
<details open>
|
159
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:954</summary>
|
160
|
+
|
161
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionHandler#establish_connection
|
162
|
+
|
163
|
+
```ruby
|
164
|
+
def establish_connection(config)
|
165
|
+
resolver = ConnectionSpecification::Resolver.new(Base.configurations)
|
166
|
+
spec = resolver.spec(config)
|
167
|
+
|
168
|
+
remove_connection(spec.name)
|
169
|
+
|
170
|
+
message_bus = ActiveSupport::Notifications.instrumenter
|
171
|
+
payload = {
|
172
|
+
connection_id: object_id
|
173
|
+
}
|
174
|
+
if spec
|
175
|
+
payload[:spec_name] = spec.name
|
176
|
+
payload[:config] = spec.config
|
177
|
+
end
|
178
|
+
|
179
|
+
message_bus.instrument("!connection.active_record", payload) do
|
180
|
+
owner_to_pool[spec.name] = ConnectionAdapters::ConnectionPool.new(spec)
|
181
|
+
end
|
182
|
+
|
183
|
+
owner_to_pool[spec.name]
|
184
|
+
end
|
185
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_handling.rb:60
|
186
|
+
```
|
187
|
+
</details>
|
188
|
+
<details open>
|
189
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/core.rb:59</summary>
|
190
|
+
|
191
|
+
##### ActiveRecord::Base.configurations
|
192
|
+
|
193
|
+
```ruby
|
194
|
+
def self.configurations
|
195
|
+
@@configurations
|
196
|
+
end
|
197
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:955
|
198
|
+
```
|
199
|
+
</details>
|
200
|
+
<details open>
|
201
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:121</summary>
|
202
|
+
|
203
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver#initialize
|
204
|
+
|
205
|
+
```ruby
|
206
|
+
def initialize(configurations)
|
207
|
+
@configurations = configurations
|
208
|
+
end
|
209
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:955
|
210
|
+
```
|
211
|
+
</details>
|
212
|
+
<details open>
|
213
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:181</summary>
|
214
|
+
|
215
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver#spec
|
216
|
+
|
217
|
+
```ruby
|
218
|
+
def spec(config)
|
219
|
+
spec = resolve(config).symbolize_keys
|
220
|
+
|
221
|
+
raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)
|
222
|
+
|
223
|
+
# Require the adapter itself and give useful feedback about
|
224
|
+
# 1. Missing adapter gems and
|
225
|
+
# 2. Adapter gems' missing dependencies.
|
226
|
+
path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter"
|
227
|
+
begin
|
228
|
+
require path_to_adapter
|
229
|
+
rescue LoadError => e
|
230
|
+
# We couldn't require the adapter itself. Raise an exception that
|
231
|
+
# points out config typos and missing gems.
|
232
|
+
if e.path == path_to_adapter
|
233
|
+
# We can assume that a non-builtin adapter was specified, so it's
|
234
|
+
# either misspelled or missing from Gemfile.
|
235
|
+
raise LoadError, "Could not load the '#{spec[:adapter]}' Active Record adapter. Ensure that the adapter is spelled correctly in config/database.yml and that you've added the necessary adapter gem to your Gemfile.", e.backtrace
|
236
|
+
|
237
|
+
# Bubbled up from the adapter require. Prefix the exception message
|
238
|
+
# with some guidance about how to address it and reraise.
|
239
|
+
else
|
240
|
+
raise LoadError, "Error loading the '#{spec[:adapter]}' Active Record adapter. Missing a gem it depends on? #{e.message}", e.backtrace
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
adapter_method = "#{spec[:adapter]}_connection"
|
245
|
+
|
246
|
+
unless ActiveRecord::Base.respond_to?(adapter_method)
|
247
|
+
raise AdapterNotFound, "database configuration specifies nonexistent #{spec.config[:adapter]} adapter"
|
248
|
+
end
|
249
|
+
|
250
|
+
ConnectionSpecification.new(spec.delete(:name) || "primary", spec, adapter_method)
|
251
|
+
end
|
252
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:956
|
253
|
+
```
|
254
|
+
</details>
|
255
|
+
<details open>
|
256
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:141</summary>
|
257
|
+
|
258
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver#resolve
|
259
|
+
|
260
|
+
```ruby
|
261
|
+
def resolve(config)
|
262
|
+
if config
|
263
|
+
resolve_connection config
|
264
|
+
elsif env = ActiveRecord::ConnectionHandling::RAILS_ENV.call
|
265
|
+
resolve_symbol_connection env.to_sym
|
266
|
+
else
|
267
|
+
raise AdapterNotSpecified
|
268
|
+
end
|
269
|
+
end
|
270
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:182
|
271
|
+
```
|
272
|
+
</details>
|
273
|
+
<details open>
|
274
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:238</summary>
|
275
|
+
|
276
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver#resolve_connection
|
277
|
+
|
278
|
+
```ruby
|
279
|
+
def resolve_connection(spec)
|
280
|
+
case spec
|
281
|
+
when Symbol
|
282
|
+
resolve_symbol_connection spec
|
283
|
+
when String
|
284
|
+
resolve_url_connection spec
|
285
|
+
when Hash
|
286
|
+
resolve_hash_connection spec
|
287
|
+
end
|
288
|
+
end
|
289
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:143
|
290
|
+
```
|
291
|
+
</details>
|
292
|
+
<details open>
|
293
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:268</summary>
|
294
|
+
|
295
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver#resolve_hash_connection
|
296
|
+
|
297
|
+
```ruby
|
298
|
+
def resolve_hash_connection(spec)
|
299
|
+
if spec["url"] && spec["url"] !~ /^jdbc:/
|
300
|
+
connection_hash = resolve_url_connection(spec.delete("url"))
|
301
|
+
spec.merge!(connection_hash)
|
302
|
+
end
|
303
|
+
spec
|
304
|
+
end
|
305
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:245
|
306
|
+
```
|
307
|
+
</details>
|
308
|
+
<details open>
|
309
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/hash/keys.rb:56</summary>
|
310
|
+
|
311
|
+
##### Hash#symbolize_keys
|
312
|
+
|
313
|
+
```ruby
|
314
|
+
def symbolize_keys
|
315
|
+
transform_keys { |key| key.to_sym rescue key }
|
316
|
+
end
|
317
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:182
|
318
|
+
```
|
319
|
+
</details>
|
320
|
+
<details open>
|
321
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:289</summary>
|
322
|
+
|
323
|
+
##### ActiveSupport::Dependencies::Loadable#require
|
324
|
+
|
325
|
+
```ruby
|
326
|
+
def require(file)
|
327
|
+
result = false
|
328
|
+
load_dependency(file) { result = super }
|
329
|
+
result
|
330
|
+
end
|
331
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:191
|
332
|
+
```
|
333
|
+
</details>
|
334
|
+
<details open>
|
335
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:251</summary>
|
336
|
+
|
337
|
+
##### ActiveSupport::Dependencies::Loadable#load_dependency
|
338
|
+
|
339
|
+
```ruby
|
340
|
+
def load_dependency(file)
|
341
|
+
if Dependencies.load? && Dependencies.constant_watch_stack.watching?
|
342
|
+
descs = Dependencies.constant_watch_stack.watching.flatten.uniq
|
343
|
+
|
344
|
+
Dependencies.new_constants_in(*descs) { yield }
|
345
|
+
else
|
346
|
+
yield
|
347
|
+
end
|
348
|
+
rescue Exception => exception # errors from loading file
|
349
|
+
exception.blame_file! file if exception.respond_to? :blame_file!
|
350
|
+
raise
|
351
|
+
end
|
352
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:291
|
353
|
+
```
|
354
|
+
</details>
|
355
|
+
<details open>
|
356
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:328</summary>
|
357
|
+
|
358
|
+
##### ActiveSupport::Dependencies.load?
|
359
|
+
|
360
|
+
```ruby
|
361
|
+
def load?
|
362
|
+
mechanism == :load
|
363
|
+
end
|
364
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:252
|
365
|
+
```
|
366
|
+
</details>
|
367
|
+
<details open>
|
368
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/module/attribute_accessors.rb:60</summary>
|
369
|
+
|
370
|
+
##### ActiveSupport::Dependencies.mechanism
|
371
|
+
|
372
|
+
```ruby
|
373
|
+
def self.#{sym}
|
374
|
+
@@#{sym}
|
375
|
+
end
|
376
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:329
|
377
|
+
```
|
378
|
+
</details>
|
379
|
+
<details open>
|
380
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/module/attribute_accessors.rb:60</summary>
|
381
|
+
|
382
|
+
##### ActiveSupport::Dependencies.constant_watch_stack
|
383
|
+
|
384
|
+
```ruby
|
385
|
+
def self.#{sym}
|
386
|
+
@@#{sym}
|
387
|
+
end
|
388
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:252
|
389
|
+
```
|
390
|
+
</details>
|
391
|
+
<details open>
|
392
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:111</summary>
|
393
|
+
|
394
|
+
##### ActiveSupport::Dependencies::WatchStack#watching?
|
395
|
+
|
396
|
+
```ruby
|
397
|
+
def watching?
|
398
|
+
!@watching.empty?
|
399
|
+
end
|
400
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:252
|
401
|
+
```
|
402
|
+
</details>
|
403
|
+
<details open>
|
404
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:10</summary>
|
405
|
+
|
406
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionSpecification#initialize
|
407
|
+
|
408
|
+
```ruby
|
409
|
+
def initialize(name, config, adapter_method)
|
410
|
+
@name, @config, @adapter_method = name, config, adapter_method
|
411
|
+
end
|
412
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/connection_specification.rb:213
|
413
|
+
```
|
414
|
+
</details>
|
415
|
+
<details open>
|
416
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1028</summary>
|
417
|
+
|
418
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionHandler#remove_connection
|
419
|
+
|
420
|
+
```ruby
|
421
|
+
def remove_connection(spec_name)
|
422
|
+
if pool = owner_to_pool.delete(spec_name)
|
423
|
+
pool.automatic_reconnect = false
|
424
|
+
pool.disconnect!
|
425
|
+
pool.spec.config
|
426
|
+
end
|
427
|
+
end
|
428
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:958
|
429
|
+
```
|
430
|
+
</details>
|
431
|
+
<details open>
|
432
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1058</summary>
|
433
|
+
|
434
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionHandler#owner_to_pool
|
435
|
+
|
436
|
+
```ruby
|
437
|
+
def owner_to_pool
|
438
|
+
@owner_to_pool[Process.pid]
|
439
|
+
end
|
440
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1029
|
441
|
+
```
|
442
|
+
</details>
|
443
|
+
<details open>
|
444
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:132</summary>
|
445
|
+
|
446
|
+
##### Concurrent::Map#[]
|
447
|
+
|
448
|
+
```ruby
|
449
|
+
def [](key)
|
450
|
+
if value = super # non-falsy value is an existing mapping, return it right away
|
451
|
+
value
|
452
|
+
# re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call
|
453
|
+
# a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value
|
454
|
+
# would be returned)
|
455
|
+
# note: nil == value check is not technically necessary
|
456
|
+
elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL))
|
457
|
+
@default_proc.call(self, key)
|
458
|
+
else
|
459
|
+
value
|
460
|
+
end
|
461
|
+
end
|
462
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1059
|
463
|
+
```
|
464
|
+
</details>
|
465
|
+
<details open>
|
466
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb:19</summary>
|
467
|
+
|
468
|
+
##### Concurrent::Map#[]
|
469
|
+
|
470
|
+
```ruby
|
471
|
+
def [](key)
|
472
|
+
if value = super # non-falsy value is an existing mapping, return it right away
|
473
|
+
value
|
474
|
+
# re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call
|
475
|
+
# a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value
|
476
|
+
# would be returned)
|
477
|
+
# note: nil == value check is not technically necessary
|
478
|
+
elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL))
|
479
|
+
@default_proc.call(self, key)
|
480
|
+
else
|
481
|
+
value
|
482
|
+
end
|
483
|
+
end
|
484
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:133
|
485
|
+
```
|
486
|
+
</details>
|
487
|
+
<details open>
|
488
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/mri_map_backend.rb:53</summary>
|
489
|
+
|
490
|
+
##### Concurrent::Collection::MriMapBackend#delete
|
491
|
+
|
492
|
+
```ruby
|
493
|
+
def delete(key)
|
494
|
+
@write_lock.synchronize { super }
|
495
|
+
end
|
496
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1029
|
497
|
+
```
|
498
|
+
</details>
|
499
|
+
<details open>
|
500
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb:79</summary>
|
501
|
+
|
502
|
+
##### Concurrent::Collection::MriMapBackend#delete
|
503
|
+
|
504
|
+
```ruby
|
505
|
+
def delete(key)
|
506
|
+
@write_lock.synchronize { super }
|
507
|
+
end
|
508
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/mri_map_backend.rb:54
|
509
|
+
```
|
510
|
+
</details>
|
511
|
+
<details open>
|
512
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:454</summary>
|
513
|
+
|
514
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool#disconnect!
|
515
|
+
|
516
|
+
```ruby
|
517
|
+
def disconnect!
|
518
|
+
disconnect(false)
|
519
|
+
end
|
520
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1031
|
521
|
+
```
|
522
|
+
</details>
|
523
|
+
<details open>
|
524
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:432</summary>
|
525
|
+
|
526
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool#disconnect
|
527
|
+
|
528
|
+
```ruby
|
529
|
+
def disconnect(raise_on_acquisition_timeout = true)
|
530
|
+
with_exclusively_acquired_all_connections(raise_on_acquisition_timeout) do
|
531
|
+
synchronize do
|
532
|
+
@connections.each do |conn|
|
533
|
+
if conn.in_use?
|
534
|
+
conn.steal!
|
535
|
+
checkin conn
|
536
|
+
end
|
537
|
+
conn.disconnect!
|
538
|
+
end
|
539
|
+
@connections = []
|
540
|
+
@available.clear
|
541
|
+
end
|
542
|
+
end
|
543
|
+
end
|
544
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:455
|
545
|
+
```
|
546
|
+
</details>
|
547
|
+
<details open>
|
548
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:675</summary>
|
549
|
+
|
550
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool#with_exclusively_acquired_all_connections
|
551
|
+
|
552
|
+
```ruby
|
553
|
+
def with_exclusively_acquired_all_connections(raise_on_acquisition_timeout = true)
|
554
|
+
with_new_connections_blocked do
|
555
|
+
attempt_to_checkout_all_existing_connections(raise_on_acquisition_timeout)
|
556
|
+
yield
|
557
|
+
end
|
558
|
+
end
|
559
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:433
|
560
|
+
```
|
561
|
+
</details>
|
562
|
+
<details open>
|
563
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:748</summary>
|
564
|
+
|
565
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool#with_new_connections_blocked
|
566
|
+
|
567
|
+
```ruby
|
568
|
+
def with_new_connections_blocked
|
569
|
+
synchronize do
|
570
|
+
@threads_blocking_new_connections += 1
|
571
|
+
end
|
572
|
+
|
573
|
+
yield
|
574
|
+
ensure
|
575
|
+
num_new_conns_required = 0
|
576
|
+
|
577
|
+
synchronize do
|
578
|
+
@threads_blocking_new_connections -= 1
|
579
|
+
|
580
|
+
if @threads_blocking_new_connections.zero?
|
581
|
+
@available.clear
|
582
|
+
|
583
|
+
num_new_conns_required = num_waiting_in_queue
|
584
|
+
|
585
|
+
@connections.each do |conn|
|
586
|
+
next if conn.in_use?
|
587
|
+
|
588
|
+
@available.add conn
|
589
|
+
num_new_conns_required -= 1
|
590
|
+
end
|
591
|
+
end
|
592
|
+
end
|
593
|
+
|
594
|
+
bulk_make_new_connections(num_new_conns_required) if num_new_conns_required > 0
|
595
|
+
end
|
596
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:676
|
597
|
+
```
|
598
|
+
</details>
|
599
|
+
<details open>
|
600
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:227</summary>
|
601
|
+
|
602
|
+
##### MonitorMixin#mon_synchronize
|
603
|
+
|
604
|
+
```ruby
|
605
|
+
def mon_synchronize
|
606
|
+
mon_enter
|
607
|
+
begin
|
608
|
+
yield
|
609
|
+
ensure
|
610
|
+
mon_exit
|
611
|
+
end
|
612
|
+
end
|
613
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:749
|
614
|
+
```
|
615
|
+
</details>
|
616
|
+
<details open>
|
617
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:187</summary>
|
618
|
+
|
619
|
+
##### MonitorMixin#mon_enter
|
620
|
+
|
621
|
+
```ruby
|
622
|
+
def mon_enter
|
623
|
+
if @mon_owner != Thread.current
|
624
|
+
@mon_mutex.lock
|
625
|
+
@mon_owner = Thread.current
|
626
|
+
@mon_count = 0
|
627
|
+
end
|
628
|
+
@mon_count += 1
|
629
|
+
end
|
630
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:228
|
631
|
+
```
|
632
|
+
</details>
|
633
|
+
<details open>
|
634
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:199</summary>
|
635
|
+
|
636
|
+
##### MonitorMixin#mon_exit
|
637
|
+
|
638
|
+
```ruby
|
639
|
+
def mon_exit
|
640
|
+
mon_check_owner
|
641
|
+
@mon_count -=1
|
642
|
+
if @mon_count == 0
|
643
|
+
@mon_owner = nil
|
644
|
+
@mon_mutex.unlock
|
645
|
+
end
|
646
|
+
end
|
647
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:232
|
648
|
+
```
|
649
|
+
</details>
|
650
|
+
<details open>
|
651
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:267</summary>
|
652
|
+
|
653
|
+
##### MonitorMixin#mon_check_owner
|
654
|
+
|
655
|
+
```ruby
|
656
|
+
def mon_check_owner
|
657
|
+
if @mon_owner != Thread.current
|
658
|
+
raise ThreadError, "current thread not owner"
|
659
|
+
end
|
660
|
+
end
|
661
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:200
|
662
|
+
```
|
663
|
+
</details>
|
664
|
+
<details open>
|
665
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:682</summary>
|
666
|
+
|
667
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool#attempt_to_checkout_all_existing_connections
|
668
|
+
|
669
|
+
```ruby
|
670
|
+
def attempt_to_checkout_all_existing_connections(raise_on_acquisition_timeout = true)
|
671
|
+
collected_conns = synchronize do
|
672
|
+
# account for our own connections
|
673
|
+
@connections.select { |conn| conn.owner == Thread.current }
|
674
|
+
end
|
675
|
+
|
676
|
+
newly_checked_out = []
|
677
|
+
timeout_time = Time.now + (@checkout_timeout * 2)
|
678
|
+
|
679
|
+
@available.with_a_bias_for(Thread.current) do
|
680
|
+
loop do
|
681
|
+
synchronize do
|
682
|
+
return if collected_conns.size == @connections.size && @now_connecting == 0
|
683
|
+
remaining_timeout = timeout_time - Time.now
|
684
|
+
remaining_timeout = 0 if remaining_timeout < 0
|
685
|
+
conn = checkout_for_exclusive_access(remaining_timeout)
|
686
|
+
collected_conns << conn
|
687
|
+
newly_checked_out << conn
|
688
|
+
end
|
689
|
+
end
|
690
|
+
end
|
691
|
+
rescue ExclusiveConnectionTimeoutError
|
692
|
+
# <tt>raise_on_acquisition_timeout == false</tt> means we are directed to ignore any
|
693
|
+
# timeouts and are expected to just give up: we've obtained as many connections
|
694
|
+
# as possible, note that in a case like that we don't return any of the
|
695
|
+
# +newly_checked_out+ connections.
|
696
|
+
|
697
|
+
if raise_on_acquisition_timeout
|
698
|
+
release_newly_checked_out = true
|
699
|
+
raise
|
700
|
+
end
|
701
|
+
rescue Exception # if something else went wrong
|
702
|
+
# this can't be a "naked" rescue, because we have should return conns
|
703
|
+
# even for non-StandardErrors
|
704
|
+
release_newly_checked_out = true
|
705
|
+
raise
|
706
|
+
ensure
|
707
|
+
if release_newly_checked_out && newly_checked_out
|
708
|
+
# releasing only those conns that were checked out in this method, conns
|
709
|
+
# checked outside this method (before it was called) are not for us to release
|
710
|
+
newly_checked_out.each { |conn| checkin(conn) }
|
711
|
+
end
|
712
|
+
end
|
713
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:677
|
714
|
+
```
|
715
|
+
</details>
|
716
|
+
<details open>
|
717
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:227</summary>
|
718
|
+
|
719
|
+
##### MonitorMixin#mon_synchronize
|
720
|
+
|
721
|
+
```ruby
|
722
|
+
def mon_synchronize
|
723
|
+
mon_enter
|
724
|
+
begin
|
725
|
+
yield
|
726
|
+
ensure
|
727
|
+
mon_exit
|
728
|
+
end
|
729
|
+
end
|
730
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:683
|
731
|
+
```
|
732
|
+
</details>
|
733
|
+
<details open>
|
734
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:187</summary>
|
735
|
+
|
736
|
+
##### MonitorMixin#mon_enter
|
737
|
+
|
738
|
+
```ruby
|
739
|
+
def mon_enter
|
740
|
+
if @mon_owner != Thread.current
|
741
|
+
@mon_mutex.lock
|
742
|
+
@mon_owner = Thread.current
|
743
|
+
@mon_count = 0
|
744
|
+
end
|
745
|
+
@mon_count += 1
|
746
|
+
end
|
747
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:228
|
748
|
+
```
|
749
|
+
</details>
|
750
|
+
<details open>
|
751
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:199</summary>
|
752
|
+
|
753
|
+
##### MonitorMixin#mon_exit
|
754
|
+
|
755
|
+
```ruby
|
756
|
+
def mon_exit
|
757
|
+
mon_check_owner
|
758
|
+
@mon_count -=1
|
759
|
+
if @mon_count == 0
|
760
|
+
@mon_owner = nil
|
761
|
+
@mon_mutex.unlock
|
762
|
+
end
|
763
|
+
end
|
764
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:232
|
765
|
+
```
|
766
|
+
</details>
|
767
|
+
<details open>
|
768
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:267</summary>
|
769
|
+
|
770
|
+
##### MonitorMixin#mon_check_owner
|
771
|
+
|
772
|
+
```ruby
|
773
|
+
def mon_check_owner
|
774
|
+
if @mon_owner != Thread.current
|
775
|
+
raise ThreadError, "current thread not owner"
|
776
|
+
end
|
777
|
+
end
|
778
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:200
|
779
|
+
```
|
780
|
+
</details>
|
781
|
+
<details open>
|
782
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/time/calculations.rb:261</summary>
|
783
|
+
|
784
|
+
##### Time#plus_with_duration
|
785
|
+
|
786
|
+
```ruby
|
787
|
+
def plus_with_duration(other) #:nodoc:
|
788
|
+
if ActiveSupport::Duration === other
|
789
|
+
other.since(self)
|
790
|
+
else
|
791
|
+
plus_without_duration(other)
|
792
|
+
end
|
793
|
+
end
|
794
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:689
|
795
|
+
```
|
796
|
+
</details>
|
797
|
+
<details open>
|
798
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/duration.rb:144</summary>
|
799
|
+
|
800
|
+
##### ActiveSupport::Duration.===
|
801
|
+
|
802
|
+
```ruby
|
803
|
+
def ===(other) #:nodoc:
|
804
|
+
other.is_a?(Duration)
|
805
|
+
rescue ::NoMethodError
|
806
|
+
false
|
807
|
+
end
|
808
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/core_ext/time/calculations.rb:262
|
809
|
+
```
|
810
|
+
</details>
|
811
|
+
<details open>
|
812
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:251</summary>
|
813
|
+
|
814
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::BiasableQueue#with_a_bias_for
|
815
|
+
|
816
|
+
```ruby
|
817
|
+
def with_a_bias_for(thread)
|
818
|
+
previous_cond = nil
|
819
|
+
new_cond = nil
|
820
|
+
synchronize do
|
821
|
+
previous_cond = @cond
|
822
|
+
@cond = new_cond = BiasedConditionVariable.new(@lock, @cond, thread)
|
823
|
+
end
|
824
|
+
yield
|
825
|
+
ensure
|
826
|
+
synchronize do
|
827
|
+
@cond = previous_cond if previous_cond
|
828
|
+
new_cond.broadcast_on_biased if new_cond # wake up any remaining sleepers
|
829
|
+
end
|
830
|
+
end
|
831
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:691
|
832
|
+
```
|
833
|
+
</details>
|
834
|
+
<details open>
|
835
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:154</summary>
|
836
|
+
|
837
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::Queue#synchronize
|
838
|
+
|
839
|
+
```ruby
|
840
|
+
def synchronize(&block)
|
841
|
+
@lock.synchronize(&block)
|
842
|
+
end
|
843
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:254
|
844
|
+
```
|
845
|
+
</details>
|
846
|
+
<details open>
|
847
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:227</summary>
|
848
|
+
|
849
|
+
##### MonitorMixin#mon_synchronize
|
850
|
+
|
851
|
+
```ruby
|
852
|
+
def mon_synchronize
|
853
|
+
mon_enter
|
854
|
+
begin
|
855
|
+
yield
|
856
|
+
ensure
|
857
|
+
mon_exit
|
858
|
+
end
|
859
|
+
end
|
860
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:155
|
861
|
+
```
|
862
|
+
</details>
|
863
|
+
<details open>
|
864
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:187</summary>
|
865
|
+
|
866
|
+
##### MonitorMixin#mon_enter
|
867
|
+
|
868
|
+
```ruby
|
869
|
+
def mon_enter
|
870
|
+
if @mon_owner != Thread.current
|
871
|
+
@mon_mutex.lock
|
872
|
+
@mon_owner = Thread.current
|
873
|
+
@mon_count = 0
|
874
|
+
end
|
875
|
+
@mon_count += 1
|
876
|
+
end
|
877
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:228
|
878
|
+
```
|
879
|
+
</details>
|
880
|
+
<details open>
|
881
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:215</summary>
|
882
|
+
|
883
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::BiasableQueue::BiasedConditionVariable#initialize
|
884
|
+
|
885
|
+
```ruby
|
886
|
+
def initialize(lock, other_cond, preferred_thread)
|
887
|
+
@real_cond = lock.new_cond
|
888
|
+
@other_cond = other_cond
|
889
|
+
@preferred_thread = preferred_thread
|
890
|
+
@num_waiting_on_real_cond = 0
|
891
|
+
end
|
892
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:256
|
893
|
+
```
|
894
|
+
</details>
|
895
|
+
<details open>
|
896
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:241</summary>
|
897
|
+
|
898
|
+
##### MonitorMixin#new_cond
|
899
|
+
|
900
|
+
```ruby
|
901
|
+
def new_cond
|
902
|
+
return ConditionVariable.new(self)
|
903
|
+
end
|
904
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:216
|
905
|
+
```
|
906
|
+
</details>
|
907
|
+
<details open>
|
908
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:156</summary>
|
909
|
+
|
910
|
+
##### MonitorMixin::ConditionVariable#initialize
|
911
|
+
|
912
|
+
```ruby
|
913
|
+
def initialize(monitor)
|
914
|
+
@monitor = monitor
|
915
|
+
@cond = Thread::ConditionVariable.new
|
916
|
+
end
|
917
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:242
|
918
|
+
```
|
919
|
+
</details>
|
920
|
+
<details open>
|
921
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:199</summary>
|
922
|
+
|
923
|
+
##### MonitorMixin#mon_exit
|
924
|
+
|
925
|
+
```ruby
|
926
|
+
def mon_exit
|
927
|
+
mon_check_owner
|
928
|
+
@mon_count -=1
|
929
|
+
if @mon_count == 0
|
930
|
+
@mon_owner = nil
|
931
|
+
@mon_mutex.unlock
|
932
|
+
end
|
933
|
+
end
|
934
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:232
|
935
|
+
```
|
936
|
+
</details>
|
937
|
+
<details open>
|
938
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:267</summary>
|
939
|
+
|
940
|
+
##### MonitorMixin#mon_check_owner
|
941
|
+
|
942
|
+
```ruby
|
943
|
+
def mon_check_owner
|
944
|
+
if @mon_owner != Thread.current
|
945
|
+
raise ThreadError, "current thread not owner"
|
946
|
+
end
|
947
|
+
end
|
948
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:200
|
949
|
+
```
|
950
|
+
</details>
|
951
|
+
<details open>
|
952
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:227</summary>
|
953
|
+
|
954
|
+
##### MonitorMixin#mon_synchronize
|
955
|
+
|
956
|
+
```ruby
|
957
|
+
def mon_synchronize
|
958
|
+
mon_enter
|
959
|
+
begin
|
960
|
+
yield
|
961
|
+
ensure
|
962
|
+
mon_exit
|
963
|
+
end
|
964
|
+
end
|
965
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:693
|
966
|
+
```
|
967
|
+
</details>
|
968
|
+
<details open>
|
969
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:187</summary>
|
970
|
+
|
971
|
+
##### MonitorMixin#mon_enter
|
972
|
+
|
973
|
+
```ruby
|
974
|
+
def mon_enter
|
975
|
+
if @mon_owner != Thread.current
|
976
|
+
@mon_mutex.lock
|
977
|
+
@mon_owner = Thread.current
|
978
|
+
@mon_count = 0
|
979
|
+
end
|
980
|
+
@mon_count += 1
|
981
|
+
end
|
982
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:228
|
983
|
+
```
|
984
|
+
</details>
|
985
|
+
<details open>
|
986
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:199</summary>
|
987
|
+
|
988
|
+
##### MonitorMixin#mon_exit
|
989
|
+
|
990
|
+
```ruby
|
991
|
+
def mon_exit
|
992
|
+
mon_check_owner
|
993
|
+
@mon_count -=1
|
994
|
+
if @mon_count == 0
|
995
|
+
@mon_owner = nil
|
996
|
+
@mon_mutex.unlock
|
997
|
+
end
|
998
|
+
end
|
999
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:232
|
1000
|
+
```
|
1001
|
+
</details>
|
1002
|
+
<details open>
|
1003
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:267</summary>
|
1004
|
+
|
1005
|
+
##### MonitorMixin#mon_check_owner
|
1006
|
+
|
1007
|
+
```ruby
|
1008
|
+
def mon_check_owner
|
1009
|
+
if @mon_owner != Thread.current
|
1010
|
+
raise ThreadError, "current thread not owner"
|
1011
|
+
end
|
1012
|
+
end
|
1013
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:200
|
1014
|
+
```
|
1015
|
+
</details>
|
1016
|
+
<details open>
|
1017
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:154</summary>
|
1018
|
+
|
1019
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::Queue#synchronize
|
1020
|
+
|
1021
|
+
```ruby
|
1022
|
+
def synchronize(&block)
|
1023
|
+
@lock.synchronize(&block)
|
1024
|
+
end
|
1025
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:260
|
1026
|
+
```
|
1027
|
+
</details>
|
1028
|
+
<details open>
|
1029
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:227</summary>
|
1030
|
+
|
1031
|
+
##### MonitorMixin#mon_synchronize
|
1032
|
+
|
1033
|
+
```ruby
|
1034
|
+
def mon_synchronize
|
1035
|
+
mon_enter
|
1036
|
+
begin
|
1037
|
+
yield
|
1038
|
+
ensure
|
1039
|
+
mon_exit
|
1040
|
+
end
|
1041
|
+
end
|
1042
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:155
|
1043
|
+
```
|
1044
|
+
</details>
|
1045
|
+
<details open>
|
1046
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:187</summary>
|
1047
|
+
|
1048
|
+
##### MonitorMixin#mon_enter
|
1049
|
+
|
1050
|
+
```ruby
|
1051
|
+
def mon_enter
|
1052
|
+
if @mon_owner != Thread.current
|
1053
|
+
@mon_mutex.lock
|
1054
|
+
@mon_owner = Thread.current
|
1055
|
+
@mon_count = 0
|
1056
|
+
end
|
1057
|
+
@mon_count += 1
|
1058
|
+
end
|
1059
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:228
|
1060
|
+
```
|
1061
|
+
</details>
|
1062
|
+
<details open>
|
1063
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:227</summary>
|
1064
|
+
|
1065
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::BiasableQueue::BiasedConditionVariable#broadcast_on_biased
|
1066
|
+
|
1067
|
+
```ruby
|
1068
|
+
def broadcast_on_biased
|
1069
|
+
@num_waiting_on_real_cond = 0
|
1070
|
+
@real_cond.broadcast
|
1071
|
+
end
|
1072
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:262
|
1073
|
+
```
|
1074
|
+
</details>
|
1075
|
+
<details open>
|
1076
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:149</summary>
|
1077
|
+
|
1078
|
+
##### MonitorMixin::ConditionVariable#broadcast
|
1079
|
+
|
1080
|
+
```ruby
|
1081
|
+
def broadcast
|
1082
|
+
@monitor.__send__(:mon_check_owner)
|
1083
|
+
@cond.broadcast
|
1084
|
+
end
|
1085
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:229
|
1086
|
+
```
|
1087
|
+
</details>
|
1088
|
+
<details open>
|
1089
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:267</summary>
|
1090
|
+
|
1091
|
+
##### MonitorMixin#mon_check_owner
|
1092
|
+
|
1093
|
+
```ruby
|
1094
|
+
def mon_check_owner
|
1095
|
+
if @mon_owner != Thread.current
|
1096
|
+
raise ThreadError, "current thread not owner"
|
1097
|
+
end
|
1098
|
+
end
|
1099
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:150
|
1100
|
+
```
|
1101
|
+
</details>
|
1102
|
+
<details open>
|
1103
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:199</summary>
|
1104
|
+
|
1105
|
+
##### MonitorMixin#mon_exit
|
1106
|
+
|
1107
|
+
```ruby
|
1108
|
+
def mon_exit
|
1109
|
+
mon_check_owner
|
1110
|
+
@mon_count -=1
|
1111
|
+
if @mon_count == 0
|
1112
|
+
@mon_owner = nil
|
1113
|
+
@mon_mutex.unlock
|
1114
|
+
end
|
1115
|
+
end
|
1116
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:232
|
1117
|
+
```
|
1118
|
+
</details>
|
1119
|
+
<details open>
|
1120
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:267</summary>
|
1121
|
+
|
1122
|
+
##### MonitorMixin#mon_check_owner
|
1123
|
+
|
1124
|
+
```ruby
|
1125
|
+
def mon_check_owner
|
1126
|
+
if @mon_owner != Thread.current
|
1127
|
+
raise ThreadError, "current thread not owner"
|
1128
|
+
end
|
1129
|
+
end
|
1130
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:200
|
1131
|
+
```
|
1132
|
+
</details>
|
1133
|
+
<details open>
|
1134
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:227</summary>
|
1135
|
+
|
1136
|
+
##### MonitorMixin#mon_synchronize
|
1137
|
+
|
1138
|
+
```ruby
|
1139
|
+
def mon_synchronize
|
1140
|
+
mon_enter
|
1141
|
+
begin
|
1142
|
+
yield
|
1143
|
+
ensure
|
1144
|
+
mon_exit
|
1145
|
+
end
|
1146
|
+
end
|
1147
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:434
|
1148
|
+
```
|
1149
|
+
</details>
|
1150
|
+
<details open>
|
1151
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:187</summary>
|
1152
|
+
|
1153
|
+
##### MonitorMixin#mon_enter
|
1154
|
+
|
1155
|
+
```ruby
|
1156
|
+
def mon_enter
|
1157
|
+
if @mon_owner != Thread.current
|
1158
|
+
@mon_mutex.lock
|
1159
|
+
@mon_owner = Thread.current
|
1160
|
+
@mon_count = 0
|
1161
|
+
end
|
1162
|
+
@mon_count += 1
|
1163
|
+
end
|
1164
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:228
|
1165
|
+
```
|
1166
|
+
</details>
|
1167
|
+
<details open>
|
1168
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:124</summary>
|
1169
|
+
|
1170
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::Queue#clear
|
1171
|
+
|
1172
|
+
```ruby
|
1173
|
+
def clear
|
1174
|
+
synchronize do
|
1175
|
+
@queue.clear
|
1176
|
+
end
|
1177
|
+
end
|
1178
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:443
|
1179
|
+
```
|
1180
|
+
</details>
|
1181
|
+
<details open>
|
1182
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:154</summary>
|
1183
|
+
|
1184
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::Queue#synchronize
|
1185
|
+
|
1186
|
+
```ruby
|
1187
|
+
def synchronize(&block)
|
1188
|
+
@lock.synchronize(&block)
|
1189
|
+
end
|
1190
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:125
|
1191
|
+
```
|
1192
|
+
</details>
|
1193
|
+
<details open>
|
1194
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:227</summary>
|
1195
|
+
|
1196
|
+
##### MonitorMixin#mon_synchronize
|
1197
|
+
|
1198
|
+
```ruby
|
1199
|
+
def mon_synchronize
|
1200
|
+
mon_enter
|
1201
|
+
begin
|
1202
|
+
yield
|
1203
|
+
ensure
|
1204
|
+
mon_exit
|
1205
|
+
end
|
1206
|
+
end
|
1207
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:155
|
1208
|
+
```
|
1209
|
+
</details>
|
1210
|
+
<details open>
|
1211
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:187</summary>
|
1212
|
+
|
1213
|
+
##### MonitorMixin#mon_enter
|
1214
|
+
|
1215
|
+
```ruby
|
1216
|
+
def mon_enter
|
1217
|
+
if @mon_owner != Thread.current
|
1218
|
+
@mon_mutex.lock
|
1219
|
+
@mon_owner = Thread.current
|
1220
|
+
@mon_count = 0
|
1221
|
+
end
|
1222
|
+
@mon_count += 1
|
1223
|
+
end
|
1224
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:228
|
1225
|
+
```
|
1226
|
+
</details>
|
1227
|
+
<details open>
|
1228
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:199</summary>
|
1229
|
+
|
1230
|
+
##### MonitorMixin#mon_exit
|
1231
|
+
|
1232
|
+
```ruby
|
1233
|
+
def mon_exit
|
1234
|
+
mon_check_owner
|
1235
|
+
@mon_count -=1
|
1236
|
+
if @mon_count == 0
|
1237
|
+
@mon_owner = nil
|
1238
|
+
@mon_mutex.unlock
|
1239
|
+
end
|
1240
|
+
end
|
1241
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:232
|
1242
|
+
```
|
1243
|
+
</details>
|
1244
|
+
<details open>
|
1245
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:267</summary>
|
1246
|
+
|
1247
|
+
##### MonitorMixin#mon_check_owner
|
1248
|
+
|
1249
|
+
```ruby
|
1250
|
+
def mon_check_owner
|
1251
|
+
if @mon_owner != Thread.current
|
1252
|
+
raise ThreadError, "current thread not owner"
|
1253
|
+
end
|
1254
|
+
end
|
1255
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:200
|
1256
|
+
```
|
1257
|
+
</details>
|
1258
|
+
<details open>
|
1259
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:199</summary>
|
1260
|
+
|
1261
|
+
##### MonitorMixin#mon_exit
|
1262
|
+
|
1263
|
+
```ruby
|
1264
|
+
def mon_exit
|
1265
|
+
mon_check_owner
|
1266
|
+
@mon_count -=1
|
1267
|
+
if @mon_count == 0
|
1268
|
+
@mon_owner = nil
|
1269
|
+
@mon_mutex.unlock
|
1270
|
+
end
|
1271
|
+
end
|
1272
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:232
|
1273
|
+
```
|
1274
|
+
</details>
|
1275
|
+
<details open>
|
1276
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:267</summary>
|
1277
|
+
|
1278
|
+
##### MonitorMixin#mon_check_owner
|
1279
|
+
|
1280
|
+
```ruby
|
1281
|
+
def mon_check_owner
|
1282
|
+
if @mon_owner != Thread.current
|
1283
|
+
raise ThreadError, "current thread not owner"
|
1284
|
+
end
|
1285
|
+
end
|
1286
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:200
|
1287
|
+
```
|
1288
|
+
</details>
|
1289
|
+
<details open>
|
1290
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:227</summary>
|
1291
|
+
|
1292
|
+
##### MonitorMixin#mon_synchronize
|
1293
|
+
|
1294
|
+
```ruby
|
1295
|
+
def mon_synchronize
|
1296
|
+
mon_enter
|
1297
|
+
begin
|
1298
|
+
yield
|
1299
|
+
ensure
|
1300
|
+
mon_exit
|
1301
|
+
end
|
1302
|
+
end
|
1303
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:757
|
1304
|
+
```
|
1305
|
+
</details>
|
1306
|
+
<details open>
|
1307
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:187</summary>
|
1308
|
+
|
1309
|
+
##### MonitorMixin#mon_enter
|
1310
|
+
|
1311
|
+
```ruby
|
1312
|
+
def mon_enter
|
1313
|
+
if @mon_owner != Thread.current
|
1314
|
+
@mon_mutex.lock
|
1315
|
+
@mon_owner = Thread.current
|
1316
|
+
@mon_count = 0
|
1317
|
+
end
|
1318
|
+
@mon_count += 1
|
1319
|
+
end
|
1320
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:228
|
1321
|
+
```
|
1322
|
+
</details>
|
1323
|
+
<details open>
|
1324
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:124</summary>
|
1325
|
+
|
1326
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::Queue#clear
|
1327
|
+
|
1328
|
+
```ruby
|
1329
|
+
def clear
|
1330
|
+
synchronize do
|
1331
|
+
@queue.clear
|
1332
|
+
end
|
1333
|
+
end
|
1334
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:761
|
1335
|
+
```
|
1336
|
+
</details>
|
1337
|
+
<details open>
|
1338
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:154</summary>
|
1339
|
+
|
1340
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::Queue#synchronize
|
1341
|
+
|
1342
|
+
```ruby
|
1343
|
+
def synchronize(&block)
|
1344
|
+
@lock.synchronize(&block)
|
1345
|
+
end
|
1346
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:125
|
1347
|
+
```
|
1348
|
+
</details>
|
1349
|
+
<details open>
|
1350
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:227</summary>
|
1351
|
+
|
1352
|
+
##### MonitorMixin#mon_synchronize
|
1353
|
+
|
1354
|
+
```ruby
|
1355
|
+
def mon_synchronize
|
1356
|
+
mon_enter
|
1357
|
+
begin
|
1358
|
+
yield
|
1359
|
+
ensure
|
1360
|
+
mon_exit
|
1361
|
+
end
|
1362
|
+
end
|
1363
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:155
|
1364
|
+
```
|
1365
|
+
</details>
|
1366
|
+
<details open>
|
1367
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:187</summary>
|
1368
|
+
|
1369
|
+
##### MonitorMixin#mon_enter
|
1370
|
+
|
1371
|
+
```ruby
|
1372
|
+
def mon_enter
|
1373
|
+
if @mon_owner != Thread.current
|
1374
|
+
@mon_mutex.lock
|
1375
|
+
@mon_owner = Thread.current
|
1376
|
+
@mon_count = 0
|
1377
|
+
end
|
1378
|
+
@mon_count += 1
|
1379
|
+
end
|
1380
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:228
|
1381
|
+
```
|
1382
|
+
</details>
|
1383
|
+
<details open>
|
1384
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:199</summary>
|
1385
|
+
|
1386
|
+
##### MonitorMixin#mon_exit
|
1387
|
+
|
1388
|
+
```ruby
|
1389
|
+
def mon_exit
|
1390
|
+
mon_check_owner
|
1391
|
+
@mon_count -=1
|
1392
|
+
if @mon_count == 0
|
1393
|
+
@mon_owner = nil
|
1394
|
+
@mon_mutex.unlock
|
1395
|
+
end
|
1396
|
+
end
|
1397
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:232
|
1398
|
+
```
|
1399
|
+
</details>
|
1400
|
+
<details open>
|
1401
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:267</summary>
|
1402
|
+
|
1403
|
+
##### MonitorMixin#mon_check_owner
|
1404
|
+
|
1405
|
+
```ruby
|
1406
|
+
def mon_check_owner
|
1407
|
+
if @mon_owner != Thread.current
|
1408
|
+
raise ThreadError, "current thread not owner"
|
1409
|
+
end
|
1410
|
+
end
|
1411
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:200
|
1412
|
+
```
|
1413
|
+
</details>
|
1414
|
+
<details open>
|
1415
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:627</summary>
|
1416
|
+
|
1417
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool#num_waiting_in_queue
|
1418
|
+
|
1419
|
+
```ruby
|
1420
|
+
def num_waiting_in_queue # :nodoc:
|
1421
|
+
@available.num_waiting
|
1422
|
+
end
|
1423
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:763
|
1424
|
+
```
|
1425
|
+
</details>
|
1426
|
+
<details open>
|
1427
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:102</summary>
|
1428
|
+
|
1429
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::Queue#num_waiting
|
1430
|
+
|
1431
|
+
```ruby
|
1432
|
+
def num_waiting
|
1433
|
+
synchronize do
|
1434
|
+
@num_waiting
|
1435
|
+
end
|
1436
|
+
end
|
1437
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:628
|
1438
|
+
```
|
1439
|
+
</details>
|
1440
|
+
<details open>
|
1441
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:154</summary>
|
1442
|
+
|
1443
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::Queue#synchronize
|
1444
|
+
|
1445
|
+
```ruby
|
1446
|
+
def synchronize(&block)
|
1447
|
+
@lock.synchronize(&block)
|
1448
|
+
end
|
1449
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:103
|
1450
|
+
```
|
1451
|
+
</details>
|
1452
|
+
<details open>
|
1453
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:227</summary>
|
1454
|
+
|
1455
|
+
##### MonitorMixin#mon_synchronize
|
1456
|
+
|
1457
|
+
```ruby
|
1458
|
+
def mon_synchronize
|
1459
|
+
mon_enter
|
1460
|
+
begin
|
1461
|
+
yield
|
1462
|
+
ensure
|
1463
|
+
mon_exit
|
1464
|
+
end
|
1465
|
+
end
|
1466
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:155
|
1467
|
+
```
|
1468
|
+
</details>
|
1469
|
+
<details open>
|
1470
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:187</summary>
|
1471
|
+
|
1472
|
+
##### MonitorMixin#mon_enter
|
1473
|
+
|
1474
|
+
```ruby
|
1475
|
+
def mon_enter
|
1476
|
+
if @mon_owner != Thread.current
|
1477
|
+
@mon_mutex.lock
|
1478
|
+
@mon_owner = Thread.current
|
1479
|
+
@mon_count = 0
|
1480
|
+
end
|
1481
|
+
@mon_count += 1
|
1482
|
+
end
|
1483
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:228
|
1484
|
+
```
|
1485
|
+
</details>
|
1486
|
+
<details open>
|
1487
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:199</summary>
|
1488
|
+
|
1489
|
+
##### MonitorMixin#mon_exit
|
1490
|
+
|
1491
|
+
```ruby
|
1492
|
+
def mon_exit
|
1493
|
+
mon_check_owner
|
1494
|
+
@mon_count -=1
|
1495
|
+
if @mon_count == 0
|
1496
|
+
@mon_owner = nil
|
1497
|
+
@mon_mutex.unlock
|
1498
|
+
end
|
1499
|
+
end
|
1500
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:232
|
1501
|
+
```
|
1502
|
+
</details>
|
1503
|
+
<details open>
|
1504
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:267</summary>
|
1505
|
+
|
1506
|
+
##### MonitorMixin#mon_check_owner
|
1507
|
+
|
1508
|
+
```ruby
|
1509
|
+
def mon_check_owner
|
1510
|
+
if @mon_owner != Thread.current
|
1511
|
+
raise ThreadError, "current thread not owner"
|
1512
|
+
end
|
1513
|
+
end
|
1514
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:200
|
1515
|
+
```
|
1516
|
+
</details>
|
1517
|
+
<details open>
|
1518
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:199</summary>
|
1519
|
+
|
1520
|
+
##### MonitorMixin#mon_exit
|
1521
|
+
|
1522
|
+
```ruby
|
1523
|
+
def mon_exit
|
1524
|
+
mon_check_owner
|
1525
|
+
@mon_count -=1
|
1526
|
+
if @mon_count == 0
|
1527
|
+
@mon_owner = nil
|
1528
|
+
@mon_mutex.unlock
|
1529
|
+
end
|
1530
|
+
end
|
1531
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:232
|
1532
|
+
```
|
1533
|
+
</details>
|
1534
|
+
<details open>
|
1535
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:267</summary>
|
1536
|
+
|
1537
|
+
##### MonitorMixin#mon_check_owner
|
1538
|
+
|
1539
|
+
```ruby
|
1540
|
+
def mon_check_owner
|
1541
|
+
if @mon_owner != Thread.current
|
1542
|
+
raise ThreadError, "current thread not owner"
|
1543
|
+
end
|
1544
|
+
end
|
1545
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:200
|
1546
|
+
```
|
1547
|
+
</details>
|
1548
|
+
<details open>
|
1549
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications.rb:189</summary>
|
1550
|
+
|
1551
|
+
##### ActiveSupport::Notifications.instrumenter
|
1552
|
+
|
1553
|
+
```ruby
|
1554
|
+
def instrumenter
|
1555
|
+
InstrumentationRegistry.instance.instrumenter_for(notifier)
|
1556
|
+
end
|
1557
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:960
|
1558
|
+
```
|
1559
|
+
</details>
|
1560
|
+
<details open>
|
1561
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/per_thread_registry.rb:46</summary>
|
1562
|
+
|
1563
|
+
##### ActiveSupport::PerThreadRegistry.instance
|
1564
|
+
|
1565
|
+
```ruby
|
1566
|
+
def instance
|
1567
|
+
Thread.current[@per_thread_registry_key] ||= new
|
1568
|
+
end
|
1569
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications.rb:190
|
1570
|
+
```
|
1571
|
+
</details>
|
1572
|
+
<details open>
|
1573
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications.rb:209</summary>
|
1574
|
+
|
1575
|
+
##### ActiveSupport::Notifications::InstrumentationRegistry#instrumenter_for
|
1576
|
+
|
1577
|
+
```ruby
|
1578
|
+
def instrumenter_for(notifier)
|
1579
|
+
@registry[notifier] ||= Instrumenter.new(notifier)
|
1580
|
+
end
|
1581
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications.rb:190
|
1582
|
+
```
|
1583
|
+
</details>
|
1584
|
+
<details open>
|
1585
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:19</summary>
|
1586
|
+
|
1587
|
+
##### ActiveSupport::Notifications::Instrumenter#instrument
|
1588
|
+
|
1589
|
+
```ruby
|
1590
|
+
def instrument(name, payload = {})
|
1591
|
+
# some of the listeners might have state
|
1592
|
+
listeners_state = start name, payload
|
1593
|
+
begin
|
1594
|
+
yield payload
|
1595
|
+
rescue Exception => e
|
1596
|
+
payload[:exception] = [e.class.name, e.message]
|
1597
|
+
payload[:exception_object] = e
|
1598
|
+
raise e
|
1599
|
+
ensure
|
1600
|
+
finish_with_state listeners_state, name, payload
|
1601
|
+
end
|
1602
|
+
end
|
1603
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:969
|
1604
|
+
```
|
1605
|
+
</details>
|
1606
|
+
<details open>
|
1607
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:34</summary>
|
1608
|
+
|
1609
|
+
##### ActiveSupport::Notifications::Instrumenter#start
|
1610
|
+
|
1611
|
+
```ruby
|
1612
|
+
def start(name, payload)
|
1613
|
+
@notifier.start name, @id, payload
|
1614
|
+
end
|
1615
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:21
|
1616
|
+
```
|
1617
|
+
</details>
|
1618
|
+
<details open>
|
1619
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/fanout.rb:43</summary>
|
1620
|
+
|
1621
|
+
##### ActiveSupport::Notifications::Fanout#start
|
1622
|
+
|
1623
|
+
```ruby
|
1624
|
+
def start(name, id, payload)
|
1625
|
+
listeners_for(name).each { |s| s.start(name, id, payload) }
|
1626
|
+
end
|
1627
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:35
|
1628
|
+
```
|
1629
|
+
</details>
|
1630
|
+
<details open>
|
1631
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/fanout.rb:55</summary>
|
1632
|
+
|
1633
|
+
##### ActiveSupport::Notifications::Fanout#listeners_for
|
1634
|
+
|
1635
|
+
```ruby
|
1636
|
+
def listeners_for(name)
|
1637
|
+
# this is correctly done double-checked locking (Concurrent::Map's lookups have volatile semantics)
|
1638
|
+
@listeners_for[name] || synchronize do
|
1639
|
+
# use synchronisation when accessing @subscribers
|
1640
|
+
@listeners_for[name] ||= @subscribers.select { |s| s.subscribed_to?(name) }
|
1641
|
+
end
|
1642
|
+
end
|
1643
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/fanout.rb:44
|
1644
|
+
```
|
1645
|
+
</details>
|
1646
|
+
<details open>
|
1647
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:132</summary>
|
1648
|
+
|
1649
|
+
##### Concurrent::Map#[]
|
1650
|
+
|
1651
|
+
```ruby
|
1652
|
+
def [](key)
|
1653
|
+
if value = super # non-falsy value is an existing mapping, return it right away
|
1654
|
+
value
|
1655
|
+
# re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call
|
1656
|
+
# a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value
|
1657
|
+
# would be returned)
|
1658
|
+
# note: nil == value check is not technically necessary
|
1659
|
+
elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL))
|
1660
|
+
@default_proc.call(self, key)
|
1661
|
+
else
|
1662
|
+
value
|
1663
|
+
end
|
1664
|
+
end
|
1665
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/fanout.rb:57
|
1666
|
+
```
|
1667
|
+
</details>
|
1668
|
+
<details open>
|
1669
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb:19</summary>
|
1670
|
+
|
1671
|
+
##### Concurrent::Map#[]
|
1672
|
+
|
1673
|
+
```ruby
|
1674
|
+
def [](key)
|
1675
|
+
if value = super # non-falsy value is an existing mapping, return it right away
|
1676
|
+
value
|
1677
|
+
# re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call
|
1678
|
+
# a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value
|
1679
|
+
# would be returned)
|
1680
|
+
# note: nil == value check is not technically necessary
|
1681
|
+
elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL))
|
1682
|
+
@default_proc.call(self, key)
|
1683
|
+
else
|
1684
|
+
value
|
1685
|
+
end
|
1686
|
+
end
|
1687
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:133
|
1688
|
+
```
|
1689
|
+
</details>
|
1690
|
+
<details open>
|
1691
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1058</summary>
|
1692
|
+
|
1693
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionHandler#owner_to_pool
|
1694
|
+
|
1695
|
+
```ruby
|
1696
|
+
def owner_to_pool
|
1697
|
+
@owner_to_pool[Process.pid]
|
1698
|
+
end
|
1699
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:970
|
1700
|
+
```
|
1701
|
+
</details>
|
1702
|
+
<details open>
|
1703
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:132</summary>
|
1704
|
+
|
1705
|
+
##### Concurrent::Map#[]
|
1706
|
+
|
1707
|
+
```ruby
|
1708
|
+
def [](key)
|
1709
|
+
if value = super # non-falsy value is an existing mapping, return it right away
|
1710
|
+
value
|
1711
|
+
# re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call
|
1712
|
+
# a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value
|
1713
|
+
# would be returned)
|
1714
|
+
# note: nil == value check is not technically necessary
|
1715
|
+
elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL))
|
1716
|
+
@default_proc.call(self, key)
|
1717
|
+
else
|
1718
|
+
value
|
1719
|
+
end
|
1720
|
+
end
|
1721
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1059
|
1722
|
+
```
|
1723
|
+
</details>
|
1724
|
+
<details open>
|
1725
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb:19</summary>
|
1726
|
+
|
1727
|
+
##### Concurrent::Map#[]
|
1728
|
+
|
1729
|
+
```ruby
|
1730
|
+
def [](key)
|
1731
|
+
if value = super # non-falsy value is an existing mapping, return it right away
|
1732
|
+
value
|
1733
|
+
# re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call
|
1734
|
+
# a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value
|
1735
|
+
# would be returned)
|
1736
|
+
# note: nil == value check is not technically necessary
|
1737
|
+
elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL))
|
1738
|
+
@default_proc.call(self, key)
|
1739
|
+
else
|
1740
|
+
value
|
1741
|
+
end
|
1742
|
+
end
|
1743
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:133
|
1744
|
+
```
|
1745
|
+
</details>
|
1746
|
+
<details open>
|
1747
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:321</summary>
|
1748
|
+
|
1749
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool#initialize
|
1750
|
+
|
1751
|
+
```ruby
|
1752
|
+
def initialize(spec)
|
1753
|
+
super()
|
1754
|
+
|
1755
|
+
@spec = spec
|
1756
|
+
|
1757
|
+
@checkout_timeout = (spec.config[:checkout_timeout] && spec.config[:checkout_timeout].to_f) || 5
|
1758
|
+
if @idle_timeout = spec.config.fetch(:idle_timeout, 300)
|
1759
|
+
@idle_timeout = @idle_timeout.to_f
|
1760
|
+
@idle_timeout = nil if @idle_timeout <= 0
|
1761
|
+
end
|
1762
|
+
|
1763
|
+
# default max pool size to 5
|
1764
|
+
@size = (spec.config[:pool] && spec.config[:pool].to_i) || 5
|
1765
|
+
|
1766
|
+
# This variable tracks the cache of threads mapped to reserved connections, with the
|
1767
|
+
# sole purpose of speeding up the +connection+ method. It is not the authoritative
|
1768
|
+
# registry of which thread owns which connection. Connection ownership is tracked by
|
1769
|
+
# the +connection.owner+ attr on each +connection+ instance.
|
1770
|
+
# The invariant works like this: if there is mapping of <tt>thread => conn</tt>,
|
1771
|
+
# then that +thread+ does indeed own that +conn+. However, an absence of a such
|
1772
|
+
# mapping does not mean that the +thread+ doesn't own the said connection. In
|
1773
|
+
# that case +conn.owner+ attr should be consulted.
|
1774
|
+
# Access and modification of <tt>@thread_cached_conns</tt> does not require
|
1775
|
+
# synchronization.
|
1776
|
+
@thread_cached_conns = Concurrent::Map.new(initial_capacity: @size)
|
1777
|
+
|
1778
|
+
@connections = []
|
1779
|
+
@automatic_reconnect = true
|
1780
|
+
|
1781
|
+
# Connection pool allows for concurrent (outside the main +synchronize+ section)
|
1782
|
+
# establishment of new connections. This variable tracks the number of threads
|
1783
|
+
# currently in the process of independently establishing connections to the DB.
|
1784
|
+
@now_connecting = 0
|
1785
|
+
|
1786
|
+
@threads_blocking_new_connections = 0
|
1787
|
+
|
1788
|
+
@available = ConnectionLeasingQueue.new self
|
1789
|
+
|
1790
|
+
@lock_thread = false
|
1791
|
+
|
1792
|
+
# +reaping_frequency+ is configurable mostly for historical reasons, but it could
|
1793
|
+
# also be useful if someone wants a very low +idle_timeout+.
|
1794
|
+
reaping_frequency = spec.config.fetch(:reaping_frequency, 60)
|
1795
|
+
@reaper = Reaper.new(self, reaping_frequency && reaping_frequency.to_f)
|
1796
|
+
@reaper.run
|
1797
|
+
end
|
1798
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:970
|
1799
|
+
```
|
1800
|
+
</details>
|
1801
|
+
<details open>
|
1802
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/query_cache.rb:29</summary>
|
1803
|
+
|
1804
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool#initialize
|
1805
|
+
|
1806
|
+
```ruby
|
1807
|
+
def initialize(spec)
|
1808
|
+
super()
|
1809
|
+
|
1810
|
+
@spec = spec
|
1811
|
+
|
1812
|
+
@checkout_timeout = (spec.config[:checkout_timeout] && spec.config[:checkout_timeout].to_f) || 5
|
1813
|
+
if @idle_timeout = spec.config.fetch(:idle_timeout, 300)
|
1814
|
+
@idle_timeout = @idle_timeout.to_f
|
1815
|
+
@idle_timeout = nil if @idle_timeout <= 0
|
1816
|
+
end
|
1817
|
+
|
1818
|
+
# default max pool size to 5
|
1819
|
+
@size = (spec.config[:pool] && spec.config[:pool].to_i) || 5
|
1820
|
+
|
1821
|
+
# This variable tracks the cache of threads mapped to reserved connections, with the
|
1822
|
+
# sole purpose of speeding up the +connection+ method. It is not the authoritative
|
1823
|
+
# registry of which thread owns which connection. Connection ownership is tracked by
|
1824
|
+
# the +connection.owner+ attr on each +connection+ instance.
|
1825
|
+
# The invariant works like this: if there is mapping of <tt>thread => conn</tt>,
|
1826
|
+
# then that +thread+ does indeed own that +conn+. However, an absence of a such
|
1827
|
+
# mapping does not mean that the +thread+ doesn't own the said connection. In
|
1828
|
+
# that case +conn.owner+ attr should be consulted.
|
1829
|
+
# Access and modification of <tt>@thread_cached_conns</tt> does not require
|
1830
|
+
# synchronization.
|
1831
|
+
@thread_cached_conns = Concurrent::Map.new(initial_capacity: @size)
|
1832
|
+
|
1833
|
+
@connections = []
|
1834
|
+
@automatic_reconnect = true
|
1835
|
+
|
1836
|
+
# Connection pool allows for concurrent (outside the main +synchronize+ section)
|
1837
|
+
# establishment of new connections. This variable tracks the number of threads
|
1838
|
+
# currently in the process of independently establishing connections to the DB.
|
1839
|
+
@now_connecting = 0
|
1840
|
+
|
1841
|
+
@threads_blocking_new_connections = 0
|
1842
|
+
|
1843
|
+
@available = ConnectionLeasingQueue.new self
|
1844
|
+
|
1845
|
+
@lock_thread = false
|
1846
|
+
|
1847
|
+
# +reaping_frequency+ is configurable mostly for historical reasons, but it could
|
1848
|
+
# also be useful if someone wants a very low +idle_timeout+.
|
1849
|
+
reaping_frequency = spec.config.fetch(:reaping_frequency, 60)
|
1850
|
+
@reaper = Reaper.new(self, reaping_frequency && reaping_frequency.to_f)
|
1851
|
+
@reaper.run
|
1852
|
+
end
|
1853
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:322
|
1854
|
+
```
|
1855
|
+
</details>
|
1856
|
+
<details open>
|
1857
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:250</summary>
|
1858
|
+
|
1859
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool#initialize
|
1860
|
+
|
1861
|
+
```ruby
|
1862
|
+
def initialize(spec)
|
1863
|
+
super()
|
1864
|
+
|
1865
|
+
@spec = spec
|
1866
|
+
|
1867
|
+
@checkout_timeout = (spec.config[:checkout_timeout] && spec.config[:checkout_timeout].to_f) || 5
|
1868
|
+
if @idle_timeout = spec.config.fetch(:idle_timeout, 300)
|
1869
|
+
@idle_timeout = @idle_timeout.to_f
|
1870
|
+
@idle_timeout = nil if @idle_timeout <= 0
|
1871
|
+
end
|
1872
|
+
|
1873
|
+
# default max pool size to 5
|
1874
|
+
@size = (spec.config[:pool] && spec.config[:pool].to_i) || 5
|
1875
|
+
|
1876
|
+
# This variable tracks the cache of threads mapped to reserved connections, with the
|
1877
|
+
# sole purpose of speeding up the +connection+ method. It is not the authoritative
|
1878
|
+
# registry of which thread owns which connection. Connection ownership is tracked by
|
1879
|
+
# the +connection.owner+ attr on each +connection+ instance.
|
1880
|
+
# The invariant works like this: if there is mapping of <tt>thread => conn</tt>,
|
1881
|
+
# then that +thread+ does indeed own that +conn+. However, an absence of a such
|
1882
|
+
# mapping does not mean that the +thread+ doesn't own the said connection. In
|
1883
|
+
# that case +conn.owner+ attr should be consulted.
|
1884
|
+
# Access and modification of <tt>@thread_cached_conns</tt> does not require
|
1885
|
+
# synchronization.
|
1886
|
+
@thread_cached_conns = Concurrent::Map.new(initial_capacity: @size)
|
1887
|
+
|
1888
|
+
@connections = []
|
1889
|
+
@automatic_reconnect = true
|
1890
|
+
|
1891
|
+
# Connection pool allows for concurrent (outside the main +synchronize+ section)
|
1892
|
+
# establishment of new connections. This variable tracks the number of threads
|
1893
|
+
# currently in the process of independently establishing connections to the DB.
|
1894
|
+
@now_connecting = 0
|
1895
|
+
|
1896
|
+
@threads_blocking_new_connections = 0
|
1897
|
+
|
1898
|
+
@available = ConnectionLeasingQueue.new self
|
1899
|
+
|
1900
|
+
@lock_thread = false
|
1901
|
+
|
1902
|
+
# +reaping_frequency+ is configurable mostly for historical reasons, but it could
|
1903
|
+
# also be useful if someone wants a very low +idle_timeout+.
|
1904
|
+
reaping_frequency = spec.config.fetch(:reaping_frequency, 60)
|
1905
|
+
@reaper = Reaper.new(self, reaping_frequency && reaping_frequency.to_f)
|
1906
|
+
@reaper.run
|
1907
|
+
end
|
1908
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/query_cache.rb:30
|
1909
|
+
```
|
1910
|
+
</details>
|
1911
|
+
<details open>
|
1912
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:257</summary>
|
1913
|
+
|
1914
|
+
##### MonitorMixin#mon_initialize
|
1915
|
+
|
1916
|
+
```ruby
|
1917
|
+
def mon_initialize
|
1918
|
+
if defined?(@mon_mutex) && @mon_mutex_owner_object_id == object_id
|
1919
|
+
raise ThreadError, "already initialized"
|
1920
|
+
end
|
1921
|
+
@mon_mutex = Thread::Mutex.new
|
1922
|
+
@mon_mutex_owner_object_id = object_id
|
1923
|
+
@mon_owner = nil
|
1924
|
+
@mon_count = 0
|
1925
|
+
end
|
1926
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:252
|
1927
|
+
```
|
1928
|
+
</details>
|
1929
|
+
<details open>
|
1930
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:118</summary>
|
1931
|
+
|
1932
|
+
##### Concurrent::Map#initialize
|
1933
|
+
|
1934
|
+
```ruby
|
1935
|
+
def initialize(options = nil, &block)
|
1936
|
+
if options.kind_of?(::Hash)
|
1937
|
+
validate_options_hash!(options)
|
1938
|
+
else
|
1939
|
+
options = nil
|
1940
|
+
end
|
1941
|
+
|
1942
|
+
super(options)
|
1943
|
+
@default_proc = block
|
1944
|
+
end
|
1945
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/query_cache.rb:31
|
1946
|
+
```
|
1947
|
+
</details>
|
1948
|
+
<details open>
|
1949
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/mri_map_backend.rb:12</summary>
|
1950
|
+
|
1951
|
+
##### Concurrent::Map#initialize
|
1952
|
+
|
1953
|
+
```ruby
|
1954
|
+
def initialize(options = nil, &block)
|
1955
|
+
if options.kind_of?(::Hash)
|
1956
|
+
validate_options_hash!(options)
|
1957
|
+
else
|
1958
|
+
options = nil
|
1959
|
+
end
|
1960
|
+
|
1961
|
+
super(options)
|
1962
|
+
@default_proc = block
|
1963
|
+
end
|
1964
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:125
|
1965
|
+
```
|
1966
|
+
</details>
|
1967
|
+
<details open>
|
1968
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb:15</summary>
|
1969
|
+
|
1970
|
+
##### Concurrent::Map#initialize
|
1971
|
+
|
1972
|
+
```ruby
|
1973
|
+
def initialize(options = nil, &block)
|
1974
|
+
if options.kind_of?(::Hash)
|
1975
|
+
validate_options_hash!(options)
|
1976
|
+
else
|
1977
|
+
options = nil
|
1978
|
+
end
|
1979
|
+
|
1980
|
+
super(options)
|
1981
|
+
@default_proc = block
|
1982
|
+
end
|
1983
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/mri_map_backend.rb:13
|
1984
|
+
```
|
1985
|
+
</details>
|
1986
|
+
<details open>
|
1987
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:118</summary>
|
1988
|
+
|
1989
|
+
##### Concurrent::Map#initialize
|
1990
|
+
|
1991
|
+
```ruby
|
1992
|
+
def initialize(options = nil, &block)
|
1993
|
+
if options.kind_of?(::Hash)
|
1994
|
+
validate_options_hash!(options)
|
1995
|
+
else
|
1996
|
+
options = nil
|
1997
|
+
end
|
1998
|
+
|
1999
|
+
super(options)
|
2000
|
+
@default_proc = block
|
2001
|
+
end
|
2002
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:345
|
2003
|
+
```
|
2004
|
+
</details>
|
2005
|
+
<details open>
|
2006
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:328</summary>
|
2007
|
+
|
2008
|
+
##### Concurrent::Map#validate_options_hash!
|
2009
|
+
|
2010
|
+
```ruby
|
2011
|
+
def validate_options_hash!(options)
|
2012
|
+
if (initial_capacity = options[:initial_capacity]) && (!initial_capacity.kind_of?(Integer) || initial_capacity < 0)
|
2013
|
+
raise ArgumentError, ":initial_capacity must be a positive Integer"
|
2014
|
+
end
|
2015
|
+
if (load_factor = options[:load_factor]) && (!load_factor.kind_of?(Numeric) || load_factor <= 0 || load_factor > 1)
|
2016
|
+
raise ArgumentError, ":load_factor must be a number between 0 and 1"
|
2017
|
+
end
|
2018
|
+
end
|
2019
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:120
|
2020
|
+
```
|
2021
|
+
</details>
|
2022
|
+
<details open>
|
2023
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/mri_map_backend.rb:12</summary>
|
2024
|
+
|
2025
|
+
##### Concurrent::Map#initialize
|
2026
|
+
|
2027
|
+
```ruby
|
2028
|
+
def initialize(options = nil, &block)
|
2029
|
+
if options.kind_of?(::Hash)
|
2030
|
+
validate_options_hash!(options)
|
2031
|
+
else
|
2032
|
+
options = nil
|
2033
|
+
end
|
2034
|
+
|
2035
|
+
super(options)
|
2036
|
+
@default_proc = block
|
2037
|
+
end
|
2038
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:125
|
2039
|
+
```
|
2040
|
+
</details>
|
2041
|
+
<details open>
|
2042
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb:15</summary>
|
2043
|
+
|
2044
|
+
##### Concurrent::Map#initialize
|
2045
|
+
|
2046
|
+
```ruby
|
2047
|
+
def initialize(options = nil, &block)
|
2048
|
+
if options.kind_of?(::Hash)
|
2049
|
+
validate_options_hash!(options)
|
2050
|
+
else
|
2051
|
+
options = nil
|
2052
|
+
end
|
2053
|
+
|
2054
|
+
super(options)
|
2055
|
+
@default_proc = block
|
2056
|
+
end
|
2057
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/mri_map_backend.rb:13
|
2058
|
+
```
|
2059
|
+
</details>
|
2060
|
+
<details open>
|
2061
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:86</summary>
|
2062
|
+
|
2063
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::Queue#initialize
|
2064
|
+
|
2065
|
+
```ruby
|
2066
|
+
def initialize(lock = Monitor.new)
|
2067
|
+
@lock = lock
|
2068
|
+
@cond = @lock.new_cond
|
2069
|
+
@num_waiting = 0
|
2070
|
+
@queue = []
|
2071
|
+
end
|
2072
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:357
|
2073
|
+
```
|
2074
|
+
</details>
|
2075
|
+
<details open>
|
2076
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:241</summary>
|
2077
|
+
|
2078
|
+
##### MonitorMixin#new_cond
|
2079
|
+
|
2080
|
+
```ruby
|
2081
|
+
def new_cond
|
2082
|
+
return ConditionVariable.new(self)
|
2083
|
+
end
|
2084
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:88
|
2085
|
+
```
|
2086
|
+
</details>
|
2087
|
+
<details open>
|
2088
|
+
<summary>/Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:156</summary>
|
2089
|
+
|
2090
|
+
##### MonitorMixin::ConditionVariable#initialize
|
2091
|
+
|
2092
|
+
```ruby
|
2093
|
+
def initialize(monitor)
|
2094
|
+
@monitor = monitor
|
2095
|
+
@cond = Thread::ConditionVariable.new
|
2096
|
+
end
|
2097
|
+
# called from /Users/yhirano/.rbenv/versions/2.6.3/lib/ruby/2.6.0/monitor.rb:242
|
2098
|
+
```
|
2099
|
+
</details>
|
2100
|
+
<details open>
|
2101
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:292</summary>
|
2102
|
+
|
2103
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper#initialize
|
2104
|
+
|
2105
|
+
```ruby
|
2106
|
+
def initialize(pool, frequency)
|
2107
|
+
@pool = pool
|
2108
|
+
@frequency = frequency
|
2109
|
+
end
|
2110
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:364
|
2111
|
+
```
|
2112
|
+
</details>
|
2113
|
+
<details open>
|
2114
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:297</summary>
|
2115
|
+
|
2116
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionPool::Reaper#run
|
2117
|
+
|
2118
|
+
```ruby
|
2119
|
+
def run
|
2120
|
+
return unless frequency && frequency > 0
|
2121
|
+
Thread.new(frequency, pool) { |t, p|
|
2122
|
+
loop do
|
2123
|
+
sleep t
|
2124
|
+
p.reap
|
2125
|
+
p.flush
|
2126
|
+
end
|
2127
|
+
}
|
2128
|
+
end
|
2129
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:365
|
2130
|
+
```
|
2131
|
+
</details>
|
2132
|
+
<details open>
|
2133
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/mri_map_backend.rb:17</summary>
|
2134
|
+
|
2135
|
+
##### Concurrent::Collection::MriMapBackend#[]=
|
2136
|
+
|
2137
|
+
```ruby
|
2138
|
+
def []=(key, value)
|
2139
|
+
@write_lock.synchronize { super }
|
2140
|
+
end
|
2141
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:970
|
2142
|
+
```
|
2143
|
+
</details>
|
2144
|
+
<details open>
|
2145
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb:23</summary>
|
2146
|
+
|
2147
|
+
##### Concurrent::Collection::MriMapBackend#[]=
|
2148
|
+
|
2149
|
+
```ruby
|
2150
|
+
def []=(key, value)
|
2151
|
+
@write_lock.synchronize { super }
|
2152
|
+
end
|
2153
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/mri_map_backend.rb:18
|
2154
|
+
```
|
2155
|
+
</details>
|
2156
|
+
<details open>
|
2157
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:43</summary>
|
2158
|
+
|
2159
|
+
##### ActiveSupport::Notifications::Instrumenter#finish_with_state
|
2160
|
+
|
2161
|
+
```ruby
|
2162
|
+
def finish_with_state(listeners_state, name, payload)
|
2163
|
+
@notifier.finish name, @id, payload, listeners_state
|
2164
|
+
end
|
2165
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:29
|
2166
|
+
```
|
2167
|
+
</details>
|
2168
|
+
<details open>
|
2169
|
+
<summary>vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/fanout.rb:47</summary>
|
2170
|
+
|
2171
|
+
##### ActiveSupport::Notifications::Fanout#finish
|
2172
|
+
|
2173
|
+
```ruby
|
2174
|
+
def finish(name, id, payload, listeners = listeners_for(name))
|
2175
|
+
listeners.each { |s| s.finish(name, id, payload) }
|
2176
|
+
end
|
2177
|
+
# called from vendor/bundle/gems/activesupport-5.2.3/lib/active_support/notifications/instrumenter.rb:44
|
2178
|
+
```
|
2179
|
+
</details>
|
2180
|
+
<details open>
|
2181
|
+
<summary>vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1058</summary>
|
2182
|
+
|
2183
|
+
##### ActiveRecord::ConnectionAdapters::ConnectionHandler#owner_to_pool
|
2184
|
+
|
2185
|
+
```ruby
|
2186
|
+
def owner_to_pool
|
2187
|
+
@owner_to_pool[Process.pid]
|
2188
|
+
end
|
2189
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:973
|
2190
|
+
```
|
2191
|
+
</details>
|
2192
|
+
<details open>
|
2193
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:132</summary>
|
2194
|
+
|
2195
|
+
##### Concurrent::Map#[]
|
2196
|
+
|
2197
|
+
```ruby
|
2198
|
+
def [](key)
|
2199
|
+
if value = super # non-falsy value is an existing mapping, return it right away
|
2200
|
+
value
|
2201
|
+
# re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call
|
2202
|
+
# a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value
|
2203
|
+
# would be returned)
|
2204
|
+
# note: nil == value check is not technically necessary
|
2205
|
+
elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL))
|
2206
|
+
@default_proc.call(self, key)
|
2207
|
+
else
|
2208
|
+
value
|
2209
|
+
end
|
2210
|
+
end
|
2211
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:1059
|
2212
|
+
```
|
2213
|
+
</details>
|
2214
|
+
<details open>
|
2215
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb:19</summary>
|
2216
|
+
|
2217
|
+
##### Concurrent::Map#[]
|
2218
|
+
|
2219
|
+
```ruby
|
2220
|
+
def [](key)
|
2221
|
+
if value = super # non-falsy value is an existing mapping, return it right away
|
2222
|
+
value
|
2223
|
+
# re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call
|
2224
|
+
# a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value
|
2225
|
+
# would be returned)
|
2226
|
+
# note: nil == value check is not technically necessary
|
2227
|
+
elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL))
|
2228
|
+
@default_proc.call(self, key)
|
2229
|
+
else
|
2230
|
+
value
|
2231
|
+
end
|
2232
|
+
end
|
2233
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:133
|
2234
|
+
```
|
2235
|
+
</details>
|
2236
|
+
<details open>
|
2237
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:132</summary>
|
2238
|
+
|
2239
|
+
##### Concurrent::Map#[]
|
2240
|
+
|
2241
|
+
```ruby
|
2242
|
+
def [](key)
|
2243
|
+
if value = super # non-falsy value is an existing mapping, return it right away
|
2244
|
+
value
|
2245
|
+
# re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call
|
2246
|
+
# a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value
|
2247
|
+
# would be returned)
|
2248
|
+
# note: nil == value check is not technically necessary
|
2249
|
+
elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL))
|
2250
|
+
@default_proc.call(self, key)
|
2251
|
+
else
|
2252
|
+
value
|
2253
|
+
end
|
2254
|
+
end
|
2255
|
+
# called from vendor/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:973
|
2256
|
+
```
|
2257
|
+
</details>
|
2258
|
+
<details open>
|
2259
|
+
<summary>vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/collection/map/non_concurrent_map_backend.rb:19</summary>
|
2260
|
+
|
2261
|
+
##### Concurrent::Map#[]
|
2262
|
+
|
2263
|
+
```ruby
|
2264
|
+
def [](key)
|
2265
|
+
if value = super # non-falsy value is an existing mapping, return it right away
|
2266
|
+
value
|
2267
|
+
# re-check is done with get_or_default(key, NULL) instead of a simple !key?(key) in order to avoid a race condition, whereby by the time the current thread gets to the key?(key) call
|
2268
|
+
# a key => value mapping might have already been created by a different thread (key?(key) would then return true, this elsif branch wouldn't be taken and an incorrent +nil+ value
|
2269
|
+
# would be returned)
|
2270
|
+
# note: nil == value check is not technically necessary
|
2271
|
+
elsif @default_proc && nil == value && NULL == (value = get_or_default(key, NULL))
|
2272
|
+
@default_proc.call(self, key)
|
2273
|
+
else
|
2274
|
+
value
|
2275
|
+
end
|
2276
|
+
end
|
2277
|
+
# called from vendor/bundle/gems/concurrent-ruby-1.1.5/lib/concurrent/map.rb:133
|
2278
|
+
```
|
2279
|
+
</details>
|