exceptional_synchrony 1.4.0.pre.2 → 1.4.2
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/CHANGELOG.md +14 -3
- data/Gemfile.lock +18 -16
- data/lib/exceptional_synchrony/event_machine_proxy.rb +5 -13
- data/lib/exceptional_synchrony/faraday_monkey_patch.rb +52 -0
- data/lib/exceptional_synchrony/version.rb +1 -1
- data/test/unit/event_machine_proxy_test.rb +21 -36
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2f574bdd917d5a7cab99f7844581ad87a86666f29678aa125aa68fdfb709d35
|
4
|
+
data.tar.gz: 68d9c838bcf933a4edb2c51dd0701e36d24dd99a2faf5aa526ce038541b0163b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b963e314d96e4e0ed269f6c532db13ae599a9f9478858a5087cea2cfc2fa85b011344cc4051da7ccdbb1a1142a627cb3c776a72c8cbacd4af99feede18a32e3
|
7
|
+
data.tar.gz: 51316500edb4ce824d3c19df94c81e0f5f2411411110f70d80b9ac31447b46aaea61c0efb60034aaac7f9ab4f58c689f83060346952deaee7a8b96476f12fc85
|
data/CHANGELOG.md
CHANGED
@@ -6,10 +6,18 @@ Note: This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0
|
|
6
6
|
|
7
7
|
All notable changes to this project will be documented in this file.
|
8
8
|
|
9
|
-
## [1.4.
|
9
|
+
## [1.4.2] - 2021-03-10
|
10
|
+
### Fixed
|
11
|
+
- Additional symbol reference fixes in FaradayAdapterPatch_v1
|
12
|
+
|
13
|
+
## [1.4.1] - 2021-03-09
|
14
|
+
### Fixed
|
15
|
+
- FaradayAdapterPatch_v1 name typo
|
16
|
+
|
17
|
+
## [1.4.0] - 2021-03-08
|
10
18
|
### Added
|
11
|
-
- Added
|
12
|
-
|
19
|
+
- Added use of Thread local variable to indicate when Eventmachine is running using EM::Synchrony
|
20
|
+
- Added faraday gem monkey patch to use the new Thread local variable to choose the adapter to use
|
13
21
|
|
14
22
|
## [1.3.0] - 2021-02-04
|
15
23
|
### Added
|
@@ -29,6 +37,9 @@ All notable changes to this project will be documented in this file.
|
|
29
37
|
## [1.1.1] - 2020-05-03
|
30
38
|
- Replace hobo_support with invoca_utils
|
31
39
|
|
40
|
+
[1.4.2]: https://github.com/Invoca/exceptional_synchrony/compare/v1.4.1...v1.4.2
|
41
|
+
[1.4.1]: https://github.com/Invoca/exceptional_synchrony/compare/v1.4.0...v1.4.1
|
42
|
+
[1.4.0]: https://github.com/Invoca/exceptional_synchrony/compare/v1.3.0...v1.4.0
|
32
43
|
[1.3.0]: https://github.com/Invoca/exceptional_synchrony/compare/v1.2.0...v1.3.0
|
33
44
|
[1.2.0]: https://github.com/Invoca/exceptional_synchrony/compare/v1.1.1...v1.2.0
|
34
45
|
[1.1.1]: https://github.com/Invoca/exceptional_synchrony/compare/v1.1.0...v1.1.1
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
exceptional_synchrony (1.4.
|
4
|
+
exceptional_synchrony (1.4.2)
|
5
5
|
em-http-request
|
6
6
|
em-synchrony
|
7
7
|
eventmachine
|
@@ -11,30 +11,30 @@ PATH
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
-
actionmailer (6.1.
|
15
|
-
actionpack (= 6.1.
|
16
|
-
actionview (= 6.1.
|
17
|
-
activejob (= 6.1.
|
18
|
-
activesupport (= 6.1.
|
14
|
+
actionmailer (6.1.3)
|
15
|
+
actionpack (= 6.1.3)
|
16
|
+
actionview (= 6.1.3)
|
17
|
+
activejob (= 6.1.3)
|
18
|
+
activesupport (= 6.1.3)
|
19
19
|
mail (~> 2.5, >= 2.5.4)
|
20
20
|
rails-dom-testing (~> 2.0)
|
21
|
-
actionpack (6.1.
|
22
|
-
actionview (= 6.1.
|
23
|
-
activesupport (= 6.1.
|
21
|
+
actionpack (6.1.3)
|
22
|
+
actionview (= 6.1.3)
|
23
|
+
activesupport (= 6.1.3)
|
24
24
|
rack (~> 2.0, >= 2.0.9)
|
25
25
|
rack-test (>= 0.6.3)
|
26
26
|
rails-dom-testing (~> 2.0)
|
27
27
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
28
|
-
actionview (6.1.
|
29
|
-
activesupport (= 6.1.
|
28
|
+
actionview (6.1.3)
|
29
|
+
activesupport (= 6.1.3)
|
30
30
|
builder (~> 3.1)
|
31
31
|
erubi (~> 1.4)
|
32
32
|
rails-dom-testing (~> 2.0)
|
33
33
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
34
|
-
activejob (6.1.
|
35
|
-
activesupport (= 6.1.
|
34
|
+
activejob (6.1.3)
|
35
|
+
activesupport (= 6.1.3)
|
36
36
|
globalid (>= 0.3.6)
|
37
|
-
activesupport (6.1.
|
37
|
+
activesupport (6.1.3)
|
38
38
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
39
39
|
i18n (>= 1.6, < 2)
|
40
40
|
minitest (>= 5.1)
|
@@ -64,19 +64,21 @@ GEM
|
|
64
64
|
em-synchrony (1.0.6)
|
65
65
|
eventmachine (>= 1.0.0.beta.1)
|
66
66
|
erubi (1.10.0)
|
67
|
+
escalate (0.3.0)
|
67
68
|
eventmachine (1.2.7)
|
68
|
-
exception_handling (2.
|
69
|
+
exception_handling (2.9.0)
|
69
70
|
actionmailer (>= 4.2, < 7.0)
|
70
71
|
actionpack (>= 4.2, < 7.0)
|
71
72
|
activesupport (>= 4.2, < 7.0)
|
72
73
|
contextual_logger (~> 0.7)
|
74
|
+
escalate (~> 0.2)
|
73
75
|
eventmachine (~> 1.0)
|
74
76
|
invoca-utils (~> 0.3)
|
75
77
|
globalid (0.4.2)
|
76
78
|
activesupport (>= 4.2.0)
|
77
79
|
hashdiff (1.0.1)
|
78
80
|
http_parser.rb (0.6.0)
|
79
|
-
i18n (1.8.
|
81
|
+
i18n (1.8.9)
|
80
82
|
concurrent-ruby (~> 1.0)
|
81
83
|
invoca-utils (0.4.1)
|
82
84
|
json (2.5.1)
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'eventmachine'
|
4
4
|
require 'em-http'
|
5
5
|
require 'em-synchrony/em-http'
|
6
|
+
require_relative 'faraday_monkey_patch'
|
6
7
|
|
7
8
|
module ExceptionalSynchrony
|
8
9
|
# It is important for this exception to be inherited from Exception so that
|
@@ -62,6 +63,7 @@ module ExceptionalSynchrony
|
|
62
63
|
def stop
|
63
64
|
@proxy_class.stop
|
64
65
|
@proxy_class.next_tick { } #Fake out EventMachine's epoll mechanism so we don't block until timers fire
|
66
|
+
Thread.current.thread_variable_set(:em_synchrony_reactor_thread, false)
|
65
67
|
end
|
66
68
|
|
67
69
|
def defers_finished?
|
@@ -76,12 +78,7 @@ module ExceptionalSynchrony
|
|
76
78
|
# The on_error option has these possible values:
|
77
79
|
# :log - log any rescued StandardError exceptions and continue
|
78
80
|
# :raise - raise FatalRunError for any rescued StandardError exceptions
|
79
|
-
|
80
|
-
# :em_synchrony - for use when EM::Synchrony is being used in all threads of the given process
|
81
|
-
# :net_http - for use when EM::Synchrony is being used in only some threads of the given process;
|
82
|
-
# in this case requests made over the Faraday connection will block the reactor
|
83
|
-
def run(on_error: :log, faraday_adapter: :em_synchrony, &block)
|
84
|
-
configure_faraday(faraday_adapter)
|
81
|
+
def run(on_error: :log, &block)
|
85
82
|
case on_error
|
86
83
|
when :log then run_with_error_logging(&block)
|
87
84
|
when :raise then run_with_error_raising(&block)
|
@@ -139,16 +136,10 @@ module ExceptionalSynchrony
|
|
139
136
|
|
140
137
|
private
|
141
138
|
|
142
|
-
def configure_faraday(adapter)
|
143
|
-
if defined?(Faraday)
|
144
|
-
adapter.in?([:em_synchrony, :net_http]) or raise ArgumentError, "Invalid faraday_adapter: #{adapter.inspect}"
|
145
|
-
Faraday.default_adapter = adapter
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
139
|
def run_with_error_logging(&block)
|
150
140
|
ensure_completely_safe("run_with_error_logging") do
|
151
141
|
if @proxy_class.respond_to?(:synchrony)
|
142
|
+
Thread.current.thread_variable_set(:em_synchrony_reactor_thread, true)
|
152
143
|
@proxy_class.synchrony(&block)
|
153
144
|
else
|
154
145
|
@proxy_class.run(&block)
|
@@ -161,6 +152,7 @@ module ExceptionalSynchrony
|
|
161
152
|
|
162
153
|
rescue_exceptions_and_ensure_exit("run_with_error_raising") do
|
163
154
|
if @proxy_class.respond_to?(:synchrony)
|
155
|
+
Thread.current.thread_variable_set(:em_synchrony_reactor_thread, true)
|
164
156
|
@proxy_class.synchrony(&run_block)
|
165
157
|
else
|
166
158
|
@proxy_class.run(&run_block)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Monkey patch for the Faraday method that creates the adapter used for a connection.
|
4
|
+
# If the thread local variable :em_synchrony_reactor_thread is true, it overrides this method
|
5
|
+
# in order to force use of the :em_synchrony adapter rather than the :net_http adapter.
|
6
|
+
# This ensures that the Eventmachine reactor does not get blocked by connection i/o.
|
7
|
+
begin
|
8
|
+
require 'faraday'
|
9
|
+
|
10
|
+
module ExceptionalSynchrony
|
11
|
+
# Patch built relative to faraday v0.17.3
|
12
|
+
module FaradayAdapterPatch_v0
|
13
|
+
def adapter(key, *args, &block)
|
14
|
+
|
15
|
+
# BEGIN PATCH
|
16
|
+
if key == :net_http && Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
|
17
|
+
key = :em_synchrony
|
18
|
+
end
|
19
|
+
# END PATCH
|
20
|
+
|
21
|
+
use_symbol(Faraday::Adapter, key, *args, &block)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Patch built relative to faraday v1.3.0 although the ruby2_keywords prefix
|
26
|
+
# was dropped from the adapter method definition to simplify this code
|
27
|
+
module FaradayAdapterPatch_v1
|
28
|
+
def adapter(klass = Faraday::RackBuilder::NO_ARGUMENT, *args, &block)
|
29
|
+
return @adapter if klass == Faraday::RackBuilder::NO_ARGUMENT
|
30
|
+
|
31
|
+
klass = Faraday::Adapter.lookup_middleware(klass) if klass.is_a?(Symbol)
|
32
|
+
|
33
|
+
# BEGIN PATCH
|
34
|
+
if klass == Faraday::Adapter::NetHttp && Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
|
35
|
+
klass = Faraday::Adapter::EMSynchrony
|
36
|
+
end
|
37
|
+
# END PATCH
|
38
|
+
|
39
|
+
@adapter = Faraday::RackBuilder::Handler.new(klass, *args, &block)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
if Faraday::VERSION.start_with?("0")
|
45
|
+
Faraday::RackBuilder.prepend ExceptionalSynchrony::FaradayAdapterPatch_v0
|
46
|
+
else
|
47
|
+
Faraday::RackBuilder.prepend ExceptionalSynchrony::FaradayAdapterPatch_v1
|
48
|
+
end
|
49
|
+
|
50
|
+
rescue LoadError
|
51
|
+
# Monkey patch is not needed if faraday is not available
|
52
|
+
end
|
@@ -64,6 +64,14 @@ describe ExceptionalSynchrony::EventMachineProxy do
|
|
64
64
|
@em.stop
|
65
65
|
end
|
66
66
|
|
67
|
+
it "should set thread variable :em_synchrony_reactor_thread running to false when stop" do
|
68
|
+
@em.run do
|
69
|
+
assert_equal true, Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
|
70
|
+
@em.stop
|
71
|
+
assert_equal false, Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
67
75
|
it "should proxy connect" do
|
68
76
|
ServerClass = Class.new
|
69
77
|
mock(EventMachine).connect(ServerClass, 8080, :handler, :extra_arg).yields(:called)
|
@@ -158,42 +166,6 @@ describe ExceptionalSynchrony::EventMachineProxy do
|
|
158
166
|
end
|
159
167
|
end
|
160
168
|
|
161
|
-
describe "run with faraday" do
|
162
|
-
before do
|
163
|
-
class Faraday
|
164
|
-
class << self
|
165
|
-
attr_reader :default_adapter
|
166
|
-
|
167
|
-
def default_adapter=(adapter)
|
168
|
-
@default_adapter = adapter
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
self.default_adapter = :net_http
|
173
|
-
end
|
174
|
-
|
175
|
-
assert_equal :net_http, Faraday.default_adapter
|
176
|
-
end
|
177
|
-
|
178
|
-
it "sets Faraday default_adapter to :em_synchrony by default if Faraday is defined" do
|
179
|
-
mock(@em).run_with_error_logging
|
180
|
-
@em.run
|
181
|
-
assert_equal :em_synchrony, Faraday.default_adapter
|
182
|
-
end
|
183
|
-
|
184
|
-
it "sets Faraday default_adapter to :net_http if Faraday is defined" do
|
185
|
-
mock(@em).run_with_error_logging
|
186
|
-
@em.run(faraday_adapter: :net_http)
|
187
|
-
assert_equal :net_http, Faraday.default_adapter
|
188
|
-
end
|
189
|
-
|
190
|
-
it "raise ArgumentError if the specified faraday_adapter is invalid" do
|
191
|
-
assert_raises(ArgumentError, "Invalid faraday_adapter: :bogus") do
|
192
|
-
@em.run(faraday_adapter: :bogus)
|
193
|
-
end
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
169
|
{ synchrony: SynchronyProxyMock, run: RunProxyMock }.each do |method, proxy_mock|
|
198
170
|
describe "run" do
|
199
171
|
before do
|
@@ -207,6 +179,10 @@ describe ExceptionalSynchrony::EventMachineProxy do
|
|
207
179
|
end
|
208
180
|
|
209
181
|
describe "without error" do
|
182
|
+
before do
|
183
|
+
Thread.current.thread_variable_set(:em_synchrony_reactor_thread, nil)
|
184
|
+
end
|
185
|
+
|
210
186
|
[:log, :raise].each do |on_error|
|
211
187
|
describe "when using #{method} and on_error = #{on_error}" do
|
212
188
|
it "should dispatch to the proxy's synchrony method instead of run iff synchrony" do
|
@@ -214,6 +190,15 @@ describe ExceptionalSynchrony::EventMachineProxy do
|
|
214
190
|
assert_equal method, (@proxy.run(on_error: on_error) { dispatched = true })
|
215
191
|
assert_equal true, dispatched
|
216
192
|
end
|
193
|
+
|
194
|
+
if method == :synchrony
|
195
|
+
it "should set thread variable :em_synchrony_reactor_thread running to true" do
|
196
|
+
assert_nil Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
|
197
|
+
@proxy.run(on_error: on_error) do
|
198
|
+
assert_equal true, Thread.current.thread_variable_get(:em_synchrony_reactor_thread)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
217
202
|
end
|
218
203
|
end
|
219
204
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exceptional_synchrony
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Invoca
|
@@ -101,6 +101,7 @@ files:
|
|
101
101
|
- lib/exceptional_synchrony.rb
|
102
102
|
- lib/exceptional_synchrony/callback_exceptions.rb
|
103
103
|
- lib/exceptional_synchrony/event_machine_proxy.rb
|
104
|
+
- lib/exceptional_synchrony/faraday_monkey_patch.rb
|
104
105
|
- lib/exceptional_synchrony/limited_work_queue.rb
|
105
106
|
- lib/exceptional_synchrony/parallel_sync.rb
|
106
107
|
- lib/exceptional_synchrony/version.rb
|
@@ -126,9 +127,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
127
|
version: '0'
|
127
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
129
|
requirements:
|
129
|
-
- - "
|
130
|
+
- - ">="
|
130
131
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
132
|
+
version: '0'
|
132
133
|
requirements: []
|
133
134
|
rubygems_version: 3.0.3
|
134
135
|
signing_key:
|