knapsack_pro 1.21.0 → 1.22.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 +11 -0
- data/lib/knapsack_pro/client/connection.rb +3 -3
- data/lib/knapsack_pro/version.rb +1 -1
- data/spec/knapsack_pro/client/connection_spec.rb +42 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c1620234d6399fb4f66840cc101d290f70e9b8c6bbb6c7f2df7b2f2fa16062a
|
4
|
+
data.tar.gz: f0d3b9c93244b37baa1817bb2b910d1e4e1f3a84e13482f90755a528a04c8a5a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5bfe8f48e23514d4dc3c9dd957fbaa5d14d39fae4b9c6eb5c9426eeaae9a57007fb379d6a00860ea30b4cb9766444678e55bf306bba742cf80d470387e22c9a7
|
7
|
+
data.tar.gz: 171de7e1e9c7dbf18b291ffd0f183459e0b9a41b0c60ff2c15de4867db6c07caefcae8e3d57718a001e04c49320878cc022656cfc82709b948e48770dafb2b5c
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
### 1.22.0
|
4
|
+
|
5
|
+
* Increase request retry timebox from 4s to 8s to not flood Knapsack Pro API with too many requests in a short period of time and to give time for API server to autoscale and add additional machines to serve traffic
|
6
|
+
* When Fallback Mode is disabled with env `KNAPSACK_PRO_FALLBACK_MODE_ENABLED=false` then retry the request to Knapsack Pro API for 6 times instead of only 3 times.
|
7
|
+
|
8
|
+
Here is related [info why some users want to disable Fallback Mode](https://github.com/KnapsackPro/knapsack_pro-ruby#required-ci-configuration-if-you-use-retry-single-failed-ci-node-feature-on-your-ci-server-when-knapsack_pro_fixed_queue_splittrue-in-queue-mode-or-knapsack_pro_fixed_test_suite_splittrue-in-regular-mode).
|
9
|
+
|
10
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/pull/112
|
11
|
+
|
12
|
+
https://github.com/KnapsackPro/knapsack_pro-ruby/compare/v1.21.0...v1.22.0
|
13
|
+
|
3
14
|
### 1.21.0
|
4
15
|
|
5
16
|
* Automatically detect slow test files for RSpec and split them by test examples when `KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true`
|
@@ -4,8 +4,8 @@ module KnapsackPro
|
|
4
4
|
class ServerError < StandardError; end
|
5
5
|
|
6
6
|
TIMEOUT = 15
|
7
|
-
MAX_RETRY = 3
|
8
|
-
REQUEST_RETRY_TIMEBOX =
|
7
|
+
MAX_RETRY = -> { KnapsackPro::Config::Env.fallback_mode_enabled? ? 3 : 6 }
|
8
|
+
REQUEST_RETRY_TIMEBOX = 8
|
9
9
|
|
10
10
|
def initialize(action)
|
11
11
|
@action = action
|
@@ -118,7 +118,7 @@ module KnapsackPro
|
|
118
118
|
rescue ServerError, Errno::ECONNREFUSED, Errno::ETIMEDOUT, Errno::EPIPE, EOFError, SocketError, Net::OpenTimeout, Net::ReadTimeout, OpenSSL::SSL::SSLError => e
|
119
119
|
logger.warn(e.inspect)
|
120
120
|
retries += 1
|
121
|
-
if retries < MAX_RETRY
|
121
|
+
if retries < MAX_RETRY.call
|
122
122
|
wait = retries * REQUEST_RETRY_TIMEBOX
|
123
123
|
logger.warn("Wait #{wait}s and retry request to Knapsack Pro API.")
|
124
124
|
Kernel.sleep(wait)
|
data/lib/knapsack_pro/version.rb
CHANGED
@@ -72,12 +72,13 @@ shared_examples 'when retry request' do
|
|
72
72
|
|
73
73
|
before do
|
74
74
|
expect(KnapsackPro).to receive(:logger).at_least(1).and_return(logger)
|
75
|
+
end
|
76
|
+
|
77
|
+
it do
|
75
78
|
expect(logger).to receive(:debug).exactly(3).with("#{expected_http_method} http://api.knapsackpro.test:3000/v1/fake_endpoint")
|
76
79
|
expect(logger).to receive(:debug).exactly(3).with('API request UUID: fake-uuid')
|
77
80
|
expect(logger).to receive(:debug).exactly(3).with('API response:')
|
78
|
-
end
|
79
81
|
|
80
|
-
it do
|
81
82
|
parsed_response = { 'error' => 'Internal Server Error' }
|
82
83
|
|
83
84
|
expect(logger).to receive(:error).exactly(3).with(parsed_response)
|
@@ -85,16 +86,51 @@ shared_examples 'when retry request' do
|
|
85
86
|
server_error = described_class::ServerError.new(parsed_response)
|
86
87
|
expect(logger).to receive(:warn).exactly(3).with(server_error.inspect)
|
87
88
|
|
88
|
-
expect(logger).to receive(:warn).with("Wait 4s and retry request to Knapsack Pro API.")
|
89
89
|
expect(logger).to receive(:warn).with("Wait 8s and retry request to Knapsack Pro API.")
|
90
|
-
expect(
|
90
|
+
expect(logger).to receive(:warn).with("Wait 16s and retry request to Knapsack Pro API.")
|
91
91
|
expect(Kernel).to receive(:sleep).with(8)
|
92
|
+
expect(Kernel).to receive(:sleep).with(16)
|
92
93
|
|
93
94
|
expect(subject).to eq(parsed_response)
|
94
95
|
|
95
96
|
expect(connection.success?).to be false
|
96
97
|
expect(connection.errors?).to be true
|
97
98
|
end
|
99
|
+
|
100
|
+
context 'when Fallback Mode is disabled' do
|
101
|
+
before do
|
102
|
+
expect(KnapsackPro::Config::Env).to receive(:fallback_mode_enabled?).at_least(1).and_return(false)
|
103
|
+
end
|
104
|
+
|
105
|
+
it do
|
106
|
+
expect(logger).to receive(:debug).exactly(6).with("#{expected_http_method} http://api.knapsackpro.test:3000/v1/fake_endpoint")
|
107
|
+
expect(logger).to receive(:debug).exactly(6).with('API request UUID: fake-uuid')
|
108
|
+
expect(logger).to receive(:debug).exactly(6).with('API response:')
|
109
|
+
|
110
|
+
parsed_response = { 'error' => 'Internal Server Error' }
|
111
|
+
|
112
|
+
expect(logger).to receive(:error).exactly(6).with(parsed_response)
|
113
|
+
|
114
|
+
server_error = described_class::ServerError.new(parsed_response)
|
115
|
+
expect(logger).to receive(:warn).exactly(6).with(server_error.inspect)
|
116
|
+
|
117
|
+
expect(logger).to receive(:warn).with("Wait 8s and retry request to Knapsack Pro API.")
|
118
|
+
expect(logger).to receive(:warn).with("Wait 16s and retry request to Knapsack Pro API.")
|
119
|
+
expect(logger).to receive(:warn).with("Wait 24s and retry request to Knapsack Pro API.")
|
120
|
+
expect(logger).to receive(:warn).with("Wait 32s and retry request to Knapsack Pro API.")
|
121
|
+
expect(logger).to receive(:warn).with("Wait 40s and retry request to Knapsack Pro API.")
|
122
|
+
expect(Kernel).to receive(:sleep).with(8)
|
123
|
+
expect(Kernel).to receive(:sleep).with(16)
|
124
|
+
expect(Kernel).to receive(:sleep).with(24)
|
125
|
+
expect(Kernel).to receive(:sleep).with(32)
|
126
|
+
expect(Kernel).to receive(:sleep).with(40)
|
127
|
+
|
128
|
+
expect(subject).to eq(parsed_response)
|
129
|
+
|
130
|
+
expect(connection.success?).to be false
|
131
|
+
expect(connection.errors?).to be true
|
132
|
+
end
|
133
|
+
end
|
98
134
|
end
|
99
135
|
end
|
100
136
|
|
@@ -186,7 +222,7 @@ describe KnapsackPro::Client::Connection do
|
|
186
222
|
let(:http_method) { :post }
|
187
223
|
|
188
224
|
before do
|
189
|
-
expect(http).to receive(:post).
|
225
|
+
expect(http).to receive(:post).at_least(3).with(
|
190
226
|
endpoint_path,
|
191
227
|
request_hash.to_json,
|
192
228
|
{
|
@@ -210,7 +246,7 @@ describe KnapsackPro::Client::Connection do
|
|
210
246
|
before do
|
211
247
|
uri = URI.parse("http://api.knapsackpro.test:3000#{endpoint_path}")
|
212
248
|
uri.query = URI.encode_www_form(request_hash)
|
213
|
-
expect(http).to receive(:get).
|
249
|
+
expect(http).to receive(:get).at_least(3).with(
|
214
250
|
uri,
|
215
251
|
{
|
216
252
|
'Content-Type' => 'application/json',
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knapsack_pro
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.22.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ArturT
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|