kubernetes_leader_election 0.1.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ebf5e530aef5aa2090bb6722def02ea09f0727b4445f1fac80391687b4b69c81
4
- data.tar.gz: 69a5f3e755e6c401733ab118944a155a1bc706121588359912f01b937283af53
3
+ metadata.gz: 8249770ccbb46bf6eb75d9fd0e10200b9ab5e4c471b4f5bbccc9dfa7e82cb102
4
+ data.tar.gz: d587d3fb3292107e29a67d35da72d106b453942b0112369906142a4da23d85d5
5
5
  SHA512:
6
- metadata.gz: 86af0f3581d589358f6ccedeb9f04c4a39abb4dfc153c2b8e6ba69dd80b2153ffc8bf4183cd194e548e947eac9c12314517c8532ffb809f641f2e75dc1883002
7
- data.tar.gz: f58367aff174456db85719244922b383c3972e796ecb5f6ed2f9295994c3ce323402650ffbd40c677ad851934b54220e129c9fed3216d7742d39e458586980a0
6
+ metadata.gz: c9bfbf38f35665c19401f23e26399378bdae1747fd934bd6875b626c1edfe22104a9198a96a38f4cf5dc880ebff252ee8f35e9139b4441be60c2f005efc6b0ab
7
+ data.tar.gz: d2b9afc8dab855511bf0b430b213a64a9438e4c5b4c425377d40fbfed8c492c190d9d52837397cef21343c6ca0c561a06aba68596ecd15b6fd7aa3168b69de96
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  class KubernetesLeaderElection
3
- VERSION = "0.1.2"
3
+ VERSION = "0.3.0"
4
4
  end
@@ -9,12 +9,13 @@ class KubernetesLeaderElection
9
9
  FAILED_KUBERNETES_REQUEST =
10
10
  [Timeout::Error, OpenSSL::SSL::SSLError, Kubeclient::HttpError, SystemCallError, HTTP::ConnectionError].freeze
11
11
 
12
- def initialize(name, kubeclient, logger:, statsd: nil, interval: 30)
12
+ def initialize(name, kubeclient, logger:, statsd: nil, interval: 30, retry_backoffs: [0.1, 0.5, 1, 2, 4])
13
13
  @name = name
14
14
  @kubeclient = kubeclient
15
15
  @statsd = statsd
16
16
  @logger = logger
17
17
  @interval = interval
18
+ @retry_backoffs = retry_backoffs
18
19
  end
19
20
 
20
21
  # not using `call` since we never want to be restarted
@@ -34,11 +35,17 @@ class KubernetesLeaderElection
34
35
 
35
36
  private
36
37
 
38
+ # allow callers to use any refresh tokens for their kubeclient
39
+ # see https://github.com/abonas/kubeclient/issues/530 for a better solution
40
+ def kubeclient
41
+ @kubeclient.respond_to?(:call) ? @kubeclient.call : @kubeclient
42
+ end
43
+
37
44
  # show that we are alive or crash because we cannot reach the api (split-brain az)
38
45
  def signal_alive
39
- with_retries(*FAILED_KUBERNETES_REQUEST, times: 3) do
46
+ with_retries(*FAILED_KUBERNETES_REQUEST) do
40
47
  patch = { spec: { renewTime: microtime } }
41
- reply = @kubeclient.patch_entity(
48
+ reply = kubeclient.patch_entity(
42
49
  "leases", @name, patch, 'strategic-merge-patch', ENV.fetch("POD_NAMESPACE")
43
50
  )
44
51
 
@@ -64,8 +71,8 @@ class KubernetesLeaderElection
64
71
  # retry request on regular api errors
65
72
  reraise = ->(e) { e.is_a?(Kubeclient::HttpError) && e.error_code == ALREADY_EXISTS_CODE }
66
73
 
67
- with_retries(*FAILED_KUBERNETES_REQUEST, reraise: reraise, times: 3) do
68
- @kubeclient.create_entity(
74
+ with_retries(*FAILED_KUBERNETES_REQUEST, reraise: reraise) do
75
+ kubeclient.create_entity(
69
76
  "Lease",
70
77
  "leases",
71
78
  metadata: {
@@ -92,8 +99,8 @@ class KubernetesLeaderElection
92
99
  rescue Kubeclient::HttpError => e
93
100
  raise e unless e.error_code == ALREADY_EXISTS_CODE # lease already exists
94
101
 
95
- lease = with_retries(*FAILED_KUBERNETES_REQUEST, times: 3) do
96
- @kubeclient.get_entity("leases", @name, namespace)
102
+ lease = with_retries(*FAILED_KUBERNETES_REQUEST) do
103
+ kubeclient.get_entity("leases", @name, namespace)
97
104
  rescue Kubeclient::ResourceNotFoundError
98
105
  nil
99
106
  end
@@ -108,8 +115,8 @@ class KubernetesLeaderElection
108
115
  # this is still a race-condition since we could be deleting the newly succeeded leader
109
116
  # see https://github.com/kubernetes/kubernetes/issues/20572
110
117
  @logger.info message: "deleting stale lease"
111
- with_retries(*FAILED_KUBERNETES_REQUEST, times: 3) do
112
- @kubeclient.delete_entity("leases", @name, namespace)
118
+ with_retries(*FAILED_KUBERNETES_REQUEST) do
119
+ kubeclient.delete_entity("leases", @name, namespace)
113
120
  end
114
121
  false # leader is dead, do not assume leadership here to avoid race condition
115
122
  else
@@ -117,14 +124,14 @@ class KubernetesLeaderElection
117
124
  end
118
125
  end
119
126
 
120
- def with_retries(*errors, times:, reraise: nil, backoff: [0.1, 0.5, 1])
127
+ def with_retries(*errors, times: @retry_backoffs.size, reraise: nil)
121
128
  yield
122
129
  rescue *errors => e
123
130
  retries ||= -1
124
131
  retries += 1
125
132
  raise if retries >= times || reraise&.call(e)
126
133
  @logger.warn message: "Retryable error", type: e.class.to_s, retries: times - retries
127
- sleep backoff[retries] || backoff.last
134
+ sleep @retry_backoffs[retries] || @retry_backoffs.last
128
135
  retry
129
136
  end
130
137
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kubernetes_leader_election
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-10 00:00:00.000000000 Z
11
+ date: 2024-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kubeclient
@@ -24,7 +24,7 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- description:
27
+ description:
28
28
  email: michael@grosser.it
29
29
  executables: []
30
30
  extensions: []
@@ -37,7 +37,7 @@ homepage: https://github.com/grosser/kubernetes_leader_election
37
37
  licenses:
38
38
  - MIT
39
39
  metadata: {}
40
- post_install_message:
40
+ post_install_message:
41
41
  rdoc_options: []
42
42
  require_paths:
43
43
  - lib
@@ -45,15 +45,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - ">="
47
47
  - !ruby/object:Gem::Version
48
- version: 2.6.0
48
+ version: 2.7.0
49
49
  required_rubygems_version: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  requirements: []
55
- rubygems_version: 3.2.16
56
- signing_key:
55
+ rubygems_version: 3.1.6
56
+ signing_key:
57
57
  specification_version: 4
58
58
  summary: Elect a kubernetes leader using leases for ruby
59
59
  test_files: []