karafka 2.3.0.rc1 → 2.3.1

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: b07678937b0dc9c4154c90ccea2e9bbbc25aa2669461d937e859b77e134ddc48
4
- data.tar.gz: a2e3eee8a9351a789dc33a1f78a48899a007da29b81205b4383e75a9fa0cc13c
3
+ metadata.gz: 9d28565a68d29a1f8f14be1878bf3a1f41611028069586fb4ece1572b8eb72eb
4
+ data.tar.gz: 8c7f6ea1ec67e07ed107c7347d594a26ba923cecc7282c346eb24863e0324412
5
5
  SHA512:
6
- metadata.gz: d2331d328849f4ffb65aa5deb921bf8d12d732f06b30acc5b17ef1fb844d5da23166dbcd27a6b53a6d57d76c6a7d508e9c5479e064a73aa6e0c2eaed69597c8a
7
- data.tar.gz: da8afa92e4b5fc552319b15322b3b3e883c2ec5c2b46ec887d098d34f7a0fbd7a7408558a89d781699eb521309c8fe69d2df7e6a1f46de19259451fb3050e391
6
+ metadata.gz: 73d43079b8e83babe2f722acdd11a67d6a5c361998ffada9b46b0f28b3ebc9c430d7b28cf56cb2aba808e25c234fffc7b2ee945e9e265160fb7cba6f821fcc70
7
+ data.tar.gz: 465b1088763ddc3ea63e53ef92765ae5719d6d1a83522288976321d1a64d24616b06d6571ce11425fd8a0dbf36d8c595871b92abfc8de8bcecc444181afe5123
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Karafka framework changelog
2
2
 
3
- ## 2.3.0 (Unreleased)
3
+ ## 2.3.1 (2024-02-08)
4
+ - [Refactor] Ensure that `Karafka::Helpers::Async#async_call` can run from multiple threads.
5
+
6
+ ## 2.3.0 (2024-01-26)
4
7
  - **[Feature]** Introduce Exactly-Once Semantics within consumers `#transaction` block (Pro)
5
8
  - **[Feature]** Provide ability to multiplex subscription groups (Pro)
6
9
  - **[Feature]** Provide `Karafka::Admin::Acl` for Kafka ACL management via the Admin APIs.
@@ -23,8 +26,13 @@
23
26
  - [Fix] Make the Iterator `#stop_partition` work with karafka-rdkafka `0.14.6`.
24
27
  - [Fix] Ensure Pro components are not loaded during OSS specs execution (not affecting usage).
25
28
  - [Fix] Fix invalid action label for consumers in DataDog logger instrumentation.
29
+ - [Fix] Fix a scenario where `Karafka::Admin#seek_consumer_group` would fail because reaching not the coordinator.
26
30
  - [Ignore] option --include-consumer-groups not working as intended after removal of "thor"
27
31
 
32
+ ### Upgrade Notes
33
+
34
+ Available [here](https://karafka.io/docs/Upgrades-2.3/).
35
+
28
36
  ## 2.2.14 (2023-12-07)
29
37
  - **[Feature]** Provide `Karafka::Admin#delete_consumer_group` and `Karafka::Admin#seek_consumer_group`.
30
38
  - **[Feature]** Provide `Karafka::App.assignments` that will return real-time assignments tracking.
data/Gemfile CHANGED
@@ -10,7 +10,7 @@ gemspec
10
10
  # They are added here because they are part of the integration suite
11
11
  group :integrations do
12
12
  gem 'activejob'
13
- gem 'karafka-web'
13
+ gem 'karafka-web', '>= 0.8.0'
14
14
  end
15
15
 
16
16
  group :test do
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- karafka (2.3.0.rc1)
5
- karafka-core (>= 2.3.0.rc1, < 2.4.0)
4
+ karafka (2.3.1)
5
+ karafka-core (>= 2.3.0, < 2.4.0)
6
6
  waterdrop (>= 2.6.12, < 3.0.0)
7
7
  zeitwerk (~> 2.3)
8
8
 
@@ -27,7 +27,7 @@ GEM
27
27
  byebug (11.1.3)
28
28
  concurrent-ruby (1.2.3)
29
29
  connection_pool (2.4.1)
30
- diff-lcs (1.5.0)
30
+ diff-lcs (1.5.1)
31
31
  docile (1.4.0)
32
32
  drb (2.2.0)
33
33
  ruby2_keywords
@@ -39,38 +39,38 @@ GEM
39
39
  activesupport (>= 6.1)
40
40
  i18n (1.14.1)
41
41
  concurrent-ruby (~> 1.0)
42
- karafka-core (2.3.0.rc1)
43
- karafka-rdkafka (>= 0.14.7, < 0.15.0)
44
- karafka-rdkafka (0.14.7)
42
+ karafka-core (2.3.0)
43
+ karafka-rdkafka (>= 0.14.8, < 0.15.0)
44
+ karafka-rdkafka (0.14.9)
45
45
  ffi (~> 1.15)
46
46
  mini_portile2 (~> 2.6)
47
47
  rake (> 12)
48
- karafka-web (0.7.10)
48
+ karafka-web (0.8.1)
49
49
  erubi (~> 1.4)
50
- karafka (>= 2.2.9, < 3.0.0)
51
- karafka-core (>= 2.2.4, < 3.0.0)
50
+ karafka (>= 2.3.0, < 2.4.0)
51
+ karafka-core (>= 2.3.0, < 2.4.0)
52
52
  roda (~> 3.68, >= 3.69)
53
53
  tilt (~> 2.0)
54
54
  mini_portile2 (2.8.5)
55
55
  minitest (5.21.2)
56
56
  mutex_m (0.2.0)
57
- rack (3.0.8)
57
+ rack (3.0.9)
58
58
  rake (13.1.0)
59
59
  roda (3.76.0)
60
60
  rack
61
- rspec (3.12.0)
62
- rspec-core (~> 3.12.0)
63
- rspec-expectations (~> 3.12.0)
64
- rspec-mocks (~> 3.12.0)
65
- rspec-core (3.12.2)
66
- rspec-support (~> 3.12.0)
67
- rspec-expectations (3.12.3)
61
+ rspec (3.13.0)
62
+ rspec-core (~> 3.13.0)
63
+ rspec-expectations (~> 3.13.0)
64
+ rspec-mocks (~> 3.13.0)
65
+ rspec-core (3.13.0)
66
+ rspec-support (~> 3.13.0)
67
+ rspec-expectations (3.13.0)
68
68
  diff-lcs (>= 1.2.0, < 2.0)
69
- rspec-support (~> 3.12.0)
70
- rspec-mocks (3.12.6)
69
+ rspec-support (~> 3.13.0)
70
+ rspec-mocks (3.13.0)
71
71
  diff-lcs (>= 1.2.0, < 2.0)
72
- rspec-support (~> 3.12.0)
73
- rspec-support (3.12.1)
72
+ rspec-support (~> 3.13.0)
73
+ rspec-support (3.13.0)
74
74
  ruby2_keywords (0.0.5)
75
75
  simplecov (0.22.0)
76
76
  docile (~> 1.1)
@@ -81,7 +81,7 @@ GEM
81
81
  tilt (2.3.0)
82
82
  tzinfo (2.0.6)
83
83
  concurrent-ruby (~> 1.0)
84
- waterdrop (2.6.12)
84
+ waterdrop (2.6.13)
85
85
  karafka-core (>= 2.2.3, < 3.0.0)
86
86
  zeitwerk (~> 2.3)
87
87
  zeitwerk (2.6.12)
@@ -95,7 +95,7 @@ DEPENDENCIES
95
95
  byebug
96
96
  factory_bot
97
97
  karafka!
98
- karafka-web
98
+ karafka-web (>= 0.8.0)
99
99
  rspec
100
100
  simplecov
101
101
 
data/README.md CHANGED
@@ -57,8 +57,8 @@ We also maintain many [integration specs](https://github.com/karafka/karafka/tre
57
57
  1. Add and install Karafka:
58
58
 
59
59
  ```bash
60
- # Make sure to install Karafka 2.2
61
- bundle add karafka --version ">= 2.2.10"
60
+ # Make sure to install Karafka 2.3
61
+ bundle add karafka --version ">= 2.3.0"
62
62
 
63
63
  bundle exec karafka install
64
64
  ```
data/karafka.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  without having to focus on things that are not your business domain.
22
22
  DESC
23
23
 
24
- spec.add_dependency 'karafka-core', '>= 2.3.0.rc1', '< 2.4.0'
24
+ spec.add_dependency 'karafka-core', '>= 2.3.0', '< 2.4.0'
25
25
  spec.add_dependency 'waterdrop', '>= 2.6.12', '< 3.0.0'
26
26
  spec.add_dependency 'zeitwerk', '~> 2.3'
27
27
 
data/lib/karafka/admin.rb CHANGED
@@ -191,34 +191,41 @@ module Karafka
191
191
  mapped_consumer_group_id = app_config.consumer_mapper.call(consumer_group_id)
192
192
  settings = { 'group.id': mapped_consumer_group_id }
193
193
 
194
- with_consumer(settings) do |consumer|
195
- # If we have any time based stuff to resolve, we need to do it prior to commits
196
- unless time_tpl.empty?
197
- real_offsets = consumer.offsets_for_times(time_tpl)
198
-
199
- real_offsets.to_h.each do |name, results|
200
- results.each do |result|
201
- raise(Errors::InvalidTimeBasedOffsetError) unless result
202
-
203
- partition = result.partition
204
-
205
- # Negative offset means we're beyond last message and we need to query for the
206
- # high watermark offset to get the most recent offset and move there
207
- if result.offset.negative?
208
- _, offset = consumer.query_watermark_offsets(name, result.partition)
209
- else
210
- # If we get an offset, it means there existed a message close to this time
211
- # location
212
- offset = result.offset
194
+ # This error can occur when we query a broker that is not a coordinator because something
195
+ # was changing in the cluster. We should be able to safely restart our seeking request
196
+ # when this happens without any issues
197
+ #
198
+ # We wrap the consumer creation, so we retry with a new consumer instance
199
+ with_rdkafka_retry(codes: %i[not_coordinator]) do
200
+ with_consumer(settings) do |consumer|
201
+ # If we have any time based stuff to resolve, we need to do it prior to commits
202
+ unless time_tpl.empty?
203
+ real_offsets = consumer.offsets_for_times(time_tpl)
204
+
205
+ real_offsets.to_h.each do |name, results|
206
+ results.each do |result|
207
+ raise(Errors::InvalidTimeBasedOffsetError) unless result
208
+
209
+ partition = result.partition
210
+
211
+ # Negative offset means we're beyond last message and we need to query for the
212
+ # high watermark offset to get the most recent offset and move there
213
+ if result.offset.negative?
214
+ _, offset = consumer.query_watermark_offsets(name, result.partition)
215
+ else
216
+ # If we get an offset, it means there existed a message close to this time
217
+ # location
218
+ offset = result.offset
219
+ end
220
+
221
+ # Since now we have proper offsets, we can add this to the final tpl for commit
222
+ tpl.add_topic_and_partitions_with_offsets(name, [[partition, offset]])
213
223
  end
214
-
215
- # Since now we have proper offsets, we can add this to the final tpl for commit
216
- tpl.add_topic_and_partitions_with_offsets(name, [[partition, offset]])
217
224
  end
218
225
  end
219
- end
220
226
 
221
- consumer.commit(tpl, false)
227
+ consumer.commit(tpl, false)
228
+ end
222
229
  end
223
230
  end
224
231
 
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Karafka
4
+ # Module used to check some constraints that cannot be easily defined by Bundler
5
+ # At the moment we use it to ensure, that if Karafka is used, it operates with the expected
6
+ # web ui version and that older versions of Web UI that would not be compatible with the API
7
+ # changes in karafka are not used.
8
+ #
9
+ # We can make Web UI require certain karafka version range, but at the moment we do not have a
10
+ # strict 1:1 release pattern matching those two.
11
+ module Constraints
12
+ class << self
13
+ # Verifies that optional requirements are met.
14
+ def verify!
15
+ # Skip verification if web is not used at all
16
+ return unless require_version('karafka/web')
17
+
18
+ # All good if version higher than 0.7.x because we expect 0.8.0 or higher
19
+ return if version(Karafka::Web::VERSION) >= version('0.7.100')
20
+
21
+ # If older web-ui used, we cannot allow it
22
+ raise(
23
+ Errors::DependencyConstraintsError,
24
+ 'karafka-web < 0.8.0 is not compatible with this karafka version'
25
+ )
26
+ end
27
+
28
+ private
29
+
30
+ # Requires given version file from a gem location
31
+ # @param version_location [String]
32
+ # @return [Boolean] true if it was required or false if not reachable
33
+ def require_version(version_location)
34
+ require "#{version_location}/version"
35
+
36
+ true
37
+ rescue LoadError
38
+ false
39
+ end
40
+
41
+ # Builds a version object for comparing
42
+ # @param string [String]
43
+ # @return [::Gem::Version]
44
+ def version(string)
45
+ ::Gem::Version.new(string)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -80,5 +80,12 @@ module Karafka
80
80
  # Raised in transactions when we attempt to store offset for a partition that we have lost
81
81
  # This does not affect producer only transactions, hence we raise it only on offset storage
82
82
  AssignmentLostError = Class.new(BaseError)
83
+
84
+ # Raised if optional dependencies like karafka-web are required in a version that is not
85
+ # supported by the current framework version.
86
+ #
87
+ # Because we do not want to require web out of the box and we do not want to lock web with
88
+ # karafka 1:1, we do such a sanity check
89
+ DependencyConstraintsError = Class.new(BaseError)
83
90
  end
84
91
  end
@@ -8,6 +8,12 @@ module Karafka
8
8
  # @note Thread running code needs to manage it's own exceptions. If they leak out, they will
9
9
  # abort thread on exception.
10
10
  module Async
11
+ # Mutex used to ensure we do not create multiple threads if we decide to run this
12
+ # in parallel on multiple threads
13
+ MUTEX = Mutex.new
14
+
15
+ private_constant :MUTEX
16
+
11
17
  class << self
12
18
  # Adds forwardable to redirect thread-based control methods to the underlying thread that
13
19
  # runs the async operations
@@ -22,10 +28,14 @@ module Karafka
22
28
 
23
29
  # Runs the `#call` method in a new thread
24
30
  def async_call
25
- @thread = Thread.new do
26
- Thread.current.abort_on_exception = true
31
+ MUTEX.synchronize do
32
+ return if @thread&.alive?
33
+
34
+ @thread = Thread.new do
35
+ Thread.current.abort_on_exception = true
27
36
 
28
- call
37
+ call
38
+ end
29
39
  end
30
40
  end
31
41
  end
@@ -18,6 +18,10 @@ module Karafka
18
18
  workers = Processing::WorkersBatch.new(jobs_queue)
19
19
  listeners = Connection::ListenersBatch.new(jobs_queue)
20
20
 
21
+ # We mark it prior to delegating to the manager as manager will have to start at least one
22
+ # connection to Kafka, hence running
23
+ Karafka::App.run!
24
+
21
25
  # Register all the listeners so they can be started and managed
22
26
  @manager.register(listeners)
23
27
 
@@ -61,10 +61,9 @@ module Karafka
61
61
  end
62
62
 
63
63
  # Starts Karafka with a supervision
64
- # @note We don't need to sleep because Karafka::Fetcher is locking and waiting to
65
- # finish loop (and it won't happen until we explicitly want to stop)
64
+ # @note We don't need to sleep because Karafka::Runner is locking and waiting to finish loop
65
+ # (and it won't happen until we explicitly want to stop)
66
66
  def start
67
- Karafka::App.run!
68
67
  Karafka::Runner.new.call
69
68
  end
70
69
 
@@ -73,5 +73,3 @@ end
73
73
  # Visit the setup documentation to get started and enhance your experience.
74
74
  #
75
75
  # https://karafka.io/docs/Web-UI-Getting-Started
76
- #
77
- # Karafka::Web.enable!
@@ -3,5 +3,5 @@
3
3
  # Main module namespace
4
4
  module Karafka
5
5
  # Current Karafka version
6
- VERSION = '2.3.0.rc1'
6
+ VERSION = '2.3.1'
7
7
  end
data/lib/karafka.rb CHANGED
@@ -143,3 +143,5 @@ end
143
143
 
144
144
  # Load railtie after everything else is ready so we know we can rely on it.
145
145
  require 'karafka/railtie'
146
+
147
+ Karafka::Constraints.verify!
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: karafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0.rc1
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maciej Mensfeld
@@ -35,7 +35,7 @@ cert_chain:
35
35
  AnG1dJU+yL2BK7vaVytLTstJME5mepSZ46qqIJXMuWob/YPDmVaBF39TDSG9e34s
36
36
  msG3BiCqgOgHAnL23+CN3Rt8MsuRfEtoTKpJVcCfoEoNHOkc
37
37
  -----END CERTIFICATE-----
38
- date: 2024-01-21 00:00:00.000000000 Z
38
+ date: 2024-02-09 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: karafka-core
@@ -43,7 +43,7 @@ dependencies:
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 2.3.0.rc1
46
+ version: 2.3.0
47
47
  - - "<"
48
48
  - !ruby/object:Gem::Version
49
49
  version: 2.4.0
@@ -53,7 +53,7 @@ dependencies:
53
53
  requirements:
54
54
  - - ">="
55
55
  - !ruby/object:Gem::Version
56
- version: 2.3.0.rc1
56
+ version: 2.3.0
57
57
  - - "<"
58
58
  - !ruby/object:Gem::Version
59
59
  version: 2.4.0
@@ -174,6 +174,7 @@ files:
174
174
  - lib/karafka/connection/raw_messages_buffer.rb
175
175
  - lib/karafka/connection/rebalance_manager.rb
176
176
  - lib/karafka/connection/status.rb
177
+ - lib/karafka/constraints.rb
177
178
  - lib/karafka/contracts.rb
178
179
  - lib/karafka/contracts/base.rb
179
180
  - lib/karafka/contracts/config.rb
metadata.gz.sig CHANGED
Binary file