From 94b3fd69038dd3f9c40371a7320b6715dd6c56e9 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Sun, 10 Aug 2014 00:55:13 -0700 Subject: [PATCH] purge cache pubsub implementation --- app.rb | 7 +++++++ environment.rb | 8 ++++++++ models/site.rb | 10 ++++++++++ workers/purge_cache_worker.rb | 14 ++++++++++++++ 4 files changed, 39 insertions(+) create mode 100644 workers/purge_cache_worker.rb diff --git a/app.rb b/app.rb index f769ef29..5409544b 100644 --- a/app.rb +++ b/app.rb @@ -545,6 +545,9 @@ post '/change_name' do redirect '/settings' end + old_host = current_site.host + old_file_paths = current_site.file_list.collect {|f| f.filename} + current_site.username = params[:name] if current_site.valid? @@ -553,6 +556,10 @@ post '/change_name' do current_site.move_files_from old_username } + old_file_paths.each do |file_path| + PurgeCacheWorker.async_queue "#{old_host}/#{file_path}" + end + flash[:success] = "Site/user name has been changed. You will need to use this name to login, don't forget it." redirect '/settings' else diff --git a/environment.rb b/environment.rb index 1b4a10da..5c55fd02 100644 --- a/environment.rb +++ b/environment.rb @@ -50,6 +50,14 @@ Sidekiq.configure_client do |config| config.redis = sidekiq_redis_config end +if $config['pubsub_url'] + $pubsub = Redis.new url: $config['pubsub_url'] +end + +if $config['pubsub_url'].nil? && ENV['RACK_ENV'] == 'production' + raise 'pubsub_url is missing from config' +end + require File.join(DIR_ROOT, 'workers', 'thumbnail_worker.rb') require File.join(DIR_ROOT, 'workers', 'screenshot_worker.rb') require File.join(DIR_ROOT, 'workers', 'email_worker.rb') diff --git a/models/site.rb b/models/site.rb index 2f2105d2..9c3fc3b8 100644 --- a/models/site.rb +++ b/models/site.rb @@ -184,6 +184,7 @@ class Site < Sequel::Model %w{index not_found}.each do |name| File.write file_path("#{name}.html"), render_template("#{name}.erb") + PurgeCacheWorker.perform_async "#{host}/#{name}.html" ScreenshotWorker.perform_async values[:username], "#{name}.html" end @@ -205,6 +206,10 @@ class Site < Sequel::Model self.updated_at = Time.now save(validate: false) } + + site_files.file_list.collect {|f| f.filename}.each do |f| + PurgeCacheWorker.async_queue "#{host}/#{f}" + end end =begin @@ -279,6 +284,8 @@ class Site < Sequel::Model FileUtils.mv uploaded.path, file_path(filename) File.chmod(0640, file_path(filename)) + PurgeCacheWorker.perform_async "#{host}/#{filename}" + ext = File.extname(filename).gsub(/^./, '') if ext.match HTML_REGEX @@ -324,6 +331,8 @@ class Site < Sequel::Model rescue Errno::ENOENT end + PurgeCacheWorker.perform_async "#{host}/#{filename}" + ext = File.extname(filename).gsub(/^./, '') screenshots_delete(filename) if ext.match HTML_REGEX @@ -340,6 +349,7 @@ class Site < Sequel::Model def install_new_html_file(name) File.write file_path(name), render_template('index.erb') + PurgeCacheWorker.perform_async "#{host}/#{name}" end def file_exists?(filename) diff --git a/workers/purge_cache_worker.rb b/workers/purge_cache_worker.rb new file mode 100644 index 00000000..b266be2d --- /dev/null +++ b/workers/purge_cache_worker.rb @@ -0,0 +1,14 @@ +class PurgeCacheWorker + include Sidekiq::Worker + sidekiq_options queue: :purgecache, retry: 10, backtrace: true + + def perform(url) + begin + $pubsub.publish 'purge', url + rescue Redis::BaseConnectionError => error + puts "Pubsub error: #{error}, retrying in 1s" + sleep 1 + retry + end + end +end \ No newline at end of file