ruby-kafka 0.7.6 → 0.7.7
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 +5 -0
 - data/README.md +1 -0
 - data/lib/kafka/broker.rb +12 -0
 - data/lib/kafka/client.rb +2 -2
 - data/lib/kafka/compression.rb +13 -11
 - data/lib/kafka/compressor.rb +1 -0
 - data/lib/kafka/fetched_batch.rb +5 -1
 - data/lib/kafka/fetched_batch_generator.rb +3 -0
 - data/lib/kafka/fetched_message.rb +1 -0
 - data/lib/kafka/gzip_codec.rb +4 -0
 - data/lib/kafka/lz4_codec.rb +4 -0
 - data/lib/kafka/producer.rb +16 -0
 - data/lib/kafka/protocol.rb +8 -0
 - data/lib/kafka/protocol/add_offsets_to_txn_request.rb +29 -0
 - data/lib/kafka/protocol/add_offsets_to_txn_response.rb +19 -0
 - data/lib/kafka/protocol/produce_request.rb +3 -1
 - data/lib/kafka/protocol/txn_offset_commit_request.rb +46 -0
 - data/lib/kafka/protocol/txn_offset_commit_response.rb +18 -0
 - data/lib/kafka/snappy_codec.rb +4 -0
 - data/lib/kafka/ssl_context.rb +2 -0
 - data/lib/kafka/ssl_socket_with_timeout.rb +1 -0
 - data/lib/kafka/transaction_manager.rb +25 -0
 - data/lib/kafka/version.rb +1 -1
 - data/lib/kafka/zstd_codec.rb +27 -0
 - data/ruby-kafka.gemspec +1 -0
 - metadata +21 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: fe93873554ad9e17df699fa49612e0dae938a498c086ae765bf83b79f4a8106f
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: eb56576533a3b5d1983e755fc0399464315a47f43d6fc68d9ef20c4df5f6d351
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 19158030f7e028cb5dc350a405867273dadfaaa81208f4684c8c6a68b4d4b2507f97ec13b171e58da1b0277fa6712ccb3db50735cd0db5dd3d9839c0ddcba18b
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: d37f2e3ceb765ce5bf267ddcdbcf524251de9356b4e0fa1d16562cf762b99047146c2cda80482792b3f4845b789a8cf8446613f9e49990a22cf73844b9380714
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -4,6 +4,11 @@ Changes and additions to the library will be listed here. 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            ## Unreleased
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
            ## 0.7.7
         
     | 
| 
      
 8 
     | 
    
         
            +
            - Producer send offsets in transaction (#723)
         
     | 
| 
      
 9 
     | 
    
         
            +
            - Support zstd compression (#724)
         
     | 
| 
      
 10 
     | 
    
         
            +
            - Verify SSL Certificates (#730)
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
       7 
12 
     | 
    
         
             
            ## 0.7.6
         
     | 
| 
       8 
13 
     | 
    
         
             
            - Introduce regex matching in `Consumer#subscribe` (#700)
         
     | 
| 
       9 
14 
     | 
    
         
             
            - Only rejoin group on error if we're not in shutdown mode (#711)
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -424,6 +424,7 @@ Compression is enabled by passing the `compression_codec` parameter to `#produce 
     | 
|
| 
       424 
424 
     | 
    
         
             
            * `:snappy` for [Snappy](http://google.github.io/snappy/) compression.
         
     | 
| 
       425 
425 
     | 
    
         
             
            * `:gzip` for [gzip](https://en.wikipedia.org/wiki/Gzip) compression.
         
     | 
| 
       426 
426 
     | 
    
         
             
            * `:lz4` for [LZ4](https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)) compression.
         
     | 
| 
      
 427 
     | 
    
         
            +
            * `:zstd` for [zstd](https://facebook.github.io/zstd/) compression.
         
     | 
| 
       427 
428 
     | 
    
         | 
| 
       428 
429 
     | 
    
         
             
            By default, all message sets will be compressed if you specify a compression codec. To increase the compression threshold, set `compression_threshold` to an integer value higher than one.
         
     | 
| 
       429 
430 
     | 
    
         | 
    
        data/lib/kafka/broker.rb
    CHANGED
    
    | 
         @@ -182,6 +182,18 @@ module Kafka 
     | 
|
| 
       182 
182 
     | 
    
         
             
                  send_request(request)
         
     | 
| 
       183 
183 
     | 
    
         
             
                end
         
     | 
| 
       184 
184 
     | 
    
         | 
| 
      
 185 
     | 
    
         
            +
                def add_offsets_to_txn(**options)
         
     | 
| 
      
 186 
     | 
    
         
            +
                  request = Protocol::AddOffsetsToTxnRequest.new(**options)
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
      
 188 
     | 
    
         
            +
                  send_request(request)
         
     | 
| 
      
 189 
     | 
    
         
            +
                end
         
     | 
| 
      
 190 
     | 
    
         
            +
             
     | 
| 
      
 191 
     | 
    
         
            +
                def txn_offset_commit(**options)
         
     | 
| 
      
 192 
     | 
    
         
            +
                  request = Protocol::TxnOffsetCommitRequest.new(**options)
         
     | 
| 
      
 193 
     | 
    
         
            +
             
     | 
| 
      
 194 
     | 
    
         
            +
                  send_request(request)
         
     | 
| 
      
 195 
     | 
    
         
            +
                end
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
       185 
197 
     | 
    
         
             
                private
         
     | 
| 
       186 
198 
     | 
    
         | 
| 
       187 
199 
     | 
    
         
             
                def send_request(request)
         
     | 
    
        data/lib/kafka/client.rb
    CHANGED
    
    | 
         @@ -233,8 +233,8 @@ module Kafka 
     | 
|
| 
       233 
233 
     | 
    
         
             
                #   result in {BufferOverflow} being raised.
         
     | 
| 
       234 
234 
     | 
    
         
             
                #
         
     | 
| 
       235 
235 
     | 
    
         
             
                # @param compression_codec [Symbol, nil] the name of the compression codec to
         
     | 
| 
       236 
     | 
    
         
            -
                #   use, or nil if no compression should be performed. Valid codecs: `:snappy 
     | 
| 
       237 
     | 
    
         
            -
                #    
     | 
| 
      
 236 
     | 
    
         
            +
                #   use, or nil if no compression should be performed. Valid codecs: `:snappy`,
         
     | 
| 
      
 237 
     | 
    
         
            +
                #   `:gzip`, `:lz4`, `:zstd`
         
     | 
| 
       238 
238 
     | 
    
         
             
                #
         
     | 
| 
       239 
239 
     | 
    
         
             
                # @param compression_threshold [Integer] the number of messages that needs to
         
     | 
| 
       240 
240 
     | 
    
         
             
                #   be in a message set before it should be compressed. Note that message sets
         
     | 
    
        data/lib/kafka/compression.rb
    CHANGED
    
    | 
         @@ -3,27 +3,27 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            require "kafka/snappy_codec"
         
     | 
| 
       4 
4 
     | 
    
         
             
            require "kafka/gzip_codec"
         
     | 
| 
       5 
5 
     | 
    
         
             
            require "kafka/lz4_codec"
         
     | 
| 
      
 6 
     | 
    
         
            +
            require "kafka/zstd_codec"
         
     | 
| 
       6 
7 
     | 
    
         | 
| 
       7 
8 
     | 
    
         
             
            module Kafka
         
     | 
| 
       8 
9 
     | 
    
         
             
              module Compression
         
     | 
| 
       9 
     | 
    
         
            -
                 
     | 
| 
       10 
     | 
    
         
            -
                  1 => :gzip,
         
     | 
| 
       11 
     | 
    
         
            -
                  2 => :snappy,
         
     | 
| 
       12 
     | 
    
         
            -
                  3 => :lz4,
         
     | 
| 
       13 
     | 
    
         
            -
                }.freeze
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                CODECS = {
         
     | 
| 
      
 10 
     | 
    
         
            +
                CODECS_BY_NAME = {
         
     | 
| 
       16 
11 
     | 
    
         
             
                  :gzip => GzipCodec.new,
         
     | 
| 
       17 
12 
     | 
    
         
             
                  :snappy => SnappyCodec.new,
         
     | 
| 
       18 
13 
     | 
    
         
             
                  :lz4 => LZ4Codec.new,
         
     | 
| 
      
 14 
     | 
    
         
            +
                  :zstd => ZstdCodec.new,
         
     | 
| 
       19 
15 
     | 
    
         
             
                }.freeze
         
     | 
| 
       20 
16 
     | 
    
         | 
| 
      
 17 
     | 
    
         
            +
                CODECS_BY_ID = CODECS_BY_NAME.each_with_object({}) do |(_, codec), hash|
         
     | 
| 
      
 18 
     | 
    
         
            +
                  hash[codec.codec_id] = codec
         
     | 
| 
      
 19 
     | 
    
         
            +
                end.freeze
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
       21 
21 
     | 
    
         
             
                def self.codecs
         
     | 
| 
       22 
     | 
    
         
            -
                   
     | 
| 
      
 22 
     | 
    
         
            +
                  CODECS_BY_NAME.keys
         
     | 
| 
       23 
23 
     | 
    
         
             
                end
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
                def self.find_codec(name)
         
     | 
| 
       26 
     | 
    
         
            -
                  codec =  
     | 
| 
      
 26 
     | 
    
         
            +
                  codec = CODECS_BY_NAME.fetch(name) do
         
     | 
| 
       27 
27 
     | 
    
         
             
                    raise "Unknown compression codec #{name}"
         
     | 
| 
       28 
28 
     | 
    
         
             
                  end
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
         @@ -33,11 +33,13 @@ module Kafka 
     | 
|
| 
       33 
33 
     | 
    
         
             
                end
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
35 
     | 
    
         
             
                def self.find_codec_by_id(codec_id)
         
     | 
| 
       36 
     | 
    
         
            -
                   
     | 
| 
      
 36 
     | 
    
         
            +
                  codec = CODECS_BY_ID.fetch(codec_id) do
         
     | 
| 
       37 
37 
     | 
    
         
             
                    raise "Unknown codec id #{codec_id}"
         
     | 
| 
       38 
38 
     | 
    
         
             
                  end
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
                   
     | 
| 
      
 40 
     | 
    
         
            +
                  codec.load
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  codec
         
     | 
| 
       41 
43 
     | 
    
         
             
                end
         
     | 
| 
       42 
44 
     | 
    
         
             
              end
         
     | 
| 
       43 
45 
     | 
    
         
             
            end
         
     | 
    
        data/lib/kafka/compressor.rb
    CHANGED
    
    
    
        data/lib/kafka/fetched_batch.rb
    CHANGED
    
    | 
         @@ -13,18 +13,22 @@ module Kafka 
     | 
|
| 
       13 
13 
     | 
    
         
             
                # @return [Integer]
         
     | 
| 
       14 
14 
     | 
    
         
             
                attr_reader :last_offset
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
      
 16 
     | 
    
         
            +
                # @return [Integer]
         
     | 
| 
      
 17 
     | 
    
         
            +
                attr_reader :leader_epoch
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
       16 
19 
     | 
    
         
             
                # @return [Integer] the offset of the most recent message in the partition.
         
     | 
| 
       17 
20 
     | 
    
         
             
                attr_reader :highwater_mark_offset
         
     | 
| 
       18 
21 
     | 
    
         | 
| 
       19 
22 
     | 
    
         
             
                # @return [Array<Kafka::FetchedMessage>]
         
     | 
| 
       20 
23 
     | 
    
         
             
                attr_accessor :messages
         
     | 
| 
       21 
24 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
                def initialize(topic:, partition:, highwater_mark_offset:, messages:, last_offset: nil)
         
     | 
| 
      
 25 
     | 
    
         
            +
                def initialize(topic:, partition:, highwater_mark_offset:, messages:, last_offset: nil, leader_epoch: nil)
         
     | 
| 
       23 
26 
     | 
    
         
             
                  @topic = topic
         
     | 
| 
       24 
27 
     | 
    
         
             
                  @partition = partition
         
     | 
| 
       25 
28 
     | 
    
         
             
                  @highwater_mark_offset = highwater_mark_offset
         
     | 
| 
       26 
29 
     | 
    
         
             
                  @messages = messages
         
     | 
| 
       27 
30 
     | 
    
         
             
                  @last_offset = last_offset
         
     | 
| 
      
 31 
     | 
    
         
            +
                  @leader_epoch = leader_epoch
         
     | 
| 
       28 
32 
     | 
    
         
             
                end
         
     | 
| 
       29 
33 
     | 
    
         | 
| 
       30 
34 
     | 
    
         
             
                def empty?
         
     | 
| 
         @@ -62,11 +62,13 @@ module Kafka 
     | 
|
| 
       62 
62 
     | 
    
         
             
                def extract_records
         
     | 
| 
       63 
63 
     | 
    
         
             
                  records = []
         
     | 
| 
       64 
64 
     | 
    
         
             
                  last_offset = nil
         
     | 
| 
      
 65 
     | 
    
         
            +
                  leader_epoch = nil
         
     | 
| 
       65 
66 
     | 
    
         
             
                  aborted_transactions = @fetched_partition.aborted_transactions.sort_by(&:first_offset)
         
     | 
| 
       66 
67 
     | 
    
         
             
                  aborted_producer_ids = {}
         
     | 
| 
       67 
68 
     | 
    
         | 
| 
       68 
69 
     | 
    
         
             
                  @fetched_partition.messages.each do |record_batch|
         
     | 
| 
       69 
70 
     | 
    
         
             
                    last_offset = record_batch.last_offset if last_offset.nil? || last_offset < record_batch.last_offset
         
     | 
| 
      
 71 
     | 
    
         
            +
                    leader_epoch = record_batch.partition_leader_epoch if leader_epoch.nil? || leader_epoch < record_batch.partition_leader_epoch
         
     | 
| 
       70 
72 
     | 
    
         
             
                    # Find the list of aborted producer IDs less than current offset
         
     | 
| 
       71 
73 
     | 
    
         
             
                    unless aborted_transactions.empty?
         
     | 
| 
       72 
74 
     | 
    
         
             
                      if aborted_transactions.first.first_offset <= record_batch.last_offset
         
     | 
| 
         @@ -99,6 +101,7 @@ module Kafka 
     | 
|
| 
       99 
101 
     | 
    
         
             
                    topic: @topic,
         
     | 
| 
       100 
102 
     | 
    
         
             
                    partition: @fetched_partition.partition,
         
     | 
| 
       101 
103 
     | 
    
         
             
                    last_offset: last_offset,
         
     | 
| 
      
 104 
     | 
    
         
            +
                    leader_epoch: leader_epoch,
         
     | 
| 
       102 
105 
     | 
    
         
             
                    highwater_mark_offset: @fetched_partition.highwater_mark_offset,
         
     | 
| 
       103 
106 
     | 
    
         
             
                    messages: records
         
     | 
| 
       104 
107 
     | 
    
         
             
                  )
         
     | 
    
        data/lib/kafka/gzip_codec.rb
    CHANGED
    
    
    
        data/lib/kafka/lz4_codec.rb
    CHANGED
    
    
    
        data/lib/kafka/producer.rb
    CHANGED
    
    | 
         @@ -68,6 +68,8 @@ module Kafka 
     | 
|
| 
       68 
68 
     | 
    
         
             
              #
         
     | 
| 
       69 
69 
     | 
    
         
             
              # * `:snappy` for [Snappy](http://google.github.io/snappy/) compression.
         
     | 
| 
       70 
70 
     | 
    
         
             
              # * `:gzip` for [gzip](https://en.wikipedia.org/wiki/Gzip) compression.
         
     | 
| 
      
 71 
     | 
    
         
            +
              # * `:lz4` for [LZ4](https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)) compression.
         
     | 
| 
      
 72 
     | 
    
         
            +
              # * `:zstd` for [zstd](https://facebook.github.io/zstd/) compression.
         
     | 
| 
       71 
73 
     | 
    
         
             
              #
         
     | 
| 
       72 
74 
     | 
    
         
             
              # By default, all message sets will be compressed if you specify a compression
         
     | 
| 
       73 
75 
     | 
    
         
             
              # codec. To increase the compression threshold, set `compression_threshold` to
         
     | 
| 
         @@ -328,6 +330,20 @@ module Kafka 
     | 
|
| 
       328 
330 
     | 
    
         
             
                  @transaction_manager.abort_transaction
         
     | 
| 
       329 
331 
     | 
    
         
             
                end
         
     | 
| 
       330 
332 
     | 
    
         | 
| 
      
 333 
     | 
    
         
            +
                # Sends batch last offset to the consumer group coordinator, and also marks
         
     | 
| 
      
 334 
     | 
    
         
            +
                # this offset as part of the current transaction. This offset will be considered
         
     | 
| 
      
 335 
     | 
    
         
            +
                # committed only if the transaction is committed successfully.
         
     | 
| 
      
 336 
     | 
    
         
            +
                #
         
     | 
| 
      
 337 
     | 
    
         
            +
                # This method should be used when you need to batch consumed and produced messages
         
     | 
| 
      
 338 
     | 
    
         
            +
                # together, typically in a consume-transform-produce pattern. Thus, the specified
         
     | 
| 
      
 339 
     | 
    
         
            +
                # group_id should be the same as config parameter group_id of the used
         
     | 
| 
      
 340 
     | 
    
         
            +
                # consumer.
         
     | 
| 
      
 341 
     | 
    
         
            +
                #
         
     | 
| 
      
 342 
     | 
    
         
            +
                # @return [nil]
         
     | 
| 
      
 343 
     | 
    
         
            +
                def send_offsets_to_transaction(batch:, group_id:)
         
     | 
| 
      
 344 
     | 
    
         
            +
                  @transaction_manager.send_offsets_to_txn(offsets: { batch.topic => { batch.partition => { offset: batch.last_offset + 1, leader_epoch: batch.leader_epoch } } }, group_id: group_id)
         
     | 
| 
      
 345 
     | 
    
         
            +
                end
         
     | 
| 
      
 346 
     | 
    
         
            +
             
     | 
| 
       331 
347 
     | 
    
         
             
                # Syntactic sugar to enable easier transaction usage. Do the following steps
         
     | 
| 
       332 
348 
     | 
    
         
             
                #
         
     | 
| 
       333 
349 
     | 
    
         
             
                # - Start the transaction (with Producer#begin_transaction)
         
     | 
    
        data/lib/kafka/protocol.rb
    CHANGED
    
    | 
         @@ -33,7 +33,9 @@ module Kafka 
     | 
|
| 
       33 
33 
     | 
    
         
             
                DELETE_TOPICS_API         = 20
         
     | 
| 
       34 
34 
     | 
    
         
             
                INIT_PRODUCER_ID_API      = 22
         
     | 
| 
       35 
35 
     | 
    
         
             
                ADD_PARTITIONS_TO_TXN_API = 24
         
     | 
| 
      
 36 
     | 
    
         
            +
                ADD_OFFSETS_TO_TXN_API    = 25
         
     | 
| 
       36 
37 
     | 
    
         
             
                END_TXN_API               = 26
         
     | 
| 
      
 38 
     | 
    
         
            +
                TXN_OFFSET_COMMIT_API     = 28
         
     | 
| 
       37 
39 
     | 
    
         
             
                DESCRIBE_CONFIGS_API      = 32
         
     | 
| 
       38 
40 
     | 
    
         
             
                ALTER_CONFIGS_API         = 33
         
     | 
| 
       39 
41 
     | 
    
         
             
                CREATE_PARTITIONS_API     = 37
         
     | 
| 
         @@ -57,7 +59,9 @@ module Kafka 
     | 
|
| 
       57 
59 
     | 
    
         
             
                  DELETE_TOPICS_API         => :delete_topics,
         
     | 
| 
       58 
60 
     | 
    
         
             
                  INIT_PRODUCER_ID_API      => :init_producer_id_api,
         
     | 
| 
       59 
61 
     | 
    
         
             
                  ADD_PARTITIONS_TO_TXN_API => :add_partitions_to_txn_api,
         
     | 
| 
      
 62 
     | 
    
         
            +
                  ADD_OFFSETS_TO_TXN_API    => :add_offsets_to_txn_api,
         
     | 
| 
       60 
63 
     | 
    
         
             
                  END_TXN_API               => :end_txn_api,
         
     | 
| 
      
 64 
     | 
    
         
            +
                  TXN_OFFSET_COMMIT_API     => :txn_offset_commit_api,
         
     | 
| 
       61 
65 
     | 
    
         
             
                  DESCRIBE_CONFIGS_API      => :describe_configs_api,
         
     | 
| 
       62 
66 
     | 
    
         
             
                  CREATE_PARTITIONS_API     => :create_partitions
         
     | 
| 
       63 
67 
     | 
    
         
             
                }
         
     | 
| 
         @@ -177,6 +181,10 @@ require "kafka/protocol/fetch_request" 
     | 
|
| 
       177 
181 
     | 
    
         
             
            require "kafka/protocol/fetch_response"
         
     | 
| 
       178 
182 
     | 
    
         
             
            require "kafka/protocol/list_offset_request"
         
     | 
| 
       179 
183 
     | 
    
         
             
            require "kafka/protocol/list_offset_response"
         
     | 
| 
      
 184 
     | 
    
         
            +
            require "kafka/protocol/add_offsets_to_txn_request"
         
     | 
| 
      
 185 
     | 
    
         
            +
            require "kafka/protocol/add_offsets_to_txn_response"
         
     | 
| 
      
 186 
     | 
    
         
            +
            require "kafka/protocol/txn_offset_commit_request"
         
     | 
| 
      
 187 
     | 
    
         
            +
            require "kafka/protocol/txn_offset_commit_response"
         
     | 
| 
       180 
188 
     | 
    
         
             
            require "kafka/protocol/find_coordinator_request"
         
     | 
| 
       181 
189 
     | 
    
         
             
            require "kafka/protocol/find_coordinator_response"
         
     | 
| 
       182 
190 
     | 
    
         
             
            require "kafka/protocol/join_group_request"
         
     | 
| 
         @@ -0,0 +1,29 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Kafka
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Protocol
         
     | 
| 
      
 5 
     | 
    
         
            +
                class AddOffsetsToTxnRequest
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def initialize(transactional_id: nil, producer_id:, producer_epoch:, group_id:)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    @transactional_id = transactional_id
         
     | 
| 
      
 8 
     | 
    
         
            +
                    @producer_id = producer_id
         
     | 
| 
      
 9 
     | 
    
         
            +
                    @producer_epoch = producer_epoch
         
     | 
| 
      
 10 
     | 
    
         
            +
                    @group_id = group_id
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  def api_key
         
     | 
| 
      
 14 
     | 
    
         
            +
                    ADD_OFFSETS_TO_TXN_API
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                  def response_class
         
     | 
| 
      
 18 
     | 
    
         
            +
                    AddOffsetsToTxnResponse
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  def encode(encoder)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    encoder.write_string(@transactional_id.to_s)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    encoder.write_int64(@producer_id)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    encoder.write_int16(@producer_epoch)
         
     | 
| 
      
 25 
     | 
    
         
            +
                    encoder.write_string(@group_id)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Kafka
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Protocol
         
     | 
| 
      
 3 
     | 
    
         
            +
                class AddOffsetsToTxnResponse
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                  attr_reader :error_code
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                  def initialize(error_code:)
         
     | 
| 
      
 8 
     | 
    
         
            +
                    @error_code = error_code
         
     | 
| 
      
 9 
     | 
    
         
            +
                  end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  def self.decode(decoder)
         
     | 
| 
      
 12 
     | 
    
         
            +
                    _throttle_time_ms = decoder.int32
         
     | 
| 
      
 13 
     | 
    
         
            +
                    error_code = decoder.int16
         
     | 
| 
      
 14 
     | 
    
         
            +
                    new(error_code: error_code)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -27,6 +27,8 @@ module Kafka 
     | 
|
| 
       27 
27 
     | 
    
         
             
                #         Value => bytes
         
     | 
| 
       28 
28 
     | 
    
         
             
                #
         
     | 
| 
       29 
29 
     | 
    
         
             
                class ProduceRequest
         
     | 
| 
      
 30 
     | 
    
         
            +
                  API_MIN_VERSION = 3
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
       30 
32 
     | 
    
         
             
                  attr_reader :transactional_id, :required_acks, :timeout, :messages_for_topics, :compressor
         
     | 
| 
       31 
33 
     | 
    
         | 
| 
       32 
34 
     | 
    
         
             
                  # @param required_acks [Integer]
         
     | 
| 
         @@ -45,7 +47,7 @@ module Kafka 
     | 
|
| 
       45 
47 
     | 
    
         
             
                  end
         
     | 
| 
       46 
48 
     | 
    
         | 
| 
       47 
49 
     | 
    
         
             
                  def api_version
         
     | 
| 
       48 
     | 
    
         
            -
                     
     | 
| 
      
 50 
     | 
    
         
            +
                    compressor.codec.nil? ? API_MIN_VERSION : [compressor.codec.produce_api_min_version, API_MIN_VERSION].max
         
     | 
| 
       49 
51 
     | 
    
         
             
                  end
         
     | 
| 
       50 
52 
     | 
    
         | 
| 
       51 
53 
     | 
    
         
             
                  def response_class
         
     | 
| 
         @@ -0,0 +1,46 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Kafka
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Protocol
         
     | 
| 
      
 5 
     | 
    
         
            +
                class TxnOffsetCommitRequest
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                  def api_key
         
     | 
| 
      
 8 
     | 
    
         
            +
                    TXN_OFFSET_COMMIT_API
         
     | 
| 
      
 9 
     | 
    
         
            +
                  end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  def api_version
         
     | 
| 
      
 12 
     | 
    
         
            +
                    2
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  def response_class
         
     | 
| 
      
 16 
     | 
    
         
            +
                    TxnOffsetCommitResponse
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  def initialize(transactional_id:, group_id:, producer_id:, producer_epoch:, offsets:)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    @transactional_id = transactional_id
         
     | 
| 
      
 21 
     | 
    
         
            +
                    @producer_id = producer_id
         
     | 
| 
      
 22 
     | 
    
         
            +
                    @producer_epoch = producer_epoch
         
     | 
| 
      
 23 
     | 
    
         
            +
                    @group_id = group_id
         
     | 
| 
      
 24 
     | 
    
         
            +
                    @offsets = offsets
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  def encode(encoder)
         
     | 
| 
      
 28 
     | 
    
         
            +
                    encoder.write_string(@transactional_id.to_s)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    encoder.write_string(@group_id)
         
     | 
| 
      
 30 
     | 
    
         
            +
                    encoder.write_int64(@producer_id)
         
     | 
| 
      
 31 
     | 
    
         
            +
                    encoder.write_int16(@producer_epoch)
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                    encoder.write_array(@offsets) do |topic, partitions|
         
     | 
| 
      
 34 
     | 
    
         
            +
                      encoder.write_string(topic)
         
     | 
| 
      
 35 
     | 
    
         
            +
                      encoder.write_array(partitions) do |partition, offset|
         
     | 
| 
      
 36 
     | 
    
         
            +
                        encoder.write_int32(partition)
         
     | 
| 
      
 37 
     | 
    
         
            +
                        encoder.write_int64(offset[:offset])
         
     | 
| 
      
 38 
     | 
    
         
            +
                        encoder.write_string(nil) # metadata
         
     | 
| 
      
 39 
     | 
    
         
            +
                        encoder.write_int32(offset[:leader_epoch])
         
     | 
| 
      
 40 
     | 
    
         
            +
                      end
         
     | 
| 
      
 41 
     | 
    
         
            +
                    end
         
     | 
| 
      
 42 
     | 
    
         
            +
                  end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
              end
         
     | 
| 
      
 46 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Kafka
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Protocol
         
     | 
| 
      
 3 
     | 
    
         
            +
                class TxnOffsetCommitResponse
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                  attr_reader :error_code
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                  def initialize(error_code:)
         
     | 
| 
      
 8 
     | 
    
         
            +
                    @error_code = error_code
         
     | 
| 
      
 9 
     | 
    
         
            +
                  end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  def self.decode(decoder)
         
     | 
| 
      
 12 
     | 
    
         
            +
                    _throttle_time_ms = decoder.int32
         
     | 
| 
      
 13 
     | 
    
         
            +
                    error_code = decoder.int16
         
     | 
| 
      
 14 
     | 
    
         
            +
                    new(error_code: error_code)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/kafka/snappy_codec.rb
    CHANGED
    
    
    
        data/lib/kafka/ssl_context.rb
    CHANGED
    
    
| 
         @@ -57,6 +57,7 @@ module Kafka 
     | 
|
| 
       57 
57 
     | 
    
         | 
| 
       58 
58 
     | 
    
         
             
                  # once that's connected, we can start initiating the ssl socket
         
     | 
| 
       59 
59 
     | 
    
         
             
                  @ssl_socket = OpenSSL::SSL::SSLSocket.new(@tcp_socket, ssl_context)
         
     | 
| 
      
 60 
     | 
    
         
            +
                  @ssl_socket.hostname = host
         
     | 
| 
       60 
61 
     | 
    
         | 
| 
       61 
62 
     | 
    
         
             
                  begin
         
     | 
| 
       62 
63 
     | 
    
         
             
                    # Initiate the socket connection in the background. If it doesn't fail
         
     | 
| 
         @@ -217,6 +217,31 @@ module Kafka 
     | 
|
| 
       217 
217 
     | 
    
         
             
                  raise
         
     | 
| 
       218 
218 
     | 
    
         
             
                end
         
     | 
| 
       219 
219 
     | 
    
         | 
| 
      
 220 
     | 
    
         
            +
                def send_offsets_to_txn(offsets:, group_id:)
         
     | 
| 
      
 221 
     | 
    
         
            +
                  force_transactional!
         
     | 
| 
      
 222 
     | 
    
         
            +
             
     | 
| 
      
 223 
     | 
    
         
            +
                  unless @transaction_state.in_transaction?
         
     | 
| 
      
 224 
     | 
    
         
            +
                    raise 'Transaction is not valid to send offsets'
         
     | 
| 
      
 225 
     | 
    
         
            +
                  end
         
     | 
| 
      
 226 
     | 
    
         
            +
             
     | 
| 
      
 227 
     | 
    
         
            +
                  add_response = transaction_coordinator.add_offsets_to_txn(
         
     | 
| 
      
 228 
     | 
    
         
            +
                    transactional_id: @transactional_id,
         
     | 
| 
      
 229 
     | 
    
         
            +
                    producer_id: @producer_id,
         
     | 
| 
      
 230 
     | 
    
         
            +
                    producer_epoch: @producer_epoch,
         
     | 
| 
      
 231 
     | 
    
         
            +
                    group_id: group_id
         
     | 
| 
      
 232 
     | 
    
         
            +
                  )
         
     | 
| 
      
 233 
     | 
    
         
            +
                  Protocol.handle_error(add_response.error_code)
         
     | 
| 
      
 234 
     | 
    
         
            +
             
     | 
| 
      
 235 
     | 
    
         
            +
                  send_response = transaction_coordinator.txn_offset_commit(
         
     | 
| 
      
 236 
     | 
    
         
            +
                    transactional_id: @transactional_id,
         
     | 
| 
      
 237 
     | 
    
         
            +
                    group_id: group_id,
         
     | 
| 
      
 238 
     | 
    
         
            +
                    producer_id: @producer_id,
         
     | 
| 
      
 239 
     | 
    
         
            +
                    producer_epoch: @producer_epoch,
         
     | 
| 
      
 240 
     | 
    
         
            +
                    offsets: offsets
         
     | 
| 
      
 241 
     | 
    
         
            +
                  )
         
     | 
| 
      
 242 
     | 
    
         
            +
                  Protocol.handle_error(send_response.error_code)
         
     | 
| 
      
 243 
     | 
    
         
            +
                end
         
     | 
| 
      
 244 
     | 
    
         
            +
             
     | 
| 
       220 
245 
     | 
    
         
             
                def in_transaction?
         
     | 
| 
       221 
246 
     | 
    
         
             
                  @transaction_state.in_transaction?
         
     | 
| 
       222 
247 
     | 
    
         
             
                end
         
     | 
    
        data/lib/kafka/version.rb
    CHANGED
    
    
| 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Kafka
         
     | 
| 
      
 4 
     | 
    
         
            +
              class ZstdCodec
         
     | 
| 
      
 5 
     | 
    
         
            +
                def codec_id
         
     | 
| 
      
 6 
     | 
    
         
            +
                  4
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                def produce_api_min_version
         
     | 
| 
      
 10 
     | 
    
         
            +
                  7
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def load
         
     | 
| 
      
 14 
     | 
    
         
            +
                  require "zstd-ruby"
         
     | 
| 
      
 15 
     | 
    
         
            +
                rescue LoadError
         
     | 
| 
      
 16 
     | 
    
         
            +
                  raise LoadError, "using zstd compression requires adding a dependency on the `zstd-ruby` gem to your Gemfile."
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                def compress(data)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  Zstd.compress(data)
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def decompress(data)
         
     | 
| 
      
 24 
     | 
    
         
            +
                  Zstd.decompress(data)
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
            end
         
     | 
    
        data/ruby-kafka.gemspec
    CHANGED
    
    | 
         @@ -39,6 +39,7 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       39 
39 
     | 
    
         
             
              spec.add_development_dependency "activesupport"
         
     | 
| 
       40 
40 
     | 
    
         
             
              spec.add_development_dependency "snappy"
         
     | 
| 
       41 
41 
     | 
    
         
             
              spec.add_development_dependency "extlz4"
         
     | 
| 
      
 42 
     | 
    
         
            +
              spec.add_development_dependency "zstd-ruby"
         
     | 
| 
       42 
43 
     | 
    
         
             
              spec.add_development_dependency "colored"
         
     | 
| 
       43 
44 
     | 
    
         
             
              spec.add_development_dependency "rspec_junit_formatter", "0.2.2"
         
     | 
| 
       44 
45 
     | 
    
         
             
              spec.add_development_dependency "dogstatsd-ruby", ">= 3.0.0", "< 5.0.0"
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: ruby-kafka
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.7. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.7.7
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Daniel Schierbeck
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2019- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2019-05-09 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: digest-crc
         
     | 
| 
         @@ -164,6 +164,20 @@ dependencies: 
     | 
|
| 
       164 
164 
     | 
    
         
             
                - - ">="
         
     | 
| 
       165 
165 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       166 
166 
     | 
    
         
             
                    version: '0'
         
     | 
| 
      
 167 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 168 
     | 
    
         
            +
              name: zstd-ruby
         
     | 
| 
      
 169 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 170 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 171 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 172 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 173 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 174 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 175 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 176 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 177 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 178 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 179 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 180 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
       167 
181 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       168 
182 
     | 
    
         
             
              name: colored
         
     | 
| 
       169 
183 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -361,6 +375,8 @@ files: 
     | 
|
| 
       361 
375 
     | 
    
         
             
            - lib/kafka/produce_operation.rb
         
     | 
| 
       362 
376 
     | 
    
         
             
            - lib/kafka/producer.rb
         
     | 
| 
       363 
377 
     | 
    
         
             
            - lib/kafka/protocol.rb
         
     | 
| 
      
 378 
     | 
    
         
            +
            - lib/kafka/protocol/add_offsets_to_txn_request.rb
         
     | 
| 
      
 379 
     | 
    
         
            +
            - lib/kafka/protocol/add_offsets_to_txn_response.rb
         
     | 
| 
       364 
380 
     | 
    
         
             
            - lib/kafka/protocol/add_partitions_to_txn_request.rb
         
     | 
| 
       365 
381 
     | 
    
         
             
            - lib/kafka/protocol/add_partitions_to_txn_response.rb
         
     | 
| 
       366 
382 
     | 
    
         
             
            - lib/kafka/protocol/alter_configs_request.rb
         
     | 
| 
         @@ -416,6 +432,8 @@ files: 
     | 
|
| 
       416 
432 
     | 
    
         
             
            - lib/kafka/protocol/sasl_handshake_response.rb
         
     | 
| 
       417 
433 
     | 
    
         
             
            - lib/kafka/protocol/sync_group_request.rb
         
     | 
| 
       418 
434 
     | 
    
         
             
            - lib/kafka/protocol/sync_group_response.rb
         
     | 
| 
      
 435 
     | 
    
         
            +
            - lib/kafka/protocol/txn_offset_commit_request.rb
         
     | 
| 
      
 436 
     | 
    
         
            +
            - lib/kafka/protocol/txn_offset_commit_response.rb
         
     | 
| 
       419 
437 
     | 
    
         
             
            - lib/kafka/round_robin_assignment_strategy.rb
         
     | 
| 
       420 
438 
     | 
    
         
             
            - lib/kafka/sasl/gssapi.rb
         
     | 
| 
       421 
439 
     | 
    
         
             
            - lib/kafka/sasl/oauth.rb
         
     | 
| 
         @@ -431,6 +449,7 @@ files: 
     | 
|
| 
       431 
449 
     | 
    
         
             
            - lib/kafka/transaction_manager.rb
         
     | 
| 
       432 
450 
     | 
    
         
             
            - lib/kafka/transaction_state_machine.rb
         
     | 
| 
       433 
451 
     | 
    
         
             
            - lib/kafka/version.rb
         
     | 
| 
      
 452 
     | 
    
         
            +
            - lib/kafka/zstd_codec.rb
         
     | 
| 
       434 
453 
     | 
    
         
             
            - lib/ruby-kafka.rb
         
     | 
| 
       435 
454 
     | 
    
         
             
            - ruby-kafka.gemspec
         
     | 
| 
       436 
455 
     | 
    
         
             
            homepage: https://github.com/zendesk/ruby-kafka
         
     |