DEV: stop leaking data into tables during test (#21403)

This amends it so our cached counting reliant specs run in synchronize mode

When running async there are situations where data is left over in the table
after a transactional test. This means that repeat runs of the test suite
fail.
This commit is contained in:
Sam
2023-05-06 07:15:33 +10:00
committed by GitHub
parent c9a6d9ac89
commit 83f1a13374
5 changed files with 41 additions and 12 deletions

View File

@ -83,10 +83,12 @@ module CachedCounting
end end
def self.flush def self.flush
if @thread
@flush = true @flush = true
@thread.wakeup @thread.wakeup
sleep 0.001 while @flush sleep 0.001 while @flush
end end
end
COUNTER_REDIS_HASH = "CounterCacheHash" COUNTER_REDIS_HASH = "CounterCacheHash"
@ -163,10 +165,31 @@ module CachedCounting
end end
class_methods do class_methods do
if Rails.env.test?
# perform increment is a risky call in test,
# it shifts stuff to background threads and leaks
# data in the DB
# Require caller is deliberate if they want that
#
# Splitting implementation to avoid any perf impact
# given this is a method that is called a lot
def perform_increment!(key, async: false)
if async
CachedCounting.ensure_thread!
CachedCounting.queue(key, self)
else
CachedCounting.queue(key, self)
CachedCounting.clear_flush_to_db_lock!
CachedCounting.flush_in_memory
CachedCounting.flush_to_db
end
end
else
def perform_increment!(key) def perform_increment!(key)
CachedCounting.ensure_thread! CachedCounting.ensure_thread!
CachedCounting.queue(key, self) CachedCounting.queue(key, self)
end end
end
def write_cache!(key, count, date) def write_cache!(key, count, date)
raise NotImplementedError raise NotImplementedError

View File

@ -80,15 +80,15 @@ RSpec.describe CachedCounting do
freeze_time freeze_time
d1 = Time.now.utc.to_date d1 = Time.now.utc.to_date
RailsCacheCounter.perform_increment!("a,a") RailsCacheCounter.perform_increment!("a,a", async: true)
RailsCacheCounter.perform_increment!("b") RailsCacheCounter.perform_increment!("b", async: true)
20.times { RailsCacheCounter.perform_increment!("a,a") } 20.times { RailsCacheCounter.perform_increment!("a,a", async: true) }
freeze_time 2.days.from_now freeze_time 2.days.from_now
d2 = Time.now.utc.to_date d2 = Time.now.utc.to_date
RailsCacheCounter.perform_increment!("a,a") RailsCacheCounter.perform_increment!("a,a", async: true)
RailsCacheCounter.perform_increment!("d") RailsCacheCounter.perform_increment!("d", async: true)
CachedCounting.flush CachedCounting.flush

View File

@ -21,6 +21,7 @@ RSpec.describe Middleware::RequestTracker do
end end
after do after do
CachedCounting.reset
ApplicationRequest.disable ApplicationRequest.disable
CachedCounting.disable CachedCounting.disable
end end

View File

@ -1309,9 +1309,11 @@ RSpec.describe Report do
end end
after do after do
CachedCounting.reset
ApplicationRequest.disable ApplicationRequest.disable
CachedCounting.disable CachedCounting.disable
end end
it "works" do it "works" do
3.times { ApplicationRequest.increment!(:page_view_crawler) } 3.times { ApplicationRequest.increment!(:page_view_crawler) }
2.times { ApplicationRequest.increment!(:page_view_logged_in) } 2.times { ApplicationRequest.increment!(:page_view_logged_in) }

View File

@ -6,7 +6,10 @@ RSpec.describe WebCrawlerRequest do
CachedCounting.enable CachedCounting.enable
end end
after { CachedCounting.disable } after do
CachedCounting.reset
CachedCounting.disable
end
it "can log crawler requests" do it "can log crawler requests" do
freeze_time freeze_time