slowpoke 0.1.0 → 0.1.1

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
  SHA1:
3
- metadata.gz: 29835ce4edb81b06635ee82405908c32d490623a
4
- data.tar.gz: 8653542563bcee20f8c5288b327a2bc6337f707b
3
+ metadata.gz: c5f0a6122b30b1ab9e451cb58a294368a13e9925
4
+ data.tar.gz: 9970da3afc5dab294ebdd817c6b412faebbc6577
5
5
  SHA512:
6
- metadata.gz: a24ee1b1e5f943bbc462a0f3ace64178f2a5ae9bf219fce257e4d97193e760179babc07bb80d79bddeca82343f68a0e2b158a9510dee91f22e943e67e7498024
7
- data.tar.gz: bc81cadcc3aaa7b54bf549e84d79c1e773f91895b3a795f4fd69e3f34845753f24358204a22c625d720fdcb98f9db08b43a526d14d58d3c01e0f8c1554239498
6
+ metadata.gz: bcd4a2ff4292b535615947f440cbef41037a0aaa4e61d9f8d478158875172f76c79dff4f4bbba3751cba7c1e674918e150053520aab52864fc45ece66a6bcb44
7
+ data.tar.gz: cf6a6cf5030ce46c9a45dd661472865fd6af88844027ad2ab38c35e8988ad4fca4fd9d797e4bb545684a204cdd14782447b363748cc09b9c43e194485205b9a6
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ ## 0.1.1
2
+
3
+ - Fixed safer service timeouts
4
+ - Added migration statement timeout
data/README.md CHANGED
@@ -36,6 +36,12 @@ or set:
36
36
  ENV["REQUEST_TIMEOUT"]
37
37
  ```
38
38
 
39
+ Test by adding a `sleep` call to one of your actions:
40
+
41
+ ```ruby
42
+ sleep(20)
43
+ ```
44
+
39
45
  Subscribe to timeouts with:
40
46
 
41
47
  ```ruby
@@ -48,17 +54,47 @@ To learn more, see the [Rack::Timeout documentation](https://github.com/heroku/r
48
54
 
49
55
  ## Database Timeouts
50
56
 
51
- For PostgreSQL, set a statement timeout in `config/database.yml`:
57
+ For PostgreSQL, set connect and statement timeouts in `config/database.yml`:
52
58
 
53
59
  ```yaml
54
60
  production:
61
+ connect_timeout: 1 # sec
55
62
  variables:
56
- statement_timeout: 30000 # ms
63
+ statement_timeout: 250 # ms
64
+ ```
65
+
66
+ To use a different statement timeout for migrations, set:
67
+
68
+ ```ruby
69
+ ENV["MIGRATION_STATEMENT_TIMEOUT"] = 60000 # ms
70
+ ```
71
+
72
+ Test connect timeouts by setting your database host to an [unroutable IP](http://stackoverflow.com/questions/100841/artificially-create-a-connection-timeout-error).
73
+
74
+ ```yaml
75
+ development:
76
+ host: 10.255.255.1
77
+ ```
78
+
79
+ Test statement timeouts with the [pg_sleep](http://www.postgresql.org/docs/9.0/static/functions-datetime.html#FUNCTIONS-DATETIME-DELAY) function.
80
+
81
+ ```sql
82
+ SELECT pg_sleep(20);
57
83
  ```
58
84
 
59
85
  ## Upgrading
60
86
 
61
- `0.1.0` removes database timeouts, since Rails supports them by default.
87
+ `0.1.0` removes database timeouts, since Rails supports them by default. To restore the previous behavior, use:
88
+
89
+ ```yaml
90
+ production:
91
+ variables:
92
+ statement_timeout: <%= Slowpoke.timeout * 1000 %>
93
+ ```
94
+
95
+ ## History
96
+
97
+ View the [changelog](https://github.com/ankane/slowpoke/blob/master/CHANGELOG.md)
62
98
 
63
99
  ## Contributing
64
100
 
data/lib/slowpoke.rb CHANGED
@@ -2,6 +2,8 @@ require "slowpoke/version"
2
2
  require "rack-timeout"
3
3
  require "safely_block"
4
4
  require "slowpoke/controller"
5
+ require "slowpoke/middleware"
6
+ require "slowpoke/migration"
5
7
  require "slowpoke/railtie"
6
8
  require "action_dispatch/middleware/exception_wrapper"
7
9
  require "action_controller/base"
@@ -28,18 +30,11 @@ Rack::Timeout.unregister_state_change_observer(:logger)
28
30
 
29
31
  # process protection and notifications
30
32
  Rack::Timeout.register_state_change_observer(:slowpoke) do |env|
31
- case env[Rack::Timeout::ENV_INFO_KEY].state
32
- when :timed_out
33
+ if env[Rack::Timeout::ENV_INFO_KEY].state == :timed_out
33
34
  env[Slowpoke::ENV_KEY] = true
34
35
 
35
36
  # TODO better payload
36
37
  ActiveSupport::Notifications.instrument("timeout.slowpoke", {})
37
- when :completed
38
- # extremely important
39
- # protect the process with a restart
40
- # https://github.com/heroku/rack-timeout/issues/39
41
- # can't do in timed_out state consistently
42
- Process.kill("QUIT", Process.pid) if env[Slowpoke::ENV_KEY]
43
38
  end
44
39
  end
45
40
 
@@ -0,0 +1,23 @@
1
+ module Slowpoke
2
+ class Middleware
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def call(env)
8
+ response = @app.call(env)
9
+ if env[Slowpoke::ENV_KEY]
10
+ # extremely important
11
+ # protect the process with a restart
12
+ # https://github.com/heroku/rack-timeout/issues/39
13
+ # can't do in timed_out state consistently
14
+ if defined?(::PhusionPassenger)
15
+ `passenger-config detach-process #{Process.pid}`
16
+ else
17
+ Process.kill("QUIT", Process.pid)
18
+ end
19
+ end
20
+ response
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ module Slowpoke
2
+ module Migration
3
+ def connection
4
+ if ENV["MIGRATION_STATEMENT_TIMEOUT"]
5
+ @connection_with_timeout ||= begin
6
+ config = ActiveRecord::Base.connection_config
7
+ config["variables"] ||= {}
8
+ config["variables"]["statement_timeout"] = ENV["MIGRATION_STATEMENT_TIMEOUT"].to_i
9
+ ActiveRecord::Base.establish_connection(config)
10
+ ActiveRecord::Base.connection
11
+ end
12
+ else
13
+ super
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ ActiveRecord::Migration.prepend(Slowpoke::Migration)
@@ -6,6 +6,7 @@ module Slowpoke
6
6
  # prevent RequestExpiryError from killing web server
7
7
  app.config.middleware.delete "Rack::Timeout"
8
8
  app.config.middleware.insert_before "ActionDispatch::RemoteIp", "Rack::Timeout"
9
+ app.config.middleware.insert 0, Slowpoke::Middleware
9
10
  end
10
11
  end
11
12
  end
@@ -1,3 +1,3 @@
1
1
  module Slowpoke
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/slowpoke.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Slowpoke::VERSION
9
9
  spec.authors = ["Andrew Kane"]
10
10
  spec.email = ["andrew@chartkick.com"]
11
- spec.summary = "Timeouts made easy"
12
- spec.description = "Timeouts made easy"
11
+ spec.summary = "Rack::Timeout is great. Slowpoke makes it better."
12
+ spec.description = "Rack::Timeout is great. Slowpoke makes it better."
13
13
  spec.homepage = "https://github.com/ankane/slowpoke"
14
14
  spec.license = "MIT"
15
15
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slowpoke
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-25 00:00:00.000000000 Z
11
+ date: 2015-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -80,7 +80,7 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '10.0'
83
- description: Timeouts made easy
83
+ description: Rack::Timeout is great. Slowpoke makes it better.
84
84
  email:
85
85
  - andrew@chartkick.com
86
86
  executables: []
@@ -88,6 +88,7 @@ extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
90
  - ".gitignore"
91
+ - CHANGELOG.md
91
92
  - Gemfile
92
93
  - LICENSE.txt
93
94
  - README.md
@@ -96,6 +97,8 @@ files:
96
97
  - lib/generators/slowpoke/templates/503.html
97
98
  - lib/slowpoke.rb
98
99
  - lib/slowpoke/controller.rb
100
+ - lib/slowpoke/middleware.rb
101
+ - lib/slowpoke/migration.rb
99
102
  - lib/slowpoke/railtie.rb
100
103
  - lib/slowpoke/version.rb
101
104
  - slowpoke.gemspec
@@ -122,6 +125,6 @@ rubyforge_project:
122
125
  rubygems_version: 2.4.5
123
126
  signing_key:
124
127
  specification_version: 4
125
- summary: Timeouts made easy
128
+ summary: Rack::Timeout is great. Slowpoke makes it better.
126
129
  test_files: []
127
130
  has_rdoc: