cutoff 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +44 -11
- data/lib/cutoff/patch/net_http.rb +32 -0
- data/lib/cutoff/version.rb +1 -1
- 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: 64171df8b5550b99b603ba4bae4874174cc5e4bcce2632318be777ecc932dce3
|
4
|
+
data.tar.gz: 39ee62f1f743fdce6d9dd3e873bd3acf4d7efd09907d0f9e265e98c786cb7dc9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb41605b534178706b45f3e6921aad80ff0ff50606038d95d9d50267910a590df59969cb77b1c7879d0b2cd429c60205a418e1ff590b1dd7b4e7f4394b0f4f3c
|
7
|
+
data.tar.gz: 713d75df722a2f82414373d482d4a981e9a579069de55262afe12004287abdd5b6f2e7e09052130a3b0ce875658e8177ce519bdadb549dbb92dc8970f9cd0813
|
data/CHANGELOG.md
CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## [0.2.0] - 2021-07-22
|
11
|
+
|
12
|
+
### Added
|
13
|
+
|
14
|
+
- Net::HTTP patch
|
15
|
+
|
10
16
|
## [0.1.0] - 2021-07-19
|
11
17
|
|
12
18
|
### Added
|
@@ -14,4 +20,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
14
20
|
- Cutoff class
|
15
21
|
- Mysql2 patch
|
16
22
|
|
23
|
+
[Unreleased]: https://github.com/justinhoward/cutoff/compare/v0.2.0...HEAD
|
24
|
+
[0.2.0]: https://github.com/justinhoward/cutoff/compare/v0.1.0...v0.2.0
|
17
25
|
[0.1.0]: https://github.com/justinhoward/cutoff/releases/tag/v0.1.0
|
data/README.md
CHANGED
@@ -20,8 +20,8 @@ Cutoff.wrap(5) do
|
|
20
20
|
end
|
21
21
|
```
|
22
22
|
|
23
|
-
It has
|
24
|
-
|
23
|
+
It has built-in patches for Mysql2 and Net::HTTP to auto-insert checkpoints and
|
24
|
+
timeouts.
|
25
25
|
|
26
26
|
```ruby
|
27
27
|
require 'cutoff/patch/mysql2'
|
@@ -50,7 +50,7 @@ single query will take longer than 3 seconds. However, imagine a bad controller
|
|
50
50
|
action or background job executes 100 slow queries. In that case, the queries
|
51
51
|
add up to 300 seconds, much too long.
|
52
52
|
|
53
|
-
Deadlines keep track of the total elapsed time in a request
|
53
|
+
Deadlines keep track of the total elapsed time in a request or job and interrupt
|
54
54
|
it if it takes too long.
|
55
55
|
|
56
56
|
Installation
|
@@ -138,8 +138,11 @@ Patches
|
|
138
138
|
-------------
|
139
139
|
|
140
140
|
Cutoff is in early stages, but it aims to provide patches for common networked
|
141
|
-
dependencies.
|
142
|
-
|
141
|
+
dependencies. Patches automatically insert useful checkpoints and timeouts. The
|
142
|
+
patches so far are for `mysql2` and `Net::HTTP`. They are not loaded by default,
|
143
|
+
so you need to require them manually.
|
144
|
+
|
145
|
+
For example, to load the Mysql2 patch:
|
143
146
|
|
144
147
|
```ruby
|
145
148
|
# In your Gemfile
|
@@ -152,10 +155,14 @@ require 'cutoff'
|
|
152
155
|
require 'cutoff/patch/mysql2'
|
153
156
|
```
|
154
157
|
|
155
|
-
|
156
|
-
|
158
|
+
### Mysql2
|
159
|
+
|
160
|
+
Once it is enabled, any `Mysql2::Client` object will respect the current
|
161
|
+
class-level cutoff if one is set.
|
157
162
|
|
158
163
|
```ruby
|
164
|
+
require 'cutoff/patch/mysql2'
|
165
|
+
|
159
166
|
client = Mysql2::Client.new
|
160
167
|
Cutoff.wrap(3) do
|
161
168
|
sleep(4)
|
@@ -183,6 +190,33 @@ Cutoff.wrap(3) do
|
|
183
190
|
end
|
184
191
|
```
|
185
192
|
|
193
|
+
### Net::HTTP
|
194
|
+
|
195
|
+
Once it is enabled, any `Net::HTTP` requests will respect the current
|
196
|
+
class-level cutoff if one is set.
|
197
|
+
|
198
|
+
```ruby
|
199
|
+
require 'cutoff/patch/net_http'
|
200
|
+
|
201
|
+
Cutoff.wrap(3) do
|
202
|
+
sleep(5)
|
203
|
+
|
204
|
+
# The cutoff is expired, so this hits a checkpoint and will not be executed
|
205
|
+
Net::HTTP.get(URI.parse('http://example.com'))
|
206
|
+
end
|
207
|
+
|
208
|
+
Cutoff.wrap(3) do
|
209
|
+
sleep(1.5)
|
210
|
+
|
211
|
+
# The cutoff has 1.5 seconds left, so this request will be executed
|
212
|
+
# open_timeout, read_timeout, and write_timeout (Ruby >= 2.6) will each
|
213
|
+
# be set to 1.5
|
214
|
+
# This means the overall time can be > 1.5 since the combined phases can take
|
215
|
+
# up to 4.5 seconds
|
216
|
+
Net::HTTP.get(URI.parse('http://example.com'))
|
217
|
+
end
|
218
|
+
```
|
219
|
+
|
186
220
|
Timing a Rails Controller
|
187
221
|
---------------------------
|
188
222
|
|
@@ -360,10 +394,9 @@ never interrupt a running program unless:
|
|
360
394
|
- `checkpoint!` is called
|
361
395
|
- a network timeout is exceeded
|
362
396
|
|
363
|
-
Patches
|
364
|
-
|
365
|
-
|
366
|
-
is dangerous][julia_evans].
|
397
|
+
Patches are designed to ease the burden on developers to manually call
|
398
|
+
`checkpoint!` or configure network timeouts. The ruby `Timeout` class is not
|
399
|
+
used. See Julia Evans' post on [Why Ruby's Timeout is dangerous][julia_evans].
|
367
400
|
|
368
401
|
Patches are only applied by explicit opt-in, and Cutoff can always be used as a
|
369
402
|
standalone library.
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal:true
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
|
5
|
+
class Cutoff
|
6
|
+
module Patch
|
7
|
+
# Adds a checkpoint for starting HTTP requests and sets network timeouts
|
8
|
+
# to the remaining time
|
9
|
+
module NetHttp
|
10
|
+
# Construct a {Net::HTTP}, but with the timeouts set to the remaining
|
11
|
+
# cutoff time if one is active
|
12
|
+
def initialize(address, port = nil)
|
13
|
+
super
|
14
|
+
return unless (cutoff = Cutoff.current)
|
15
|
+
|
16
|
+
@open_timeout = cutoff.seconds_remaining
|
17
|
+
@read_timeout = cutoff.seconds_remaining
|
18
|
+
@write_timeout = cutoff.seconds_remaining
|
19
|
+
end
|
20
|
+
|
21
|
+
# Same as the original start, but with a cutoff checkpoint
|
22
|
+
#
|
23
|
+
# @see {Net::HTTP#start}
|
24
|
+
def start
|
25
|
+
Cutoff.checkpoint!
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Net::HTTP.prepend(Cutoff::Patch::NetHttp)
|
data/lib/cutoff/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cutoff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Howard
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-07-
|
11
|
+
date: 2021-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -87,13 +87,14 @@ files:
|
|
87
87
|
- lib/cutoff/error.rb
|
88
88
|
- lib/cutoff/patch.rb
|
89
89
|
- lib/cutoff/patch/mysql2.rb
|
90
|
+
- lib/cutoff/patch/net_http.rb
|
90
91
|
- lib/cutoff/version.rb
|
91
92
|
homepage: https://github.com/justinhoward/cutoff
|
92
93
|
licenses:
|
93
94
|
- MIT
|
94
95
|
metadata:
|
95
96
|
changelog_uri: https://github.com/justinhoward/cutoff/blob/master/CHANGELOG.md
|
96
|
-
documentation_uri: https://www.rubydoc.info/gems/cutoff/0.
|
97
|
+
documentation_uri: https://www.rubydoc.info/gems/cutoff/0.2.0
|
97
98
|
post_install_message:
|
98
99
|
rdoc_options: []
|
99
100
|
require_paths:
|