bosh_common 1.2641.0 → 1.2652.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/common/retryable.rb +32 -10
- data/lib/common/thread_pool.rb +8 -10
- data/lib/common/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a699a5bce247048d9a803c1ab8268b40e787871
|
4
|
+
data.tar.gz: 88d8d7150bc04ec1a18d1b90ebe2fabc2d4c0025
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f52497b5219a4ddfffb91880fd5d533bc5f23a9fdf6db76697e85272c33ad889484c746d65fdfd094c76ff79ae2a086e0fe9b7b96d39d36ca47fcd4985bb302f
|
7
|
+
data.tar.gz: 8871fbec389398907aeda81d0e9a2d7a2bc4d165483d3d2ef3d6917e018ce9722123154c64f3cd5aafec5b755c5658d5ff880e0a8e05640fe216f221d9e564c5
|
data/lib/common/retryable.rb
CHANGED
@@ -7,24 +7,32 @@ module Bosh
|
|
7
7
|
|
8
8
|
@ensure_callback = opts[:ensure]
|
9
9
|
@matching = opts[:matching]
|
10
|
-
@on_exception = [opts[:on]].flatten
|
11
10
|
@try_count = 0
|
12
11
|
@retry_exception = nil
|
13
12
|
@retry_limit = opts[:tries]
|
14
13
|
@sleeper = opts[:sleep]
|
14
|
+
|
15
|
+
@matchers = Array(opts[:on]).map do |klass_or_matcher|
|
16
|
+
if klass_or_matcher.is_a?(Class)
|
17
|
+
ErrorMatcher.by_class(klass_or_matcher)
|
18
|
+
else
|
19
|
+
klass_or_matcher
|
20
|
+
end
|
21
|
+
end
|
15
22
|
end
|
16
23
|
|
17
|
-
#
|
18
|
-
def retryer(&
|
24
|
+
# Loops until the block returns a true value
|
25
|
+
def retryer(&blk)
|
19
26
|
loop do
|
20
27
|
@try_count += 1
|
21
|
-
y =
|
22
|
-
@retry_exception = nil
|
28
|
+
y = blk.call(@try_count, @retry_exception)
|
29
|
+
@retry_exception = nil # no exception was raised in the block
|
23
30
|
return y if y
|
24
31
|
raise Bosh::Common::RetryCountExceeded if @try_count >= @retry_limit
|
25
32
|
wait
|
26
33
|
end
|
27
|
-
rescue
|
34
|
+
rescue Exception => exception
|
35
|
+
raise unless @matchers.any? { |m| m.matches?(exception) }
|
28
36
|
raise unless exception.message =~ @matching
|
29
37
|
raise if @try_count >= @retry_limit
|
30
38
|
|
@@ -41,7 +49,6 @@ module Bosh
|
|
41
49
|
merged_options = default_options.merge(options)
|
42
50
|
invalid_options = merged_options.keys - default_options.keys
|
43
51
|
raise ArgumentError.new("Invalid options: #{invalid_options.join(", ")}") unless invalid_options.empty?
|
44
|
-
|
45
52
|
merged_options
|
46
53
|
end
|
47
54
|
|
@@ -51,13 +58,14 @@ module Bosh
|
|
51
58
|
sleep: exponential_sleeper,
|
52
59
|
on: [],
|
53
60
|
matching: /.*/,
|
54
|
-
ensure: Proc.new {}
|
61
|
+
ensure: Proc.new {},
|
55
62
|
}
|
56
63
|
end
|
57
64
|
|
58
65
|
def wait
|
59
66
|
sleep(@sleeper.respond_to?(:call) ? @sleeper.call(@try_count, @retry_exception) : @sleeper)
|
60
|
-
rescue
|
67
|
+
rescue Exception => exception
|
68
|
+
raise unless @matchers.any? { |m| m.matches?(exception) }
|
61
69
|
# SignalException could be raised while sleeping, so if you want to catch it,
|
62
70
|
# it need to be passed in the list of exceptions to ignore
|
63
71
|
end
|
@@ -69,6 +77,20 @@ module Bosh
|
|
69
77
|
def sleep(*args, &blk)
|
70
78
|
Kernel.sleep(*args, &blk)
|
71
79
|
end
|
80
|
+
|
81
|
+
class ErrorMatcher
|
82
|
+
def self.by_class(klass)
|
83
|
+
new(klass, /.*/)
|
84
|
+
end
|
85
|
+
|
86
|
+
def initialize(klass, message_regex)
|
87
|
+
@klass = klass
|
88
|
+
@message_regex = message_regex
|
89
|
+
end
|
90
|
+
|
91
|
+
def matches?(error)
|
92
|
+
!!(error.kind_of?(@klass) && error.message =~ @message_regex)
|
93
|
+
end
|
94
|
+
end
|
72
95
|
end
|
73
96
|
end
|
74
|
-
|
data/lib/common/thread_pool.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'logger'
|
2
2
|
|
3
3
|
module Bosh
|
4
4
|
class ThreadPool
|
@@ -45,14 +45,14 @@ module Bosh
|
|
45
45
|
@actions << block
|
46
46
|
if @state == :open
|
47
47
|
if @available_threads > 0
|
48
|
-
@logger.debug(
|
48
|
+
@logger.debug('Creating new thread')
|
49
49
|
@available_threads -= 1
|
50
50
|
create_thread
|
51
51
|
else
|
52
|
-
@logger.debug(
|
52
|
+
@logger.debug('All threads are currently busy, queuing action')
|
53
53
|
end
|
54
54
|
elsif @state == :paused
|
55
|
-
@logger.debug(
|
55
|
+
@logger.debug('Pool is paused, queueing action')
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
@@ -64,10 +64,8 @@ module Bosh
|
|
64
64
|
action = nil
|
65
65
|
@lock.synchronize do
|
66
66
|
action = @actions.shift unless @boom
|
67
|
-
|
68
|
-
@logger.debug(
|
69
|
-
else
|
70
|
-
@logger.debug("Thread is no longer needed, cleaning up")
|
67
|
+
unless action
|
68
|
+
@logger.debug('Thread is no longer needed, cleaning up')
|
71
69
|
@available_threads += 1
|
72
70
|
@threads.delete(thread) if @state == :open
|
73
71
|
end
|
@@ -103,7 +101,7 @@ module Bosh
|
|
103
101
|
end
|
104
102
|
|
105
103
|
def wait
|
106
|
-
@logger.debug(
|
104
|
+
@logger.debug('Waiting for tasks to complete')
|
107
105
|
@lock.synchronize do
|
108
106
|
@cv.wait(@lock) while working?
|
109
107
|
raise @boom if @boom
|
@@ -112,7 +110,7 @@ module Bosh
|
|
112
110
|
|
113
111
|
def shutdown
|
114
112
|
return if @state == :closed
|
115
|
-
@logger.debug(
|
113
|
+
@logger.debug('Shutting down pool')
|
116
114
|
@lock.synchronize do
|
117
115
|
return if @state == :closed
|
118
116
|
@state = :closed
|
data/lib/common/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh_common
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2652.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- VMware
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: semi_semantic
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
version: 1.1.0
|
27
27
|
description: |-
|
28
28
|
BOSH common
|
29
|
-
|
29
|
+
43d2e8
|
30
30
|
email: support@cloudfoundry.com
|
31
31
|
executables: []
|
32
32
|
extensions: []
|