kubernetes_leader_election 0.1.2 → 0.3.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 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: []