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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7337c98f6e124b7e27327707ad7996bea893fe5c005ae57627e855ec35c77ff4
4
- data.tar.gz: 2603dc05990ab4c3f257409382f8fc6453f8e22446a82a1ad9841564b509994e
3
+ metadata.gz: f2f574bdd917d5a7cab99f7844581ad87a86666f29678aa125aa68fdfb709d35
4
+ data.tar.gz: 68d9c838bcf933a4edb2c51dd0701e36d24dd99a2faf5aa526ce038541b0163b
5
5
  SHA512:
6
- metadata.gz: bd0b2894a70161f7162c465aacf315cada6748267d88590bb943d3c68ad382f0ed1b910224738f54b1a1ada219f894b9fd64bcb2f06c7f3b95f0c9b3efb1d218
7
- data.tar.gz: b9b7c5fde46b71d32651108b855f4396517e32a73915b1e3bc09e258a5bcee678d3946ca3fc6c768eef1deebc0edaa66e4e41898b3a08a6d95e993c0bc12339e
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.0] - UNRELEASED
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 `:faraday_adapter` option to `EventMachineProxy#run` with a default of `:em_synchrony`
12
- so that the reactor does not get blocked when using `Faraday` connections
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.0.pre.2)
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.1)
15
- actionpack (= 6.1.1)
16
- actionview (= 6.1.1)
17
- activejob (= 6.1.1)
18
- activesupport (= 6.1.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.1)
22
- actionview (= 6.1.1)
23
- activesupport (= 6.1.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.1)
29
- activesupport (= 6.1.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.1)
35
- activesupport (= 6.1.1)
34
+ activejob (6.1.3)
35
+ activesupport (= 6.1.3)
36
36
  globalid (>= 0.3.6)
37
- activesupport (6.1.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.8.1)
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.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
- # The faraday_adapter option has these possible values that only apply if Faraday connections are in use:
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
@@ -1,3 +1,3 @@
1
1
  module ExceptionalSynchrony
2
- VERSION = '1.4.0.pre.2'
2
+ VERSION = '1.4.2'
3
3
  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.0.pre.2
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: 1.3.1
132
+ version: '0'
132
133
  requirements: []
133
134
  rubygems_version: 3.0.3
134
135
  signing_key: