racecar 2.1.1 → 2.2.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: 6380c598cedfca4662aa4c0edf6c55b8a0641d972dad715e3b1e961ac06e4d4f
4
- data.tar.gz: 19a30f8515b82f9cbfa783319a76059688ef6096a4dd5e5a5673d6d0c101878c
3
+ metadata.gz: e2c32338556d27bfcbae35df0758163a457d2c6e3f520141206c5a9c0124cc68
4
+ data.tar.gz: 43d9c42d0d483c269b15d417ef59e2985da3ca3945d34d6772f8dd262ccbfaf6
5
5
  SHA512:
6
- metadata.gz: 66c6013d77d63a121673e7d4e49fb87b3b1520a3e80a9b564a116b284dbd262ead6fd5b570afa4fa55d77822ac6a6ab31a86917b08630aad2fc9af2f7c08d171
7
- data.tar.gz: ce9c89a671478a806dce62979bb695a2673cd598acfb3d2547194a9367a12c96d5f34d38c32f79a3ae809f9eb79303e5330aec4f5e0dc2a23f6f6ffc1e286817
6
+ metadata.gz: 0467ac1cdefb6cad9870dd73b92f4a5a943b9f685ff3fc876b3f183d109ae3d29d7c2c7dffea8f31bca7c7b18565e5aba04d4865c94f2448a7228be175855a5b
7
+ data.tar.gz: e4ab43eb180995af916d447b006438b4a48cb808b29aabec52b455e246541a083192d1b560a957fa6f3ab7d5412dd12ab74aac49acc0b606c3df87cec90b93b6
@@ -0,0 +1,61 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - '**'
7
+
8
+ jobs:
9
+ unit-specs:
10
+ runs-on: ubuntu-latest
11
+
12
+ strategy:
13
+ matrix:
14
+ ruby-version: ["2.5", "2.6"]
15
+
16
+ steps:
17
+ - uses: zendesk/checkout@v2
18
+ - name: Set up Ruby
19
+ uses: zendesk/setup-ruby@v1.58.0
20
+ with:
21
+ ruby-version: ${{ matrix.ruby-version }}
22
+ bundler-cache: true
23
+ - name: Build and test with RSpec
24
+ run: bundle exec rspec --format documentation --require spec_helper --color --exclude-pattern='spec/integration/*_spec.rb'
25
+
26
+ integration-specs:
27
+ runs-on: ubuntu-latest
28
+
29
+ services:
30
+ zookeeper:
31
+ image: confluentinc/cp-zookeeper
32
+ ports:
33
+ - 2181:2181
34
+ env:
35
+ ZOOKEEPER_CLIENT_PORT: 2181
36
+
37
+ kafka:
38
+ image: confluentinc/cp-kafka
39
+ ports:
40
+ - 9092:9092
41
+ - 29092:29092
42
+ options: --health-cmd "kafka-topics --list --bootstrap-server=localhost:9092" --health-interval 10s --health-timeout 5s --health-retries 5
43
+ env:
44
+ KAFKA_BROKER_ID: 1
45
+ KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
46
+ KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
47
+ KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
48
+ KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
49
+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
50
+
51
+ steps:
52
+ - uses: zendesk/checkout@v2
53
+ - name: Set up Ruby
54
+ uses: zendesk/setup-ruby@v1.58.0
55
+ with:
56
+ ruby-version: 2.7
57
+ bundler-cache: true
58
+ - name: Build and test with RSpec
59
+ env:
60
+ RACECAR_BROKERS: localhost:9092
61
+ run: bundle exec rspec --format documentation --require spec_helper --color spec/integration/*_spec.rb
data/.gitignore CHANGED
@@ -1,10 +1,9 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
- /Gemfile.lock
4
3
  /_yardoc/
5
4
  /coverage/
6
5
  /doc/
7
6
  /pkg/
8
7
  /spec/reports/
9
8
  /tmp/
10
- /vendor/bundle/
9
+ /vendor/bundle/
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## racecar v2.2.0
6
+
7
+ * [Racecar::ConsumerSet] **breaking change** `Racecar::ConsumerSet`'s functions `poll` and `batch_pall` expect the max wait values to be given in milliseconds. The defaults were using `config.max_wait_time`, which is in seconds. If you do not directly use `Racecar::ConsumerSet`, or always call its `poll` and `batch_poll` functions by specfiying the max wait time (the first argument), then this breaking change does not affect you. ([#214](https://github.com/zendesk/racecar/pull/214))
8
+
5
9
  ## racecar v2.1.1
6
10
 
7
11
  * [Bugfix] Close RdKafka consumer in ConsumerSet#reset_current_consumer to prevent memory leak (#196)
@@ -0,0 +1,69 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ racecar (2.1.1)
5
+ king_konf (~> 1.0.0)
6
+ rdkafka (~> 0.8.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (6.0.3.4)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 0.7, < 2)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
16
+ zeitwerk (~> 2.2, >= 2.2.2)
17
+ coderay (1.1.3)
18
+ concurrent-ruby (1.1.7)
19
+ diff-lcs (1.4.4)
20
+ dogstatsd-ruby (4.8.2)
21
+ ffi (1.13.1)
22
+ i18n (1.8.5)
23
+ concurrent-ruby (~> 1.0)
24
+ king_konf (1.0.0)
25
+ method_source (1.0.0)
26
+ mini_portile2 (2.5.0)
27
+ minitest (5.14.2)
28
+ pry (0.13.1)
29
+ coderay (~> 1.1)
30
+ method_source (~> 1.0)
31
+ rake (13.0.1)
32
+ rdkafka (0.8.1)
33
+ ffi (~> 1.9)
34
+ mini_portile2 (~> 2.1)
35
+ rake (>= 12.3)
36
+ rspec (3.10.0)
37
+ rspec-core (~> 3.10.0)
38
+ rspec-expectations (~> 3.10.0)
39
+ rspec-mocks (~> 3.10.0)
40
+ rspec-core (3.10.0)
41
+ rspec-support (~> 3.10.0)
42
+ rspec-expectations (3.10.0)
43
+ diff-lcs (>= 1.2.0, < 2.0)
44
+ rspec-support (~> 3.10.0)
45
+ rspec-mocks (3.10.0)
46
+ diff-lcs (>= 1.2.0, < 2.0)
47
+ rspec-support (~> 3.10.0)
48
+ rspec-support (3.10.0)
49
+ thread_safe (0.3.6)
50
+ timecop (0.9.2)
51
+ tzinfo (1.2.8)
52
+ thread_safe (~> 0.1)
53
+ zeitwerk (2.4.2)
54
+
55
+ PLATFORMS
56
+ ruby
57
+
58
+ DEPENDENCIES
59
+ activesupport (>= 4.0, < 6.1)
60
+ bundler (>= 1.13, < 3)
61
+ dogstatsd-ruby (>= 4.0.0, < 5.0.0)
62
+ pry
63
+ racecar!
64
+ rake (> 10.0)
65
+ rspec (~> 3.0)
66
+ timecop
67
+
68
+ BUNDLED WITH
69
+ 2.1.4
@@ -54,7 +54,7 @@ module Racecar
54
54
  desc "How long to wait when trying to communicate with a Kafka broker"
55
55
  float :socket_timeout, default: 30
56
56
 
57
- desc "How long to allow the Kafka brokers to wait before returning messages"
57
+ desc "How long to allow the Kafka brokers to wait before returning messages (in seconds)"
58
58
  float :max_wait_time, default: 1
59
59
 
60
60
  desc "Maximum amount of data the broker shall return for a Fetch request"
@@ -17,7 +17,7 @@ module Racecar
17
17
  @last_poll_read_nil_message = false
18
18
  end
19
19
 
20
- def poll(max_wait_time_ms = @config.max_wait_time)
20
+ def poll(max_wait_time_ms = @config.max_wait_time_ms)
21
21
  batch_poll(max_wait_time_ms, 1).first
22
22
  end
23
23
 
@@ -31,7 +31,7 @@ module Racecar
31
31
  # Any errors during polling are retried in an exponential backoff fashion. If an error
32
32
  # occurs, but there is no time left for a backoff and retry, it will return the
33
33
  # already collected messages and only retry on the next call.
34
- def batch_poll(max_wait_time_ms = @config.max_wait_time, max_messages = @config.fetch_messages)
34
+ def batch_poll(max_wait_time_ms = @config.max_wait_time_ms, max_messages = @config.fetch_messages)
35
35
  started_at = Time.now
36
36
  remain_ms = max_wait_time_ms
37
37
  maybe_select_next_consumer
@@ -130,6 +130,9 @@ module Racecar
130
130
  @logger.debug "Capping #{wait_ms}ms to #{max_wait_time_ms-1}ms."
131
131
  sleep (max_wait_time_ms-1)/1000.0
132
132
  remain_ms = 1
133
+ elsif try == 0 && remain_ms == 0
134
+ @logger.debug "No time remains for polling messages. Will try on next call."
135
+ return nil
133
136
  elsif wait_ms >= remain_ms
134
137
  @logger.error "Only #{remain_ms}ms left, but want to wait for #{wait_ms}ms before poll. Will retry on next call."
135
138
  @previous_retries = try
@@ -6,8 +6,11 @@ module Racecar
6
6
  class Message
7
7
  extend Forwardable
8
8
 
9
- def initialize(rdkafka_message)
9
+ attr_reader :retries_count
10
+
11
+ def initialize(rdkafka_message, retries_count: nil)
10
12
  @rdkafka_message = rdkafka_message
13
+ @retries_count = retries_count
11
14
  end
12
15
 
13
16
  def_delegators :@rdkafka_message, :topic, :partition, :offset, :key, :headers
@@ -171,7 +171,7 @@ module Racecar
171
171
  with_pause(message.topic, message.partition, message.offset..message.offset) do |pause|
172
172
  begin
173
173
  @instrumenter.instrument("process_message", instrumentation_payload) do
174
- processor.process(Racecar::Message.new(message))
174
+ processor.process(Racecar::Message.new(message, retries_count: pause.pauses_count))
175
175
  processor.deliver!
176
176
  consumer.store_offset(message)
177
177
  end
@@ -199,7 +199,10 @@ module Racecar
199
199
  @instrumenter.instrument("process_batch", instrumentation_payload) do
200
200
  with_pause(first.topic, first.partition, first.offset..last.offset) do |pause|
201
201
  begin
202
- processor.process_batch(messages.map {|message| Racecar::Message.new(message) })
202
+ racecar_messages = messages.map do |message|
203
+ Racecar::Message.new(message, retries_count: pause.pauses_count)
204
+ end
205
+ processor.process_batch(racecar_messages)
203
206
  processor.deliver!
204
207
  consumer.store_offset(messages.last)
205
208
  rescue => e
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Racecar
4
- VERSION = "2.1.1"
4
+ VERSION = "2.2.0"
5
5
  end
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ["lib"]
22
22
 
23
- spec.add_runtime_dependency "king_konf", "~> 0.3.7"
23
+ spec.add_runtime_dependency "king_konf", "~> 1.0.0"
24
24
  spec.add_runtime_dependency "rdkafka", "~> 0.8.0"
25
25
 
26
26
  spec.add_development_dependency "bundler", [">= 1.13", "< 3"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: racecar
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Schierbeck
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-11-04 00:00:00.000000000 Z
12
+ date: 2021-01-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: king_konf
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: 0.3.7
20
+ version: 1.0.0
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: 0.3.7
27
+ version: 1.0.0
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rdkafka
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -166,11 +166,12 @@ extensions: []
166
166
  extra_rdoc_files: []
167
167
  files:
168
168
  - ".circleci/config.yml"
169
- - ".github/workflows/rspec.yml"
169
+ - ".github/workflows/ci.yml"
170
170
  - ".gitignore"
171
171
  - ".rspec"
172
172
  - CHANGELOG.md
173
173
  - Gemfile
174
+ - Gemfile.lock
174
175
  - LICENSE.txt
175
176
  - Procfile
176
177
  - README.md
@@ -1,24 +0,0 @@
1
- name: Execute Specs
2
-
3
- on: [push]
4
-
5
- jobs:
6
- rspec:
7
-
8
- runs-on: ubuntu-latest
9
-
10
- strategy:
11
- matrix:
12
- ruby-version: ["2.5.x", "2.6.x"]
13
-
14
- steps:
15
- - uses: actions/checkout@v1
16
- - name: Set up Ruby 2.6
17
- uses: actions/setup-ruby@v1
18
- with:
19
- ruby-version: ${{ matrix.ruby-version }}
20
- - name: Build and test with RSpec
21
- run: |
22
- gem install bundler --no-document
23
- bundle install --jobs 4 --retry 3
24
- bundle exec rspec --format documentation --require spec_helper --color