implement the cache purger

This commit is contained in:
Kyle Drake 2015-07-02 14:23:22 -07:00
parent 4bfaa32431
commit 3a6ca6c12b
5 changed files with 67 additions and 28 deletions

View file

@ -29,7 +29,7 @@ gem 'rest-client'
gem 'geoip' gem 'geoip'
gem 'io-extra', require: 'io/extra' gem 'io-extra', require: 'io/extra'
gem 'rye' gem 'rye'
gem 'timecop' gem 'dnsruby'
platform :mri, :rbx do platform :mri, :rbx do
gem 'magic' # sudo apt-get install file, For OSX: brew install libmagic gem 'magic' # sudo apt-get install file, For OSX: brew install libmagic
@ -76,6 +76,7 @@ group :test do
gem 'rack_session_access', require: nil gem 'rack_session_access', require: nil
gem 'webmock', require: nil gem 'webmock', require: nil
gem 'stripe-ruby-mock', '~> 2.0.1', require: 'stripe_mock' gem 'stripe-ruby-mock', '~> 2.0.1', require: 'stripe_mock'
gem 'timecop'
platform :mri, :rbx do platform :mri, :rbx do
gem 'simplecov', require: nil gem 'simplecov', require: nil

View file

@ -49,6 +49,7 @@ GEM
rack (>= 1.1.0) rack (>= 1.1.0)
uuidtools (~> 2.1.1) uuidtools (~> 2.1.1)
debugger-linecache (1.2.0) debugger-linecache (1.2.0)
dnsruby (1.58.0)
docile (1.1.3) docile (1.1.3)
domain_name (0.5.23) domain_name (0.5.23)
unf (>= 0.0.5, < 1.0.0) unf (>= 0.0.5, < 1.0.0)
@ -261,6 +262,7 @@ DEPENDENCIES
capybara_minitest_spec capybara_minitest_spec
cocaine cocaine
dav4rack dav4rack
dnsruby
erubis erubis
fabrication fabrication
faker faker

View file

@ -75,18 +75,6 @@ if ENV['RACK_ENV'] == 'development'
end end
# :nocov: # :nocov:
# :nocov:
if $config['pubsub_url']
$pubsub_pool = ConnectionPool.new(size: 10, timeout: 5) {
Redis.new url: $config['pubsub_url']
}
end
if $config['pubsub_url'].nil? && ENV['RACK_ENV'] == 'production'
raise 'pubsub_url is missing from config'
end
# :nocov:
Sequel.datetime_class = Time Sequel.datetime_class = Time
Sequel.extension :core_extensions Sequel.extension :core_extensions
Sequel.extension :migration Sequel.extension :migration

View file

@ -0,0 +1,47 @@
require_relative '../environment.rb'
describe PurgeCacheWorker do
before do
@test_ips = ['10.0.0.1', '10.0.0.2']
end
it 'throws exception without 200 or 404 http status' do
@test_ips.each do |ip|
stub_request(:get, "https://#{ip}/:cache/purgetest.jpg").
with(headers: {'Host' => 'kyledrake.neocities.org'})
.to_return(status: 503)
end
worker = PurgeCacheWorker.new
proc {
worker.perform 'kyledrake', 'test.jpg'
}.must_raise RestClient::ServiceUnavailable
end
it 'handles 404 without exception' do
@test_ips.each do |ip|
stub_request(:get, "https://#{ip}/:cache/purgetest.jpg").
with(headers: {'Host' => 'kyledrake.neocities.org'})
.to_return(status: 404)
end
worker = PurgeCacheWorker.new
worker.perform 'kyledrake', 'test.jpg'
end
it 'sends a purge to each dns ip' do
@test_ips.each do |ip|
stub_request(:get, "https://#{ip}/:cache/purgetest.jpg").
with(headers: {'Host' => 'kyledrake.neocities.org'})
.to_return(status: 200)
end
worker = PurgeCacheWorker.new
worker.perform 'kyledrake', 'test.jpg'
@test_ips.each do |ip|
assert_requested :get, "https://#{ip}/:cache/purgetest.jpg"
end
end
end

View file

@ -2,21 +2,22 @@ class PurgeCacheWorker
include Sidekiq::Worker include Sidekiq::Worker
sidekiq_options queue: :purgecache, retry: 10, backtrace: true sidekiq_options queue: :purgecache, retry: 10, backtrace: true
def perform(subdomain, path)
res = Dnsruby::Resolver.new
def perform(payload) if ENV['RACK_ENV'] == 'test'
# :nocov: proxy_ips = ['10.0.0.1', '10.0.0.2']
attempt = 0 else
begin proxy_ips = res.query($config['cache_purge_ips_uri']).answer.collect {|a| a.address.to_s}
attempt += 1 end
$pubsub_pool.with do |redis|
redis.publish 'purgecache', payload.to_json proxy_ips.each do |proxy_ip|
end url = "http://#{proxy_ip}/:cache/purge#{path}"
rescue Redis::BaseConnectionError => error
raise if attempt > 3 begin
puts "pubsub error: #{error}, retrying in 1s" RestClient.get(url, host: "#{subdomain}.neocities.org")
sleep 1 rescue RestClient::ResourceNotFound
retry end
end end
# :nocov:
end end
end end