knapsack_pro 1.21.0 → 1.22.0
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.
- 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
|