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
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 41 additions and 12 deletions

View File

@ -83,9 +83,11 @@ module CachedCounting
end
def self.flush
@flush = true
@thread.wakeup
sleep 0.001 while @flush
if @thread
@flush = true
@thread.wakeup
sleep 0.001 while @flush
end
end
COUNTER_REDIS_HASH = "CounterCacheHash"
@ -163,9 +165,30 @@ module CachedCounting
end
class_methods do
def perform_increment!(key)
CachedCounting.ensure_thread!
CachedCounting.queue(key, self)
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)
CachedCounting.ensure_thread!
CachedCounting.queue(key, self)
end
end
def write_cache!(key, count, date)

View File

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

View File

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

View File

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

View File

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