exceptional_synchrony 1.4.0.pre.2 → 1.4.0.pre.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7337c98f6e124b7e27327707ad7996bea893fe5c005ae57627e855ec35c77ff4
4
- data.tar.gz: 2603dc05990ab4c3f257409382f8fc6453f8e22446a82a1ad9841564b509994e
3
+ metadata.gz: f2d07494229878e6b59b249b36914d1a6487393ebd636ac239c0f865abbd1bf1
4
+ data.tar.gz: af0fba3287a3c9dad53c46cb3f6290c2ba478cd9ef41a1811f8ac4d008837564
5
5
  SHA512:
6
- metadata.gz: bd0b2894a70161f7162c465aacf315cada6748267d88590bb943d3c68ad382f0ed1b910224738f54b1a1ada219f894b9fd64bcb2f06c7f3b95f0c9b3efb1d218
7
- data.tar.gz: b9b7c5fde46b71d32651108b855f4396517e32a73915b1e3bc09e258a5bcee678d3946ca3fc6c768eef1deebc0edaa66e4e41898b3a08a6d95e993c0bc12339e
6
+ metadata.gz: ccbed6964c6408c17d178d48641c0f96941ee997f55b5656d59c1d3f0a31c97a2c5de2fd2f752297ee99cbd1d0e35e86746adf2cf44a0d29b8cb9df120f53dc4
7
+ data.tar.gz: b04f34c08e1a9da226a9bf679985017cd6e86b18f173152169e7be9cf7e143c46fbe85cee265ce6112e4fc03a369abb39cbf14cf9070684375a31c4f4c941c3d
data/CHANGELOG.md CHANGED
@@ -8,8 +8,7 @@ All notable changes to this project will be documented in this file.
8
8
 
9
9
  ## [1.4.0] - UNRELEASED
10
10
  ### 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
11
+ - Added use of Thread local variable to indicate when Eventmachine is running using EM::Synchrony
13
12
 
14
13
  ## [1.3.0] - 2021-02-04
15
14
  ### Added
@@ -29,6 +28,7 @@ All notable changes to this project will be documented in this file.
29
28
  ## [1.1.1] - 2020-05-03
30
29
  - Replace hobo_support with invoca_utils
31
30
 
31
+ [1.4.0]: https://github.com/Invoca/exceptional_synchrony/compare/v1.3.0...v1.4.0
32
32
  [1.3.0]: https://github.com/Invoca/exceptional_synchrony/compare/v1.2.0...v1.3.0
33
33
  [1.2.0]: https://github.com/Invoca/exceptional_synchrony/compare/v1.1.1...v1.2.0
34
34
  [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.0.pre.3)
5
5
  em-http-request
6
6
  em-synchrony
7
7
  eventmachine
@@ -87,15 +87,13 @@ GEM
87
87
  mini_mime (>= 0.1.1)
88
88
  method_source (1.0.0)
89
89
  mini_mime (1.0.2)
90
- mini_portile2 (2.5.0)
91
90
  minitest (5.14.0)
92
91
  minitest-reporters (1.4.2)
93
92
  ansi
94
93
  builder
95
94
  minitest (>= 5.0)
96
95
  ruby-progressbar
97
- nokogiri (1.11.1)
98
- mini_portile2 (~> 2.5.0)
96
+ nokogiri (1.11.1-x86_64-darwin)
99
97
  racc (~> 1.4)
100
98
  pry (0.13.1)
101
99
  coderay (~> 1.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 FaradayPatch_v1
28
+ def adapter(klass = NO_ARGUMENT, *args, &block)
29
+ return @adapter if klass == 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 = self.class::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.0.pre.3'
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.0.pre.3
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