Sha256: 2e83cc03414490fd78b39bf485a4fc8551b6d1ed355c39dac1d3f2f955c7531b

Contents?: true

Size: 1.89 KB

Versions: 20

Compression:

Stored size: 1.89 KB

Contents

require "spec_helper"

describe "Rapidly opening and closing lots of channels" do
  connection = Bunny.new(:automatic_recovery => false).tap do |c|
    c.start
  end

  context "in a single-threaded scenario" do
    let(:n) { 500 }

    it "works correctly" do
      xs = Array.new(n) { connection.create_channel }
      puts "Opened #{n} channels"

      xs.size.should == n
      xs.each do |ch|
        ch.close
      end
    end
  end

  100.times do |i|
    context "in a multi-threaded scenario A (take #{i})" do
      # actually, on MRI values greater than ~100 will eventually cause write
      # operations to fail with a timeout (1 second is not enough)
      # which will cause recovery to re-acquire @channel_mutex in Session.
      # Because Ruby's mutexes are not re-entrant, it will raise a ThreadError.
      #
      # But this already demonstrates that within these platform constraints,
      # Bunny is safe to use in such scenarios.
      let(:n) { 20 }

      it "works correctly" do
        ts = []

        n.times do
          t = Thread.new do
            ch1 = connection.create_channel
            q   = ch1.queue("", :exclusive => true)
            q.delete
            ch1.close

            ch2 = connection.create_channel
            ch2.close
          end
          t.abort_on_exception = true
          ts << t
        end

        ts.each { |t| t.join }
      end
    end
  end

  100.times do |i|
    context "in a multi-threaded scenario B (take #{i})" do
      let(:n) { 20 }

      it "works correctly" do
        ts = []

        n.times do
          t = Thread.new do
            3.times do
              ch = connection.create_channel
              x  = ch.topic('bunny.stress.topics.t2', :durable => false)
              ch.close
            end
          end
          t.abort_on_exception = true
          ts << t
        end

        ts.each { |t| t.join }
      end
    end
  end
end

Version data entries

20 entries across 20 versions & 1 rubygems

Version Path
bunny-1.5.0 spec/stress/channel_open_stress_spec.rb
bunny-1.5.0.pre2 spec/stress/channel_open_stress_spec.rb
bunny-1.5.0.pre1 spec/stress/channel_open_stress_spec.rb
bunny-1.4.1 spec/stress/channel_open_stress_spec.rb
bunny-1.4.0 spec/stress/channel_open_stress_spec.rb
bunny-1.3.1 spec/stress/channel_open_stress_spec.rb
bunny-1.3.0 spec/stress/channel_open_stress_spec.rb
bunny-1.2.2 spec/stress/channel_open_stress_spec.rb
bunny-1.2.1 spec/stress/channel_open_stress_spec.rb
bunny-1.2.0 spec/stress/channel_open_stress_spec.rb
bunny-1.1.9 spec/stress/channel_open_stress_spec.rb
bunny-1.1.8 spec/stress/channel_open_stress_spec.rb
bunny-1.1.7 spec/stress/channel_open_stress_spec.rb
bunny-1.1.6 spec/stress/channel_open_stress_spec.rb
bunny-1.1.5 spec/stress/channel_open_stress_spec.rb
bunny-1.1.4 spec/stress/channel_open_stress_spec.rb
bunny-1.1.3 spec/stress/channel_open_stress_spec.rb
bunny-1.1.2 spec/stress/channel_open_stress_spec.rb
bunny-1.1.1 spec/stress/channel_open_stress_spec.rb
bunny-1.1.0 spec/stress/channel_open_stress_spec.rb