Add common ThreadingHelper module for specs (#29116)
				
					
				
			This commit is contained in:
		@@ -33,17 +33,13 @@ describe RequestPool do
 | 
			
		||||
 | 
			
		||||
      subject
 | 
			
		||||
 | 
			
		||||
      threads = Array.new(5) do
 | 
			
		||||
        Thread.new do
 | 
			
		||||
      multi_threaded_execution(5) do
 | 
			
		||||
        subject.with('http://example.com') do |http_client|
 | 
			
		||||
          http_client.get('/').flush
 | 
			
		||||
          # Nudge scheduler to yield and exercise the full pool
 | 
			
		||||
          sleep(0.01)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      threads.map(&:join)
 | 
			
		||||
 | 
			
		||||
      expect(subject.size).to be > 1
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -1035,18 +1035,9 @@ RSpec.describe Account do
 | 
			
		||||
    it 'increments the count in multi-threaded an environment when account_stat is not yet initialized' do
 | 
			
		||||
      subject
 | 
			
		||||
 | 
			
		||||
      increment_by   = 15
 | 
			
		||||
      wait_for_start = true
 | 
			
		||||
 | 
			
		||||
      threads = Array.new(increment_by) do
 | 
			
		||||
        Thread.new do
 | 
			
		||||
          true while wait_for_start
 | 
			
		||||
      multi_threaded_execution(15) do
 | 
			
		||||
        described_class.find(subject.id).increment_count!(:followers_count)
 | 
			
		||||
      end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      wait_for_start = false
 | 
			
		||||
      threads.each(&:join)
 | 
			
		||||
 | 
			
		||||
      expect(subject.reload.followers_count).to eq 15
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,8 @@ describe Account::Counters do
 | 
			
		||||
  let!(:account) { Fabricate(:account) }
 | 
			
		||||
 | 
			
		||||
  describe '#increment_count!' do
 | 
			
		||||
    let(:increment_by) { 15 }
 | 
			
		||||
 | 
			
		||||
    it 'increments the count' do
 | 
			
		||||
      expect(account.followers_count).to eq 0
 | 
			
		||||
      account.increment_count!(:followers_count)
 | 
			
		||||
@@ -13,24 +15,17 @@ describe Account::Counters do
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'increments the count in multi-threaded an environment' do
 | 
			
		||||
      increment_by   = 15
 | 
			
		||||
      wait_for_start = true
 | 
			
		||||
 | 
			
		||||
      threads = Array.new(increment_by) do
 | 
			
		||||
        Thread.new do
 | 
			
		||||
          true while wait_for_start
 | 
			
		||||
      multi_threaded_execution(increment_by) do
 | 
			
		||||
        account.increment_count!(:statuses_count)
 | 
			
		||||
      end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      wait_for_start = false
 | 
			
		||||
      threads.each(&:join)
 | 
			
		||||
 | 
			
		||||
      expect(account.statuses_count).to eq increment_by
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe '#decrement_count!' do
 | 
			
		||||
    let(:decrement_by) { 10 }
 | 
			
		||||
 | 
			
		||||
    it 'decrements the count' do
 | 
			
		||||
      account.followers_count = 15
 | 
			
		||||
      account.save!
 | 
			
		||||
@@ -40,21 +35,12 @@ describe Account::Counters do
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'decrements the count in multi-threaded an environment' do
 | 
			
		||||
      decrement_by   = 10
 | 
			
		||||
      wait_for_start = true
 | 
			
		||||
 | 
			
		||||
      account.statuses_count = 15
 | 
			
		||||
      account.save!
 | 
			
		||||
 | 
			
		||||
      threads = Array.new(decrement_by) do
 | 
			
		||||
        Thread.new do
 | 
			
		||||
          true while wait_for_start
 | 
			
		||||
      multi_threaded_execution(decrement_by) do
 | 
			
		||||
        account.decrement_count!(:statuses_count)
 | 
			
		||||
      end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      wait_for_start = false
 | 
			
		||||
      threads.each(&:join)
 | 
			
		||||
 | 
			
		||||
      expect(account.statuses_count).to eq 5
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -86,6 +86,7 @@ RSpec.configure do |config|
 | 
			
		||||
  config.include ActiveSupport::Testing::TimeHelpers
 | 
			
		||||
  config.include Chewy::Rspec::Helpers
 | 
			
		||||
  config.include Redisable
 | 
			
		||||
  config.include ThreadingHelpers
 | 
			
		||||
  config.include SignedRequestHelpers, type: :request
 | 
			
		||||
  config.include CommandLineHelpers, type: :cli
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -219,14 +219,10 @@ RSpec.describe ResolveAccountService, type: :service do
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  it 'processes one remote account at a time using locks' do
 | 
			
		||||
    wait_for_start = true
 | 
			
		||||
    fail_occurred  = false
 | 
			
		||||
    return_values  = Concurrent::Array.new
 | 
			
		||||
 | 
			
		||||
    threads = Array.new(5) do
 | 
			
		||||
      Thread.new do
 | 
			
		||||
        true while wait_for_start
 | 
			
		||||
 | 
			
		||||
    multi_threaded_execution(5) do
 | 
			
		||||
      begin
 | 
			
		||||
        return_values << described_class.new.call('foo@ap.example.com')
 | 
			
		||||
      rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
@@ -235,10 +231,6 @@ RSpec.describe ResolveAccountService, type: :service do
 | 
			
		||||
        RedisConfiguration.pool.checkin if Thread.current[:redis]
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    wait_for_start = false
 | 
			
		||||
    threads.each(&:join)
 | 
			
		||||
 | 
			
		||||
    expect(fail_occurred).to be false
 | 
			
		||||
    expect(return_values).to_not include(nil)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								spec/support/threading_helpers.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								spec/support/threading_helpers.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
module ThreadingHelpers
 | 
			
		||||
  def multi_threaded_execution(thread_count)
 | 
			
		||||
    wait_for_start = true
 | 
			
		||||
 | 
			
		||||
    threads = Array.new(thread_count) do
 | 
			
		||||
      Thread.new do
 | 
			
		||||
        true while wait_for_start
 | 
			
		||||
        yield
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    wait_for_start = false
 | 
			
		||||
    threads.each(&:join)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Reference in New Issue
	
	Block a user