Skip to content

Commit

Permalink
Do not load redis gem when incompatible
Browse files Browse the repository at this point in the history
  • Loading branch information
marcotc committed Dec 6, 2024
1 parent 211b849 commit f025594
Show file tree
Hide file tree
Showing 16 changed files with 134 additions and 8 deletions.
3 changes: 3 additions & 0 deletions Matrixfile
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,9 @@
'rails6-semantic-logger' => '✅ 2.5 / ✅ 2.6 / ✅ 2.7 / ❌ 3.0 / ❌ 3.1 / ❌ 3.2 / ❌ 3.3 / ❌ 3.4 / ✅ jruby',
'rails61-semantic-logger' => '✅ 2.5 / ✅ 2.6 / ✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ 3.4 / ✅ jruby'
},
'rails_old_redis' => {
'rails-old-redis' => '✅ 2.5 / ✅ 2.6 / ✅ 2.7 / ✅ 3.0 / ✅ 3.1 / ✅ 3.2 / ✅ 3.3 / ✅ 3.4 / ✅ jruby',
},
'action_cable' => {
# FIXME: Enable the test for JRuby after fixing `log writing failed. closed stream` in CircleCI.
'rails5-mysql2' => '✅ 2.5 / ✅ 2.6 / ❌ 2.7 / ❌ 3.0 / ❌ 3.1 / ❌ 3.2 / ❌ 3.3 / ❌ 3.4 / ❌ jruby',
Expand Down
9 changes: 9 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,15 @@ namespace :spec do
t.rspec_opts = args.to_a.join(' ')
end

# Tests if Datadog::Tracing::Contrib::ActiveSupport::Cache::Redis::Patcher does not eager load
# ActiveSupport::Cache::RedisCacheStore when the version of Redis present is too old to be compatible.
# @see Datadog::Tracing::Contrib::ActiveSupport::Cache::Redis::Patcher#patch_redis_cache_store?
desc '' # "Explicitly hiding from `rake -T`"
RSpec::Core::RakeTask.new(:rails_old_redis) do |t, args|
t.pattern = 'spec/datadog/tracing/contrib/rails/cache_spec.rb'
t.rspec_opts = args.to_a.join(' ')
end

desc '' # "Explicitly hiding from `rake -T`"
RSpec::Core::RakeTask.new(:hanami) do |t, args|
t.pattern = 'spec/datadog/tracing/contrib/hanami/**/*_spec.rb'
Expand Down
10 changes: 10 additions & 0 deletions appraisal/jruby-9.2.rb
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,16 @@
gem 'i18n', '1.8.7', platform: :jruby # Removal pending: https://github.com/ruby-i18n/i18n/issues/555#issuecomment-772112169
end

appraise 'rails-old-redis' do
# All dependencies except Redis < 4 are not important, they are just required to run Rails tests.
gem 'redis', '< 4'
gem 'rails', '~> 6.1.0'
gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
gem 'sprockets', '< 4'
gem 'lograge', '~> 0.11'
gem 'net-smtp'
end

appraise 'resque2-redis3' do
gem 'redis', '< 4.0'
gem 'resque', '>= 2.0'
Expand Down
10 changes: 10 additions & 0 deletions appraisal/jruby-9.3.rb
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,16 @@
gem 'rails_semantic_logger', '~> 4.0'
end

appraise 'rails-old-redis' do
# All dependencies except Redis < 4 are not important, they are just required to run Rails tests.
gem 'redis', '< 4'
gem 'rails', '~> 6.1.0'
gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
gem 'sprockets', '< 4'
gem 'lograge', '~> 0.11'
gem 'net-smtp'
end

appraise 'resque2-redis3' do
gem 'redis', '~> 3.0'
gem 'resque', '>= 2.0'
Expand Down
10 changes: 10 additions & 0 deletions appraisal/jruby-9.4.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,16 @@
gem 'net-smtp'
end

appraise 'rails-old-redis' do
# All dependencies except Redis < 4 are not important, they are just required to run Rails tests.
gem 'redis', '< 4'
gem 'rails', '~> 6.1.0'
gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby
gem 'sprockets', '< 4'
gem 'lograge', '~> 0.11'
gem 'net-smtp'
end

appraise 'resque2-redis3' do
gem 'redis', '< 4.0'
gem 'resque', '>= 2.0'
Expand Down
9 changes: 9 additions & 0 deletions appraisal/ruby-2.5.rb
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,15 @@
gem 'rails_semantic_logger', '~> 4.0'
end

appraise 'rails-old-redis' do
# All dependencies except Redis < 4 are not important, they are just required to run Rails tests.
gem 'redis', '< 4'
gem 'rails', '~> 6.1.0'
gem 'pg', '>= 1.1', platform: :ruby
gem 'sprockets', '< 4'
gem 'lograge', '~> 0.11'
end

appraise 'resque2-redis3' do
gem 'redis', '< 4.0'
gem 'resque', '>= 2.0'
Expand Down
9 changes: 9 additions & 0 deletions appraisal/ruby-2.6.rb
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,15 @@
gem 'rails_semantic_logger', '~> 4.0'
end

appraise 'rails-old-redis' do
# All dependencies except Redis < 4 are not important, they are just required to run Rails tests.
gem 'redis', '< 4'
gem 'rails', '~> 6.1.0'
gem 'pg', '>= 1.1', platform: :ruby
gem 'sprockets', '< 4'
gem 'lograge', '~> 0.11'
end

appraise 'resque2-redis3' do
gem 'redis', '~> 3.0'
gem 'resque', '>= 2.0'
Expand Down
9 changes: 9 additions & 0 deletions appraisal/ruby-2.7.rb
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,15 @@
gem 'rails_semantic_logger', '~> 4.0'
end

appraise 'rails-old-redis' do
# All dependencies except Redis < 4 are not important, they are just required to run Rails tests.
gem 'redis', '< 4'
gem 'rails', '~> 6.1.0'
gem 'pg', '>= 1.1', platform: :ruby
gem 'sprockets', '< 4'
gem 'lograge', '~> 0.11'
end

appraise 'resque2-redis3' do
gem 'redis', '< 4.0'
gem 'resque', '>= 2.0'
Expand Down
9 changes: 9 additions & 0 deletions appraisal/ruby-3.0.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@
gem 'rails', '~> 7.1.0'
end

appraise 'rails-old-redis' do
# All dependencies except Redis < 4 are not important, they are just required to run Rails tests.
gem 'redis', '< 4'
gem 'rails', '~> 6.1.0'
gem 'pg', '>= 1.1', platform: :ruby
gem 'sprockets', '< 4'
gem 'lograge', '~> 0.11'
end

appraise 'resque2-redis3' do
gem 'redis', '< 4.0'
gem 'resque', '>= 2.0'
Expand Down
9 changes: 9 additions & 0 deletions appraisal/ruby-3.1.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@
gem 'rails', '~> 7.1.0'
end

appraise 'rails-old-redis' do
# All dependencies except Redis < 4 are not important, they are just required to run Rails tests.
gem 'redis', '< 4'
gem 'rails', '~> 6.1.0'
gem 'pg', '>= 1.1', platform: :ruby
gem 'sprockets', '< 4'
gem 'lograge', '~> 0.11'
end

appraise 'resque2-redis3' do
gem 'redis', '< 4.0'
gem 'resque', '>= 2.0'
Expand Down
9 changes: 9 additions & 0 deletions appraisal/ruby-3.2.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@
gem 'rails', '~> 7.1.0'
end

appraise 'rails-old-redis' do
# All dependencies except Redis < 4 are not important, they are just required to run Rails tests.
gem 'redis', '< 4'
gem 'rails', '~> 6.1.0'
gem 'pg', '>= 1.1', platform: :ruby
gem 'sprockets', '< 4'
gem 'lograge', '~> 0.11'
end

appraise 'resque2-redis3' do
gem 'redis', '< 4.0'
gem 'resque', '>= 2.0'
Expand Down
9 changes: 9 additions & 0 deletions appraisal/ruby-3.3.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@
gem 'rails', '~> 7.1.0'
end

appraise 'rails-old-redis' do
# All dependencies except Redis < 4 are not important, they are just required to run Rails tests.
gem 'redis', '< 4'
gem 'rails', '~> 6.1.0'
gem 'pg', '>= 1.1', platform: :ruby
gem 'sprockets', '< 4'
gem 'lograge', '~> 0.11'
end

appraise 'resque2-redis3' do
gem 'redis', '< 4.0'
gem 'resque', '>= 2.0'
Expand Down
9 changes: 9 additions & 0 deletions appraisal/ruby-3.4.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,15 @@
gem 'rails', '~> 7.1.0'
end

appraise 'rails-old-redis' do
# All dependencies except Redis < 4 are not important, they are just required to run Rails tests.
gem 'redis', '< 4'
gem 'rails', '~> 6.1.0'
gem 'pg', '>= 1.1', platform: :ruby
gem 'sprockets', '< 4'
gem 'lograge', '~> 0.11'
end

appraise 'resque2-redis3' do
gem 'redis', '< 4.0'
gem 'resque', '>= 2.0'
Expand Down
20 changes: 16 additions & 4 deletions lib/datadog/tracing/contrib/active_support/cache/redis.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,29 @@ module Patcher
# For Rails >= 5.2 w/o redis-activesupport...
# ActiveSupport includes a Redis cache store internally, and does not require these overrides.
# https://github.com/rails/rails/blob/master/activesupport/lib/active_support/cache/redis_cache_store.rb
def patch_redis?(meth)
def patch_redis_activesupport?(meth)
!Gem.loaded_specs['redis-activesupport'].nil? \
&& defined?(::ActiveSupport::Cache::RedisStore) \
&& ::ActiveSupport::Cache::RedisStore.instance_methods(false).include?(meth)
end

# Patches the Rails built-in Redis cache backend `redis_cache_store`, added in Rails 5.2.
# We avoid loading the RedisCacheStore class, as it invokes the statement `gem "redis", ">= 4.0.1"` which
# fails if the application is using an old version of Redis, or not using Redis at all.
# @see https://github.com/rails/rails/blob/d0dcb8fa6073a0c4d42600c15e82e3bb386b27d3/activesupport/lib/active_support/cache/redis_cache_store.rb#L4
def patch_redis_cache_store?(meth)
Gem.loaded_specs['redis'] &&
# Autoload constants return `constant` for `defined?`, but that doesn't mean they are loaded...
defined?(::ActiveSupport::Cache::RedisCacheStore) &&
# ... to check that we need to call `autoload?` and check if it returns `nil`, meaning it's loaded.
::ActiveSupport::Cache.autoload?(:RedisCacheStore).nil? &&
::ActiveSupport::Cache::RedisCacheStore.instance_methods(false).include?(meth)
end

def cache_store_class(meth)
if patch_redis?(meth)
if patch_redis_activesupport?(meth)
[::ActiveSupport::Cache::RedisStore, ::ActiveSupport::Cache::Store]
elsif Gem.loaded_specs['redis'] && defined?(::ActiveSupport::Cache::RedisCacheStore) \
&& ::ActiveSupport::Cache::RedisCacheStore.instance_methods(false).include?(meth)
elsif patch_redis_cache_store?(meth)
[::ActiveSupport::Cache::RedisCacheStore, ::ActiveSupport::Cache::Store]
else
super
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ module Datadog

def self?.patch: () -> untyped

def self?.cache_store_class: (untyped meth) -> untyped
def self?.cache_store_class: (Symbol meth) -> Array[Class]

def self?.patch_cache_store_read: () -> untyped

Expand Down
6 changes: 3 additions & 3 deletions sig/datadog/tracing/contrib/active_support/cache/redis.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ module Datadog
module Cache
module Redis
module Patcher
def patch_redis?: (untyped meth) -> untyped

def cache_store_class: (untyped meth) -> untyped
def patch_redis_activesupport?: (Symbol) -> bool
def patch_redis_cache_store?: (Symbol) -> bool
def cache_store_class: (Symbol) -> Array[Class]
end
end
end
Expand Down

0 comments on commit f025594

Please sign in to comment.