retries 0.0.1 → 0.0.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.
- data/README.md +22 -5
- data/lib/retries.rb +22 -8
- data/lib/retries/version.rb +2 -2
- data/test/retries_test.rb +16 -0
- metadata +31 -11
data/README.md
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
# Retries
|
2
2
|
|
3
|
-
Retries is a
|
3
|
+
Retries is a gem that provides a single function, `with_retries`, to evaluate a block with randomized,
|
4
4
|
truncated, exponential backoff.
|
5
5
|
|
6
|
-
There are similar projects out there (see [
|
7
|
-
[
|
8
|
-
backoff scheme yourself. If you don't need randomized exponential backoff, you should check out
|
6
|
+
There are similar projects out there (see [retry_block](https://github.com/afazio/retry_block) and
|
7
|
+
[retry_this](https://bitbucket.org/amanking/retry_this/wiki/Home), for example) but these will require you to
|
8
|
+
implement the backoff scheme yourself. If you don't need randomized exponential backoff, you should check out
|
9
|
+
those gems.
|
9
10
|
|
10
11
|
## Installation
|
11
12
|
|
@@ -19,7 +20,6 @@ or a flaky service. Here's how you can try it three times before failing:
|
|
19
20
|
|
20
21
|
``` ruby
|
21
22
|
require "retries"
|
22
|
-
|
23
23
|
with_retries(:max_tries => 3) { do_the_thing }
|
24
24
|
```
|
25
25
|
|
@@ -82,6 +82,18 @@ seconds:
|
|
82
82
|
with_retries(:max_tries => 10, :base_sleep_seconds => 0.1, :max_sleep_seconds => 2.0) { do_the_thing }
|
83
83
|
```
|
84
84
|
|
85
|
+
### Testing
|
86
|
+
|
87
|
+
In tests, you may wish to test that retries are being performed without any delay for sleeping:
|
88
|
+
|
89
|
+
``` ruby
|
90
|
+
Retries.sleep_enabled = false
|
91
|
+
with_retries(:max_tries => 100) { raise "Boo!" } # Now this fails fast
|
92
|
+
```
|
93
|
+
|
94
|
+
Of course, this will mask any errors to the `:base_sleep_seconds` and `:max_sleep_seconds` parameters, so use
|
95
|
+
with caution.
|
96
|
+
|
85
97
|
## Issues
|
86
98
|
|
87
99
|
File tickets here on Github.
|
@@ -93,6 +105,11 @@ To run the tests: first clone the repo, then
|
|
93
105
|
$ bundle install
|
94
106
|
$ bundle exec rake test
|
95
107
|
|
108
|
+
## Authors
|
109
|
+
|
110
|
+
* Harry Robertson
|
111
|
+
* Caleb Spare
|
112
|
+
|
96
113
|
## License
|
97
114
|
|
98
115
|
Retries is released under the [MIT License](http://opensource.org/licenses/mit-license.php/).
|
data/lib/retries.rb
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
require "retries/version"
|
2
2
|
|
3
|
+
class Retries
|
4
|
+
class << self
|
5
|
+
# You can use this to turn off all sleeping in with_retries. This can be useful in tests. Defaults to
|
6
|
+
# `true`.
|
7
|
+
attr_accessor :sleep_enabled
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
Retries.sleep_enabled = true
|
12
|
+
|
3
13
|
module Kernel
|
4
14
|
# Runs the supplied code block an retries with an exponential backoff.
|
5
15
|
#
|
@@ -36,15 +46,19 @@ module Kernel
|
|
36
46
|
rescue *exception_types_to_rescue => exception
|
37
47
|
raise exception if attempts >= max_tries
|
38
48
|
handler.call(exception, attempts) if handler
|
39
|
-
#
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
49
|
+
# Don't sleep at all if sleeping is disabled (used in testing).
|
50
|
+
if Retries.sleep_enabled
|
51
|
+
# The sleep time is an exponentially-increasing function of base_sleep_seconds. But, it never exceeds
|
52
|
+
# max_sleep_seconds.
|
53
|
+
sleep_seconds = [base_sleep_seconds * (2 ** (attempts - 1)), max_sleep_seconds].min
|
54
|
+
# Randomize to a random value in the range sleep_seconds/2 .. sleep_seconds
|
55
|
+
sleep_seconds = sleep_seconds * (0.5 * (1 + rand()))
|
56
|
+
# But never sleep less than base_sleep_seconds
|
57
|
+
sleep_seconds = [base_sleep_seconds, sleep_seconds].max
|
58
|
+
sleep sleep_seconds
|
59
|
+
end
|
47
60
|
retry
|
48
61
|
end
|
49
62
|
end
|
50
63
|
end
|
64
|
+
|
data/lib/retries/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = "0.0.
|
1
|
+
class Retries
|
2
|
+
VERSION = "0.0.2"
|
3
3
|
end
|
data/test/retries_test.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "scope"
|
2
2
|
require "minitest/autorun"
|
3
|
+
require "timeout"
|
3
4
|
|
4
5
|
$:.unshift File.join(File.dirname(__FILE__), "../lib")
|
5
6
|
require "retries"
|
@@ -8,6 +9,10 @@ class CustomErrorA < RuntimeError; end
|
|
8
9
|
class CustomErrorB < RuntimeError; end
|
9
10
|
|
10
11
|
class RetriesTest < Scope::TestCase
|
12
|
+
setup do
|
13
|
+
Retries.sleep_enabled = true
|
14
|
+
end
|
15
|
+
|
11
16
|
context "with_retries" do
|
12
17
|
should "retry until successful" do
|
13
18
|
tries = 0
|
@@ -69,5 +74,16 @@ class RetriesTest < Scope::TestCase
|
|
69
74
|
assert_equal 4, tries
|
70
75
|
assert_equal 3, exception_handler_run_times
|
71
76
|
end
|
77
|
+
|
78
|
+
should "not sleep if Retries.sleep_enabled is false" do
|
79
|
+
Retries.sleep_enabled = false
|
80
|
+
assert_raises(RuntimeError) do # If we get a Timeout::Error, this won't pass.
|
81
|
+
Timeout.timeout(2) do
|
82
|
+
with_retries(:max_tries => 10, :base_sleep_seconds => 100, :max_sleep_seconds => 10000) do
|
83
|
+
raise "blah"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
72
88
|
end
|
73
89
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: retries
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: scope
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: yard
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: redcarpet
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,7 +69,12 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
58
78
|
description: Retries is a gem for retrying blocks with randomized exponential backoff.
|
59
79
|
email:
|
60
80
|
- caleb@ooyala.com
|
@@ -92,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
112
|
version: '0'
|
93
113
|
requirements: []
|
94
114
|
rubyforge_project:
|
95
|
-
rubygems_version: 1.8.
|
115
|
+
rubygems_version: 1.8.23
|
96
116
|
signing_key:
|
97
117
|
specification_version: 3
|
98
118
|
summary: Retries is a gem for retrying blocks with randomized exponential backoff.
|