karafka-rdkafka 0.13.2 → 0.13.9
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
 - checksums.yaml.gz.sig +0 -0
 - data/.github/workflows/ci.yml +9 -4
 - data/.gitignore +4 -0
 - data/.rspec +1 -0
 - data/.ruby-gemset +1 -0
 - data/.ruby-version +1 -0
 - data/CHANGELOG.md +54 -26
 - data/{LICENSE → MIT-LICENSE} +2 -1
 - data/README.md +19 -20
 - data/certs/cert_chain.pem +21 -21
 - data/docker-compose.yml +16 -15
 - data/ext/README.md +1 -1
 - data/ext/Rakefile +1 -1
 - data/karafka-rdkafka.gemspec +2 -2
 - data/lib/rdkafka/abstract_handle.rb +41 -27
 - data/lib/rdkafka/admin/create_partitions_handle.rb +6 -3
 - data/lib/rdkafka/admin/create_topic_handle.rb +6 -3
 - data/lib/rdkafka/admin/delete_topic_handle.rb +6 -3
 - data/lib/rdkafka/admin.rb +6 -7
 - data/lib/rdkafka/bindings.rb +24 -6
 - data/lib/rdkafka/config.rb +53 -19
 - data/lib/rdkafka/consumer/headers.rb +2 -4
 - data/lib/rdkafka/consumer.rb +119 -93
 - data/lib/rdkafka/error.rb +60 -1
 - data/lib/rdkafka/helpers/time.rb +14 -0
 - data/lib/rdkafka/metadata.rb +4 -4
 - data/lib/rdkafka/native_kafka.rb +6 -1
 - data/lib/rdkafka/producer/delivery_handle.rb +16 -1
 - data/lib/rdkafka/producer/delivery_report.rb +3 -2
 - data/lib/rdkafka/producer.rb +89 -17
 - data/lib/rdkafka/version.rb +3 -3
 - data/lib/rdkafka.rb +10 -1
 - data/renovate.json +6 -0
 - data/spec/rdkafka/abstract_handle_spec.rb +0 -2
 - data/spec/rdkafka/admin/create_topic_handle_spec.rb +4 -4
 - data/spec/rdkafka/admin/create_topic_report_spec.rb +0 -2
 - data/spec/rdkafka/admin/delete_topic_handle_spec.rb +3 -3
 - data/spec/rdkafka/admin/delete_topic_report_spec.rb +0 -2
 - data/spec/rdkafka/admin_spec.rb +1 -2
 - data/spec/rdkafka/bindings_spec.rb +0 -1
 - data/spec/rdkafka/callbacks_spec.rb +0 -2
 - data/spec/rdkafka/config_spec.rb +8 -2
 - data/spec/rdkafka/consumer/headers_spec.rb +0 -2
 - data/spec/rdkafka/consumer/message_spec.rb +0 -2
 - data/spec/rdkafka/consumer/partition_spec.rb +0 -2
 - data/spec/rdkafka/consumer/topic_partition_list_spec.rb +0 -2
 - data/spec/rdkafka/consumer_spec.rb +122 -38
 - data/spec/rdkafka/error_spec.rb +0 -2
 - data/spec/rdkafka/metadata_spec.rb +2 -3
 - data/spec/rdkafka/native_kafka_spec.rb +2 -3
 - data/spec/rdkafka/producer/delivery_handle_spec.rb +15 -2
 - data/spec/rdkafka/producer/delivery_report_spec.rb +0 -2
 - data/spec/rdkafka/producer_spec.rb +293 -1
 - data/spec/spec_helper.rb +7 -1
 - data.tar.gz.sig +0 -0
 - metadata +31 -28
 - metadata.gz.sig +0 -0
 - data/certs/karafka-pro.pem +0 -11
 
| 
         @@ -1,6 +1,5 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require "spec_helper"
         
     | 
| 
       4 
3 
     | 
    
         
             
            require "zlib"
         
     | 
| 
       5 
4 
     | 
    
         | 
| 
       6 
5 
     | 
    
         
             
            describe Rdkafka::Producer do
         
     | 
| 
         @@ -559,6 +558,22 @@ describe Rdkafka::Producer do 
     | 
|
| 
       559 
558 
     | 
    
         
             
                end
         
     | 
| 
       560 
559 
     | 
    
         
             
              end
         
     | 
| 
       561 
560 
     | 
    
         | 
| 
      
 561 
     | 
    
         
            +
              context "when not being able to deliver the message" do
         
     | 
| 
      
 562 
     | 
    
         
            +
                let(:producer) do
         
     | 
| 
      
 563 
     | 
    
         
            +
                  rdkafka_producer_config(
         
     | 
| 
      
 564 
     | 
    
         
            +
                    "bootstrap.servers": "localhost:9093",
         
     | 
| 
      
 565 
     | 
    
         
            +
                    "message.timeout.ms": 100
         
     | 
| 
      
 566 
     | 
    
         
            +
                  ).producer
         
     | 
| 
      
 567 
     | 
    
         
            +
                end
         
     | 
| 
      
 568 
     | 
    
         
            +
             
     | 
| 
      
 569 
     | 
    
         
            +
                it "should contain the error in the response when not deliverable" do
         
     | 
| 
      
 570 
     | 
    
         
            +
                  handler = producer.produce(topic: 'produce_test_topic', payload: nil)
         
     | 
| 
      
 571 
     | 
    
         
            +
                  # Wait for the async callbacks and delivery registry to update
         
     | 
| 
      
 572 
     | 
    
         
            +
                  sleep(2)
         
     | 
| 
      
 573 
     | 
    
         
            +
                  expect(handler.create_result.error).to be_a(Rdkafka::RdkafkaError)
         
     | 
| 
      
 574 
     | 
    
         
            +
                end
         
     | 
| 
      
 575 
     | 
    
         
            +
              end
         
     | 
| 
      
 576 
     | 
    
         
            +
             
     | 
| 
       562 
577 
     | 
    
         
             
              describe '#partition_count' do
         
     | 
| 
       563 
578 
     | 
    
         
             
                it { expect(producer.partition_count('example_topic')).to eq(1) }
         
     | 
| 
       564 
579 
     | 
    
         | 
| 
         @@ -627,4 +642,281 @@ describe Rdkafka::Producer do 
     | 
|
| 
       627 
642 
     | 
    
         
             
                  end
         
     | 
| 
       628 
643 
     | 
    
         
             
                end
         
     | 
| 
       629 
644 
     | 
    
         
             
              end
         
     | 
| 
      
 645 
     | 
    
         
            +
             
     | 
| 
      
 646 
     | 
    
         
            +
              describe '#flush' do
         
     | 
| 
      
 647 
     | 
    
         
            +
                it "should return flush when it can flush all outstanding messages or when no messages" do
         
     | 
| 
      
 648 
     | 
    
         
            +
                  producer.produce(
         
     | 
| 
      
 649 
     | 
    
         
            +
                    topic:     "produce_test_topic",
         
     | 
| 
      
 650 
     | 
    
         
            +
                    payload:   "payload headers",
         
     | 
| 
      
 651 
     | 
    
         
            +
                    key:       "key headers",
         
     | 
| 
      
 652 
     | 
    
         
            +
                    headers:   {}
         
     | 
| 
      
 653 
     | 
    
         
            +
                  )
         
     | 
| 
      
 654 
     | 
    
         
            +
             
     | 
| 
      
 655 
     | 
    
         
            +
                  expect(producer.flush(5_000)).to eq(true)
         
     | 
| 
      
 656 
     | 
    
         
            +
                end
         
     | 
| 
      
 657 
     | 
    
         
            +
             
     | 
| 
      
 658 
     | 
    
         
            +
                context 'when it cannot flush due to a timeout' do
         
     | 
| 
      
 659 
     | 
    
         
            +
                  let(:producer) do
         
     | 
| 
      
 660 
     | 
    
         
            +
                    rdkafka_producer_config(
         
     | 
| 
      
 661 
     | 
    
         
            +
                      "bootstrap.servers": "localhost:9093",
         
     | 
| 
      
 662 
     | 
    
         
            +
                      "message.timeout.ms": 2_000
         
     | 
| 
      
 663 
     | 
    
         
            +
                    ).producer
         
     | 
| 
      
 664 
     | 
    
         
            +
                  end
         
     | 
| 
      
 665 
     | 
    
         
            +
             
     | 
| 
      
 666 
     | 
    
         
            +
                  after do
         
     | 
| 
      
 667 
     | 
    
         
            +
                    # Allow rdkafka to evict message preventing memory-leak
         
     | 
| 
      
 668 
     | 
    
         
            +
                    sleep(2)
         
     | 
| 
      
 669 
     | 
    
         
            +
                  end
         
     | 
| 
      
 670 
     | 
    
         
            +
             
     | 
| 
      
 671 
     | 
    
         
            +
                  it "should return false on flush when cannot deliver and beyond timeout" do
         
     | 
| 
      
 672 
     | 
    
         
            +
                    producer.produce(
         
     | 
| 
      
 673 
     | 
    
         
            +
                      topic:     "produce_test_topic",
         
     | 
| 
      
 674 
     | 
    
         
            +
                      payload:   "payload headers",
         
     | 
| 
      
 675 
     | 
    
         
            +
                      key:       "key headers",
         
     | 
| 
      
 676 
     | 
    
         
            +
                      headers:   {}
         
     | 
| 
      
 677 
     | 
    
         
            +
                    )
         
     | 
| 
      
 678 
     | 
    
         
            +
             
     | 
| 
      
 679 
     | 
    
         
            +
                    expect(producer.flush(1_000)).to eq(false)
         
     | 
| 
      
 680 
     | 
    
         
            +
                  end
         
     | 
| 
      
 681 
     | 
    
         
            +
                end
         
     | 
| 
      
 682 
     | 
    
         
            +
             
     | 
| 
      
 683 
     | 
    
         
            +
                context 'when there is a different error' do
         
     | 
| 
      
 684 
     | 
    
         
            +
                  before { allow(Rdkafka::Bindings).to receive(:rd_kafka_flush).and_return(-199) }
         
     | 
| 
      
 685 
     | 
    
         
            +
             
     | 
| 
      
 686 
     | 
    
         
            +
                  it 'should raise it' do
         
     | 
| 
      
 687 
     | 
    
         
            +
                    expect { producer.flush }.to raise_error(Rdkafka::RdkafkaError)
         
     | 
| 
      
 688 
     | 
    
         
            +
                  end
         
     | 
| 
      
 689 
     | 
    
         
            +
                end
         
     | 
| 
      
 690 
     | 
    
         
            +
              end
         
     | 
| 
      
 691 
     | 
    
         
            +
             
     | 
| 
      
 692 
     | 
    
         
            +
              describe '#purge' do
         
     | 
| 
      
 693 
     | 
    
         
            +
                context 'when no outgoing messages' do
         
     | 
| 
      
 694 
     | 
    
         
            +
                  it { expect(producer.purge).to eq(true) }
         
     | 
| 
      
 695 
     | 
    
         
            +
                end
         
     | 
| 
      
 696 
     | 
    
         
            +
             
     | 
| 
      
 697 
     | 
    
         
            +
                context 'when librdkafka purge returns an error' do
         
     | 
| 
      
 698 
     | 
    
         
            +
                  before { expect(Rdkafka::Bindings).to receive(:rd_kafka_purge).and_return(-153) }
         
     | 
| 
      
 699 
     | 
    
         
            +
             
     | 
| 
      
 700 
     | 
    
         
            +
                  it 'expect to raise an error' do
         
     | 
| 
      
 701 
     | 
    
         
            +
                    expect { producer.purge }.to raise_error(Rdkafka::RdkafkaError, /retry/)
         
     | 
| 
      
 702 
     | 
    
         
            +
                  end
         
     | 
| 
      
 703 
     | 
    
         
            +
                end
         
     | 
| 
      
 704 
     | 
    
         
            +
             
     | 
| 
      
 705 
     | 
    
         
            +
                context 'when there are outgoing things in the queue' do
         
     | 
| 
      
 706 
     | 
    
         
            +
                  let(:producer) do
         
     | 
| 
      
 707 
     | 
    
         
            +
                    rdkafka_producer_config(
         
     | 
| 
      
 708 
     | 
    
         
            +
                      "bootstrap.servers": "localhost:9093",
         
     | 
| 
      
 709 
     | 
    
         
            +
                      "message.timeout.ms": 2_000
         
     | 
| 
      
 710 
     | 
    
         
            +
                    ).producer
         
     | 
| 
      
 711 
     | 
    
         
            +
                  end
         
     | 
| 
      
 712 
     | 
    
         
            +
             
     | 
| 
      
 713 
     | 
    
         
            +
                  it "should should purge and move forward" do
         
     | 
| 
      
 714 
     | 
    
         
            +
                    producer.produce(
         
     | 
| 
      
 715 
     | 
    
         
            +
                      topic:     "produce_test_topic",
         
     | 
| 
      
 716 
     | 
    
         
            +
                      payload:   "payload headers"
         
     | 
| 
      
 717 
     | 
    
         
            +
                    )
         
     | 
| 
      
 718 
     | 
    
         
            +
             
     | 
| 
      
 719 
     | 
    
         
            +
                    expect(producer.purge).to eq(true)
         
     | 
| 
      
 720 
     | 
    
         
            +
                    expect(producer.flush(1_000)).to eq(true)
         
     | 
| 
      
 721 
     | 
    
         
            +
                  end
         
     | 
| 
      
 722 
     | 
    
         
            +
             
     | 
| 
      
 723 
     | 
    
         
            +
                  it "should materialize the delivery handles" do
         
     | 
| 
      
 724 
     | 
    
         
            +
                    handle = producer.produce(
         
     | 
| 
      
 725 
     | 
    
         
            +
                      topic:     "produce_test_topic",
         
     | 
| 
      
 726 
     | 
    
         
            +
                      payload:   "payload headers"
         
     | 
| 
      
 727 
     | 
    
         
            +
                    )
         
     | 
| 
      
 728 
     | 
    
         
            +
             
     | 
| 
      
 729 
     | 
    
         
            +
                    expect(producer.purge).to eq(true)
         
     | 
| 
      
 730 
     | 
    
         
            +
             
     | 
| 
      
 731 
     | 
    
         
            +
                    expect { handle.wait }.to raise_error(Rdkafka::RdkafkaError, /purge_queue/)
         
     | 
| 
      
 732 
     | 
    
         
            +
                  end
         
     | 
| 
      
 733 
     | 
    
         
            +
             
     | 
| 
      
 734 
     | 
    
         
            +
                  context "when using delivery_callback" do
         
     | 
| 
      
 735 
     | 
    
         
            +
                    let(:delivery_reports) { [] }
         
     | 
| 
      
 736 
     | 
    
         
            +
             
     | 
| 
      
 737 
     | 
    
         
            +
                    let(:delivery_callback) do
         
     | 
| 
      
 738 
     | 
    
         
            +
                      ->(delivery_report) { delivery_reports << delivery_report }
         
     | 
| 
      
 739 
     | 
    
         
            +
                    end
         
     | 
| 
      
 740 
     | 
    
         
            +
             
     | 
| 
      
 741 
     | 
    
         
            +
                    before { producer.delivery_callback = delivery_callback }
         
     | 
| 
      
 742 
     | 
    
         
            +
             
     | 
| 
      
 743 
     | 
    
         
            +
                    it "should run the callback" do
         
     | 
| 
      
 744 
     | 
    
         
            +
                      handle = producer.produce(
         
     | 
| 
      
 745 
     | 
    
         
            +
                        topic:     "produce_test_topic",
         
     | 
| 
      
 746 
     | 
    
         
            +
                        payload:   "payload headers"
         
     | 
| 
      
 747 
     | 
    
         
            +
                      )
         
     | 
| 
      
 748 
     | 
    
         
            +
             
     | 
| 
      
 749 
     | 
    
         
            +
                      expect(producer.purge).to eq(true)
         
     | 
| 
      
 750 
     | 
    
         
            +
                      # queue purge
         
     | 
| 
      
 751 
     | 
    
         
            +
                      expect(delivery_reports[0].error).to eq(-152)
         
     | 
| 
      
 752 
     | 
    
         
            +
                    end
         
     | 
| 
      
 753 
     | 
    
         
            +
                  end
         
     | 
| 
      
 754 
     | 
    
         
            +
                end
         
     | 
| 
      
 755 
     | 
    
         
            +
              end
         
     | 
| 
      
 756 
     | 
    
         
            +
             
     | 
| 
      
 757 
     | 
    
         
            +
              context 'when working with transactions' do
         
     | 
| 
      
 758 
     | 
    
         
            +
                let(:producer) do
         
     | 
| 
      
 759 
     | 
    
         
            +
                  rdkafka_producer_config(
         
     | 
| 
      
 760 
     | 
    
         
            +
                    'transactional.id': SecureRandom.uuid,
         
     | 
| 
      
 761 
     | 
    
         
            +
                    'transaction.timeout.ms': 5_000
         
     | 
| 
      
 762 
     | 
    
         
            +
                  ).producer
         
     | 
| 
      
 763 
     | 
    
         
            +
                end
         
     | 
| 
      
 764 
     | 
    
         
            +
             
     | 
| 
      
 765 
     | 
    
         
            +
                it 'expect not to allow to produce without transaction init' do
         
     | 
| 
      
 766 
     | 
    
         
            +
                  expect do
         
     | 
| 
      
 767 
     | 
    
         
            +
                    producer.produce(topic: 'produce_test_topic', payload: 'data')
         
     | 
| 
      
 768 
     | 
    
         
            +
                  end.to raise_error(Rdkafka::RdkafkaError, /Erroneous state \(state\)/)
         
     | 
| 
      
 769 
     | 
    
         
            +
                end
         
     | 
| 
      
 770 
     | 
    
         
            +
             
     | 
| 
      
 771 
     | 
    
         
            +
                it 'expect to raise error when transactions are initialized but producing not in one' do
         
     | 
| 
      
 772 
     | 
    
         
            +
                  producer.init_transactions
         
     | 
| 
      
 773 
     | 
    
         
            +
             
     | 
| 
      
 774 
     | 
    
         
            +
                  expect do
         
     | 
| 
      
 775 
     | 
    
         
            +
                    producer.produce(topic: 'produce_test_topic', payload: 'data')
         
     | 
| 
      
 776 
     | 
    
         
            +
                  end.to raise_error(Rdkafka::RdkafkaError, /Erroneous state \(state\)/)
         
     | 
| 
      
 777 
     | 
    
         
            +
                end
         
     | 
| 
      
 778 
     | 
    
         
            +
             
     | 
| 
      
 779 
     | 
    
         
            +
                it 'expect to allow to produce within a transaction, finalize and ship data' do
         
     | 
| 
      
 780 
     | 
    
         
            +
                  producer.init_transactions
         
     | 
| 
      
 781 
     | 
    
         
            +
                  producer.begin_transaction
         
     | 
| 
      
 782 
     | 
    
         
            +
                  handle1 = producer.produce(topic: 'produce_test_topic', payload: 'data1', partition: 1)
         
     | 
| 
      
 783 
     | 
    
         
            +
                  handle2 = producer.produce(topic: 'example_topic', payload: 'data2', partition: 0)
         
     | 
| 
      
 784 
     | 
    
         
            +
                  producer.commit_transaction
         
     | 
| 
      
 785 
     | 
    
         
            +
             
     | 
| 
      
 786 
     | 
    
         
            +
                  report1 = handle1.wait(max_wait_timeout: 15)
         
     | 
| 
      
 787 
     | 
    
         
            +
                  report2 = handle2.wait(max_wait_timeout: 15)
         
     | 
| 
      
 788 
     | 
    
         
            +
             
     | 
| 
      
 789 
     | 
    
         
            +
                  message1 = wait_for_message(
         
     | 
| 
      
 790 
     | 
    
         
            +
                    topic: "produce_test_topic",
         
     | 
| 
      
 791 
     | 
    
         
            +
                    delivery_report: report1,
         
     | 
| 
      
 792 
     | 
    
         
            +
                    consumer: consumer
         
     | 
| 
      
 793 
     | 
    
         
            +
                  )
         
     | 
| 
      
 794 
     | 
    
         
            +
             
     | 
| 
      
 795 
     | 
    
         
            +
                  expect(message1.partition).to eq 1
         
     | 
| 
      
 796 
     | 
    
         
            +
                  expect(message1.payload).to eq "data1"
         
     | 
| 
      
 797 
     | 
    
         
            +
                  expect(message1.timestamp).to be_within(10).of(Time.now)
         
     | 
| 
      
 798 
     | 
    
         
            +
             
     | 
| 
      
 799 
     | 
    
         
            +
                  message2 = wait_for_message(
         
     | 
| 
      
 800 
     | 
    
         
            +
                    topic: "example_topic",
         
     | 
| 
      
 801 
     | 
    
         
            +
                    delivery_report: report2,
         
     | 
| 
      
 802 
     | 
    
         
            +
                    consumer: consumer
         
     | 
| 
      
 803 
     | 
    
         
            +
                  )
         
     | 
| 
      
 804 
     | 
    
         
            +
             
     | 
| 
      
 805 
     | 
    
         
            +
                  expect(message2.partition).to eq 0
         
     | 
| 
      
 806 
     | 
    
         
            +
                  expect(message2.payload).to eq "data2"
         
     | 
| 
      
 807 
     | 
    
         
            +
                  expect(message2.timestamp).to be_within(10).of(Time.now)
         
     | 
| 
      
 808 
     | 
    
         
            +
                end
         
     | 
| 
      
 809 
     | 
    
         
            +
             
     | 
| 
      
 810 
     | 
    
         
            +
                it 'expect not to send data and propagate purge queue error on abort' do
         
     | 
| 
      
 811 
     | 
    
         
            +
                  producer.init_transactions
         
     | 
| 
      
 812 
     | 
    
         
            +
                  producer.begin_transaction
         
     | 
| 
      
 813 
     | 
    
         
            +
                  handle1 = producer.produce(topic: 'produce_test_topic', payload: 'data1', partition: 1)
         
     | 
| 
      
 814 
     | 
    
         
            +
                  handle2 = producer.produce(topic: 'example_topic', payload: 'data2', partition: 0)
         
     | 
| 
      
 815 
     | 
    
         
            +
                  producer.abort_transaction
         
     | 
| 
      
 816 
     | 
    
         
            +
             
     | 
| 
      
 817 
     | 
    
         
            +
                  expect { handle1.wait(max_wait_timeout: 15) }
         
     | 
| 
      
 818 
     | 
    
         
            +
                    .to raise_error(Rdkafka::RdkafkaError, /Purged in queue \(purge_queue\)/)
         
     | 
| 
      
 819 
     | 
    
         
            +
                  expect { handle2.wait(max_wait_timeout: 15) }
         
     | 
| 
      
 820 
     | 
    
         
            +
                    .to raise_error(Rdkafka::RdkafkaError, /Purged in queue \(purge_queue\)/)
         
     | 
| 
      
 821 
     | 
    
         
            +
                end
         
     | 
| 
      
 822 
     | 
    
         
            +
             
     | 
| 
      
 823 
     | 
    
         
            +
                it 'expect to have non retryable, non abortable and not fatal error on abort' do
         
     | 
| 
      
 824 
     | 
    
         
            +
                  producer.init_transactions
         
     | 
| 
      
 825 
     | 
    
         
            +
                  producer.begin_transaction
         
     | 
| 
      
 826 
     | 
    
         
            +
                  handle = producer.produce(topic: 'produce_test_topic', payload: 'data1', partition: 1)
         
     | 
| 
      
 827 
     | 
    
         
            +
                  producer.abort_transaction
         
     | 
| 
      
 828 
     | 
    
         
            +
             
     | 
| 
      
 829 
     | 
    
         
            +
                  response = handle.wait(raise_response_error: false)
         
     | 
| 
      
 830 
     | 
    
         
            +
             
     | 
| 
      
 831 
     | 
    
         
            +
                  expect(response.error).to be_a(Rdkafka::RdkafkaError)
         
     | 
| 
      
 832 
     | 
    
         
            +
                  expect(response.error.retryable?).to eq(false)
         
     | 
| 
      
 833 
     | 
    
         
            +
                  expect(response.error.fatal?).to eq(false)
         
     | 
| 
      
 834 
     | 
    
         
            +
                  expect(response.error.abortable?).to eq(false)
         
     | 
| 
      
 835 
     | 
    
         
            +
                end
         
     | 
| 
      
 836 
     | 
    
         
            +
             
     | 
| 
      
 837 
     | 
    
         
            +
                # This may not always crash, depends on load but no other way to check it
         
     | 
| 
      
 838 
     | 
    
         
            +
                context 'when timeout is too short and error occurs and we can abort' do
         
     | 
| 
      
 839 
     | 
    
         
            +
                  let(:producer) do
         
     | 
| 
      
 840 
     | 
    
         
            +
                    rdkafka_producer_config(
         
     | 
| 
      
 841 
     | 
    
         
            +
                      'transactional.id': SecureRandom.uuid,
         
     | 
| 
      
 842 
     | 
    
         
            +
                      'transaction.timeout.ms': 1_000
         
     | 
| 
      
 843 
     | 
    
         
            +
                    ).producer
         
     | 
| 
      
 844 
     | 
    
         
            +
                  end
         
     | 
| 
      
 845 
     | 
    
         
            +
             
     | 
| 
      
 846 
     | 
    
         
            +
                  it 'expect to allow to produce within a transaction, finalize and not ship data' do
         
     | 
| 
      
 847 
     | 
    
         
            +
                    producer.init_transactions
         
     | 
| 
      
 848 
     | 
    
         
            +
                    producer.begin_transaction
         
     | 
| 
      
 849 
     | 
    
         
            +
             
     | 
| 
      
 850 
     | 
    
         
            +
                    sleep(5)
         
     | 
| 
      
 851 
     | 
    
         
            +
             
     | 
| 
      
 852 
     | 
    
         
            +
                    handle1 = producer.produce(topic: 'produce_test_topic', payload: 'data1', partition: 1)
         
     | 
| 
      
 853 
     | 
    
         
            +
                    handle2 = producer.produce(topic: 'example_topic', payload: 'data2', partition: 0)
         
     | 
| 
      
 854 
     | 
    
         
            +
             
     | 
| 
      
 855 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 856 
     | 
    
         
            +
                      producer.commit_transaction(15_000)
         
     | 
| 
      
 857 
     | 
    
         
            +
                    rescue Rdkafka::RdkafkaError => e
         
     | 
| 
      
 858 
     | 
    
         
            +
                      next unless e.abortable?
         
     | 
| 
      
 859 
     | 
    
         
            +
             
     | 
| 
      
 860 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 861 
     | 
    
         
            +
                        producer.abort_transaction(15_000)
         
     | 
| 
      
 862 
     | 
    
         
            +
                      rescue Rdkafka::RdkafkaError => e
         
     | 
| 
      
 863 
     | 
    
         
            +
                        nil
         
     | 
| 
      
 864 
     | 
    
         
            +
                      end
         
     | 
| 
      
 865 
     | 
    
         
            +
             
     | 
| 
      
 866 
     | 
    
         
            +
                      expect { handle1.wait(max_wait_timeout: 15) }.to raise_error(Rdkafka::RdkafkaError)
         
     | 
| 
      
 867 
     | 
    
         
            +
                      expect { handle2.wait(max_wait_timeout: 15) }.to raise_error(Rdkafka::RdkafkaError)
         
     | 
| 
      
 868 
     | 
    
         
            +
                    end
         
     | 
| 
      
 869 
     | 
    
         
            +
                  end
         
     | 
| 
      
 870 
     | 
    
         
            +
                end
         
     | 
| 
      
 871 
     | 
    
         
            +
             
     | 
| 
      
 872 
     | 
    
         
            +
                context 'fencing against previous active producer with same transactional id' do
         
     | 
| 
      
 873 
     | 
    
         
            +
                  let(:transactional_id) { SecureRandom.uuid }
         
     | 
| 
      
 874 
     | 
    
         
            +
             
     | 
| 
      
 875 
     | 
    
         
            +
                  let(:producer1) do
         
     | 
| 
      
 876 
     | 
    
         
            +
                    rdkafka_producer_config(
         
     | 
| 
      
 877 
     | 
    
         
            +
                      'transactional.id': transactional_id,
         
     | 
| 
      
 878 
     | 
    
         
            +
                      'transaction.timeout.ms': 10_000
         
     | 
| 
      
 879 
     | 
    
         
            +
                    ).producer
         
     | 
| 
      
 880 
     | 
    
         
            +
                  end
         
     | 
| 
      
 881 
     | 
    
         
            +
             
     | 
| 
      
 882 
     | 
    
         
            +
                  let(:producer2) do
         
     | 
| 
      
 883 
     | 
    
         
            +
                    rdkafka_producer_config(
         
     | 
| 
      
 884 
     | 
    
         
            +
                      'transactional.id': transactional_id,
         
     | 
| 
      
 885 
     | 
    
         
            +
                      'transaction.timeout.ms': 10_000
         
     | 
| 
      
 886 
     | 
    
         
            +
                    ).producer
         
     | 
| 
      
 887 
     | 
    
         
            +
                  end
         
     | 
| 
      
 888 
     | 
    
         
            +
             
     | 
| 
      
 889 
     | 
    
         
            +
                  after do
         
     | 
| 
      
 890 
     | 
    
         
            +
                    producer1.close
         
     | 
| 
      
 891 
     | 
    
         
            +
                    producer2.close
         
     | 
| 
      
 892 
     | 
    
         
            +
                  end
         
     | 
| 
      
 893 
     | 
    
         
            +
             
     | 
| 
      
 894 
     | 
    
         
            +
                  it 'expect older producer not to be able to commit when fanced out' do
         
     | 
| 
      
 895 
     | 
    
         
            +
                    producer1.init_transactions
         
     | 
| 
      
 896 
     | 
    
         
            +
                    producer1.begin_transaction
         
     | 
| 
      
 897 
     | 
    
         
            +
                    producer1.produce(topic: 'produce_test_topic', payload: 'data1', partition: 1)
         
     | 
| 
      
 898 
     | 
    
         
            +
             
     | 
| 
      
 899 
     | 
    
         
            +
                    producer2.init_transactions
         
     | 
| 
      
 900 
     | 
    
         
            +
                    producer2.begin_transaction
         
     | 
| 
      
 901 
     | 
    
         
            +
                    producer2.produce(topic: 'produce_test_topic', payload: 'data1', partition: 1)
         
     | 
| 
      
 902 
     | 
    
         
            +
             
     | 
| 
      
 903 
     | 
    
         
            +
                    expect { producer1.commit_transaction }
         
     | 
| 
      
 904 
     | 
    
         
            +
                      .to raise_error(Rdkafka::RdkafkaError, /This instance has been fenced/)
         
     | 
| 
      
 905 
     | 
    
         
            +
             
     | 
| 
      
 906 
     | 
    
         
            +
                    error = false
         
     | 
| 
      
 907 
     | 
    
         
            +
             
     | 
| 
      
 908 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 909 
     | 
    
         
            +
                      producer1.commit_transaction
         
     | 
| 
      
 910 
     | 
    
         
            +
                    rescue Rdkafka::RdkafkaError => e
         
     | 
| 
      
 911 
     | 
    
         
            +
                      error = e
         
     | 
| 
      
 912 
     | 
    
         
            +
                    end
         
     | 
| 
      
 913 
     | 
    
         
            +
             
     | 
| 
      
 914 
     | 
    
         
            +
                    expect(error.fatal?).to eq(true)
         
     | 
| 
      
 915 
     | 
    
         
            +
                    expect(error.abortable?).to eq(false)
         
     | 
| 
      
 916 
     | 
    
         
            +
                    expect(error.retryable?).to eq(false)
         
     | 
| 
      
 917 
     | 
    
         
            +
             
     | 
| 
      
 918 
     | 
    
         
            +
                    expect { producer2.commit_transaction }.not_to raise_error
         
     | 
| 
      
 919 
     | 
    
         
            +
                  end
         
     | 
| 
      
 920 
     | 
    
         
            +
                end
         
     | 
| 
      
 921 
     | 
    
         
            +
              end
         
     | 
| 
       630 
922 
     | 
    
         
             
            end
         
     | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | 
         @@ -11,6 +11,7 @@ require "pry" 
     | 
|
| 
       11 
11 
     | 
    
         
             
            require "rspec"
         
     | 
| 
       12 
12 
     | 
    
         
             
            require "rdkafka"
         
     | 
| 
       13 
13 
     | 
    
         
             
            require "timeout"
         
     | 
| 
      
 14 
     | 
    
         
            +
            require 'securerandom'
         
     | 
| 
       14 
15 
     | 
    
         | 
| 
       15 
16 
     | 
    
         
             
            def rdkafka_base_config
         
     | 
| 
       16 
17 
     | 
    
         
             
              {
         
     | 
| 
         @@ -35,7 +36,7 @@ def rdkafka_consumer_config(config_overrides={}) 
     | 
|
| 
       35 
36 
     | 
    
         
             
              # Add consumer specific fields to it
         
     | 
| 
       36 
37 
     | 
    
         
             
              config[:"auto.offset.reset"] = "earliest"
         
     | 
| 
       37 
38 
     | 
    
         
             
              config[:"enable.partition.eof"] = false
         
     | 
| 
       38 
     | 
    
         
            -
              config[:"group.id"] = "ruby-test-#{ 
     | 
| 
      
 39 
     | 
    
         
            +
              config[:"group.id"] = "ruby-test-#{SecureRandom.uuid}"
         
     | 
| 
       39 
40 
     | 
    
         
             
              # Enable debug mode if required
         
     | 
| 
       40 
41 
     | 
    
         
             
              if ENV["DEBUG_CONSUMER"]
         
     | 
| 
       41 
42 
     | 
    
         
             
                config[:debug] = "cgrp,topic,fetch"
         
     | 
| 
         @@ -106,6 +107,10 @@ def wait_for_unassignment(consumer) 
     | 
|
| 
       106 
107 
     | 
    
         
             
              end
         
     | 
| 
       107 
108 
     | 
    
         
             
            end
         
     | 
| 
       108 
109 
     | 
    
         | 
| 
      
 110 
     | 
    
         
            +
            def objects_of_type_count(type)
         
     | 
| 
      
 111 
     | 
    
         
            +
              ObjectSpace.each_object(type).count
         
     | 
| 
      
 112 
     | 
    
         
            +
            end
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
       109 
114 
     | 
    
         
             
            def notify_listener(listener, &block)
         
     | 
| 
       110 
115 
     | 
    
         
             
              # 1. subscribe and poll
         
     | 
| 
       111 
116 
     | 
    
         
             
              consumer.subscribe("consume_test_topic")
         
     | 
| 
         @@ -134,6 +139,7 @@ RSpec.configure do |config| 
     | 
|
| 
       134 
139 
     | 
    
         
             
                    rake_test_topic:         3,
         
     | 
| 
       135 
140 
     | 
    
         
             
                    watermarks_test_topic:   3,
         
     | 
| 
       136 
141 
     | 
    
         
             
                    partitioner_test_topic: 25,
         
     | 
| 
      
 142 
     | 
    
         
            +
                    example_topic:           1
         
     | 
| 
       137 
143 
     | 
    
         
             
                }.each do |topic, partitions|
         
     | 
| 
       138 
144 
     | 
    
         
             
                  create_topic_handle = admin.create_topic(topic.to_s, partitions, 1)
         
     | 
| 
       139 
145 
     | 
    
         
             
                  begin
         
     | 
    
        data.tar.gz.sig
    CHANGED
    
    | 
         Binary file 
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: karafka-rdkafka
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.13. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.13.9
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Thijs Cadier
         
     | 
| 
         @@ -12,30 +12,30 @@ cert_chain: 
     | 
|
| 
       12 
12 
     | 
    
         
             
              -----BEGIN CERTIFICATE-----
         
     | 
| 
       13 
13 
     | 
    
         
             
              MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MRAwDgYDVQQDDAdjb250
         
     | 
| 
       14 
14 
     | 
    
         
             
              YWN0MRcwFQYKCZImiZPyLGQBGRYHa2FyYWZrYTESMBAGCgmSJomT8ixkARkWAmlv
         
     | 
| 
       15 
     | 
    
         
            -
               
     | 
| 
      
 15 
     | 
    
         
            +
              MB4XDTIzMDgyMTA3MjU1NFoXDTI0MDgyMDA3MjU1NFowPzEQMA4GA1UEAwwHY29u
         
     | 
| 
       16 
16 
     | 
    
         
             
              dGFjdDEXMBUGCgmSJomT8ixkARkWB2thcmFma2ExEjAQBgoJkiaJk/IsZAEZFgJp
         
     | 
| 
       17 
     | 
    
         
            -
               
     | 
| 
       18 
     | 
    
         
            -
               
     | 
| 
       19 
     | 
    
         
            -
               
     | 
| 
       20 
     | 
    
         
            -
               
     | 
| 
       21 
     | 
    
         
            -
               
     | 
| 
       22 
     | 
    
         
            -
               
     | 
| 
       23 
     | 
    
         
            -
               
     | 
| 
       24 
     | 
    
         
            -
               
     | 
| 
       25 
     | 
    
         
            -
               
     | 
| 
       26 
     | 
    
         
            -
               
     | 
| 
       27 
     | 
    
         
            -
               
     | 
| 
       28 
     | 
    
         
            -
               
     | 
| 
       29 
     | 
    
         
            -
               
     | 
| 
       30 
     | 
    
         
            -
               
     | 
| 
       31 
     | 
    
         
            -
               
     | 
| 
       32 
     | 
    
         
            -
               
     | 
| 
       33 
     | 
    
         
            -
               
     | 
| 
       34 
     | 
    
         
            -
               
     | 
| 
       35 
     | 
    
         
            -
               
     | 
| 
       36 
     | 
    
         
            -
               
     | 
| 
      
 17 
     | 
    
         
            +
              bzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAOuZpyQKEwsTG9plLat7
         
     | 
| 
      
 18 
     | 
    
         
            +
              8bUaNuNBEnouTsNMr6X+XTgvyrAxTuocdsyP1sNCjdS1B8RiiDH1/Nt9qpvlBWon
         
     | 
| 
      
 19 
     | 
    
         
            +
              sdJ1SYhaWNVfqiYStTDnCx3PRMmHRdD4KqUWKpN6VpZ1O/Zu+9Mw0COmvXgZuuO9
         
     | 
| 
      
 20 
     | 
    
         
            +
              wMSJkXRo6dTCfMedLAIxjMeBIxtoLR2e6Jm6MR8+8WYYVWrO9kSOOt5eKQLBY7aK
         
     | 
| 
      
 21 
     | 
    
         
            +
              b/Dc40EcJKPg3Z30Pia1M9ZyRlb6SOj6SKpHRqc7vbVQxjEw6Jjal1lZ49m3YZMd
         
     | 
| 
      
 22 
     | 
    
         
            +
              ArMAs9lQZNdSw5/UX6HWWURLowg6k10RnhTUtYyzO9BFev0JFJftHnmuk8vtb+SD
         
     | 
| 
      
 23 
     | 
    
         
            +
              5VPmjFXg2VOcw0B7FtG75Vackk8QKfgVe3nSPhVpew2CSPlbJzH80wChbr19+e3+
         
     | 
| 
      
 24 
     | 
    
         
            +
              YGr1tOiaJrL6c+PNmb0F31NXMKpj/r+n15HwlTMRxQrzFcgjBlxf2XFGnPQXHhBm
         
     | 
| 
      
 25 
     | 
    
         
            +
              kp1OFnEq4GG9sON4glRldkwzi/f/fGcZmo5fm3d+0ZdNgwIDAQABo3cwdTAJBgNV
         
     | 
| 
      
 26 
     | 
    
         
            +
              HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUPVH5+dLA80A1kJ2Uz5iGwfOa
         
     | 
| 
      
 27 
     | 
    
         
            +
              1+swHQYDVR0RBBYwFIESY29udGFjdEBrYXJhZmthLmlvMB0GA1UdEgQWMBSBEmNv
         
     | 
| 
      
 28 
     | 
    
         
            +
              bnRhY3RAa2FyYWZrYS5pbzANBgkqhkiG9w0BAQsFAAOCAYEAnpa0jcN7JzREHMTQ
         
     | 
| 
      
 29 
     | 
    
         
            +
              bfZ+xcvlrzuROMY6A3zIZmQgbnoZZNuX4cMRrT1p1HuwXpxdpHPw7dDjYqWw3+1h
         
     | 
| 
      
 30 
     | 
    
         
            +
              3mXLeMuk7amjQpYoSWU/OIZMhIsARra22UN8qkkUlUj3AwTaChVKN/bPJOM2DzfU
         
     | 
| 
      
 31 
     | 
    
         
            +
              kz9vUgLeYYFfQbZqeI6SsM7ltilRV4W8D9yNUQQvOxCFxtLOetJ00fC/E7zMUzbK
         
     | 
| 
      
 32 
     | 
    
         
            +
              IBwYFQYsbI6XQzgAIPW6nGSYKgRhkfpmquXSNKZRIQ4V6bFrufa+DzD0bt2ZA3ah
         
     | 
| 
      
 33 
     | 
    
         
            +
              fMmJguyb5L2Gf1zpDXzFSPMG7YQFLzwYz1zZZvOU7/UCpQsHpID/YxqDp4+Dgb+Y
         
     | 
| 
      
 34 
     | 
    
         
            +
              qma0whX8UG/gXFV2pYWpYOfpatvahwi+A1TwPQsuZwkkhi1OyF1At3RY+hjSXyav
         
     | 
| 
      
 35 
     | 
    
         
            +
              AnG1dJU+yL2BK7vaVytLTstJME5mepSZ46qqIJXMuWob/YPDmVaBF39TDSG9e34s
         
     | 
| 
      
 36 
     | 
    
         
            +
              msG3BiCqgOgHAnL23+CN3Rt8MsuRfEtoTKpJVcCfoEoNHOkc
         
     | 
| 
       37 
37 
     | 
    
         
             
              -----END CERTIFICATE-----
         
     | 
| 
       38 
     | 
    
         
            -
            date: 2023- 
     | 
| 
      
 38 
     | 
    
         
            +
            date: 2023-11-07 00:00:00.000000000 Z
         
     | 
| 
       39 
39 
     | 
    
         
             
            dependencies:
         
     | 
| 
       40 
40 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       41 
41 
     | 
    
         
             
              name: ffi
         
     | 
| 
         @@ -165,7 +165,7 @@ dependencies: 
     | 
|
| 
       165 
165 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       166 
166 
     | 
    
         
             
            description: Modern Kafka client library for Ruby based on librdkafka
         
     | 
| 
       167 
167 
     | 
    
         
             
            email:
         
     | 
| 
       168 
     | 
    
         
            -
            -  
     | 
| 
      
 168 
     | 
    
         
            +
            - contact@karafka.io
         
     | 
| 
       169 
169 
     | 
    
         
             
            executables: []
         
     | 
| 
       170 
170 
     | 
    
         
             
            extensions:
         
     | 
| 
       171 
171 
     | 
    
         
             
            - ext/Rakefile
         
     | 
| 
         @@ -174,15 +174,16 @@ files: 
     | 
|
| 
       174 
174 
     | 
    
         
             
            - ".github/workflows/ci.yml"
         
     | 
| 
       175 
175 
     | 
    
         
             
            - ".gitignore"
         
     | 
| 
       176 
176 
     | 
    
         
             
            - ".rspec"
         
     | 
| 
      
 177 
     | 
    
         
            +
            - ".ruby-gemset"
         
     | 
| 
      
 178 
     | 
    
         
            +
            - ".ruby-version"
         
     | 
| 
       177 
179 
     | 
    
         
             
            - ".yardopts"
         
     | 
| 
       178 
180 
     | 
    
         
             
            - CHANGELOG.md
         
     | 
| 
       179 
181 
     | 
    
         
             
            - Gemfile
         
     | 
| 
       180 
182 
     | 
    
         
             
            - Guardfile
         
     | 
| 
       181 
     | 
    
         
            -
            - LICENSE
         
     | 
| 
      
 183 
     | 
    
         
            +
            - MIT-LICENSE
         
     | 
| 
       182 
184 
     | 
    
         
             
            - README.md
         
     | 
| 
       183 
185 
     | 
    
         
             
            - Rakefile
         
     | 
| 
       184 
186 
     | 
    
         
             
            - certs/cert_chain.pem
         
     | 
| 
       185 
     | 
    
         
            -
            - certs/karafka-pro.pem
         
     | 
| 
       186 
187 
     | 
    
         
             
            - docker-compose.yml
         
     | 
| 
       187 
188 
     | 
    
         
             
            - ext/README.md
         
     | 
| 
       188 
189 
     | 
    
         
             
            - ext/Rakefile
         
     | 
| 
         @@ -205,12 +206,14 @@ files: 
     | 
|
| 
       205 
206 
     | 
    
         
             
            - lib/rdkafka/consumer/partition.rb
         
     | 
| 
       206 
207 
     | 
    
         
             
            - lib/rdkafka/consumer/topic_partition_list.rb
         
     | 
| 
       207 
208 
     | 
    
         
             
            - lib/rdkafka/error.rb
         
     | 
| 
      
 209 
     | 
    
         
            +
            - lib/rdkafka/helpers/time.rb
         
     | 
| 
       208 
210 
     | 
    
         
             
            - lib/rdkafka/metadata.rb
         
     | 
| 
       209 
211 
     | 
    
         
             
            - lib/rdkafka/native_kafka.rb
         
     | 
| 
       210 
212 
     | 
    
         
             
            - lib/rdkafka/producer.rb
         
     | 
| 
       211 
213 
     | 
    
         
             
            - lib/rdkafka/producer/delivery_handle.rb
         
     | 
| 
       212 
214 
     | 
    
         
             
            - lib/rdkafka/producer/delivery_report.rb
         
     | 
| 
       213 
215 
     | 
    
         
             
            - lib/rdkafka/version.rb
         
     | 
| 
      
 216 
     | 
    
         
            +
            - renovate.json
         
     | 
| 
       214 
217 
     | 
    
         
             
            - spec/rdkafka/abstract_handle_spec.rb
         
     | 
| 
       215 
218 
     | 
    
         
             
            - spec/rdkafka/admin/create_topic_handle_spec.rb
         
     | 
| 
       216 
219 
     | 
    
         
             
            - spec/rdkafka/admin/create_topic_report_spec.rb
         
     | 
| 
         @@ -251,14 +254,14 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       251 
254 
     | 
    
         
             
              requirements:
         
     | 
| 
       252 
255 
     | 
    
         
             
              - - ">="
         
     | 
| 
       253 
256 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       254 
     | 
    
         
            -
                  version: '2. 
     | 
| 
      
 257 
     | 
    
         
            +
                  version: '2.7'
         
     | 
| 
       255 
258 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       256 
259 
     | 
    
         
             
              requirements:
         
     | 
| 
       257 
260 
     | 
    
         
             
              - - ">="
         
     | 
| 
       258 
261 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       259 
262 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       260 
263 
     | 
    
         
             
            requirements: []
         
     | 
| 
       261 
     | 
    
         
            -
            rubygems_version: 3. 
     | 
| 
      
 264 
     | 
    
         
            +
            rubygems_version: 3.4.19
         
     | 
| 
       262 
265 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       263 
266 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       264 
267 
     | 
    
         
             
            summary: The rdkafka gem is a modern Kafka client library for Ruby based on librdkafka.
         
     | 
    
        metadata.gz.sig
    CHANGED
    
    | 
         Binary file 
     | 
    
        data/certs/karafka-pro.pem
    DELETED
    
    | 
         @@ -1,11 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            -----BEGIN RSA PUBLIC KEY-----
         
     | 
| 
       2 
     | 
    
         
            -
            MIIBigKCAYEApcd6ybskiNs9WUvBGVUE8GdWDehjZ9TyjSj/fDl/UcMYqY0R5YX9
         
     | 
| 
       3 
     | 
    
         
            -
            tnYxEwZZRMdVltKWxr88Qmshh1IQz6CpJVbcfYjt/158pSGPm+AUua6tkLqIvZDM
         
     | 
| 
       4 
     | 
    
         
            -
            ocFOMafmroI+BMuL+Zu5QH7HC2tkT16jclGYfMQkJjXVUQTk2UZr+94+8RlUz/CH
         
     | 
| 
       5 
     | 
    
         
            -
            Y6hPA7xPgIyPfyPCxz1VWzAwXwT++NCJQPBr5MqT84LNSEzUSlR9pFNShf3UCUT+
         
     | 
| 
       6 
     | 
    
         
            -
            8LWOvjFSNGmMMSsbo2T7/+dz9/FM02YG00EO0x04qteggwcaEYLFrigDN6/fM0ih
         
     | 
| 
       7 
     | 
    
         
            -
            BXZILnMUqC/qrfW2YFg4ZqKZJuxaALqqkPxrkBDYqoqcAloqn36jBSke6tc/2I/J
         
     | 
| 
       8 
     | 
    
         
            -
            2Afq3r53UoAbUH7h5I/L8YeaiA4MYjAuq724lHlrOmIr4D6yjYC0a1LGlPjLk869
         
     | 
| 
       9 
     | 
    
         
            -
            2nsVXNgomhVb071E6amR+rJJnfvkdZgCmEBFnqnBV5A1u4qgNsa2rVcD+gJRvb2T
         
     | 
| 
       10 
     | 
    
         
            -
            aQtjlQWKPx5xAgMBAAE=
         
     | 
| 
       11 
     | 
    
         
            -
            -----END RSA PUBLIC KEY-----
         
     |