better structure for cache purge

This commit is contained in:
Kyle Drake 2014-08-11 20:45:43 -07:00
parent be128608b9
commit 63d9348012
3 changed files with 23 additions and 9 deletions

2
app.rb
View file

@ -557,7 +557,7 @@ post '/change_name' do
} }
old_file_paths.each do |file_path| old_file_paths.each do |file_path|
PurgeCacheWorker.async_queue "#{old_host}/#{file_path}" current_site.purge_cache file_path
end end
flash[:success] = "Site/user name has been changed. You will need to use this name to login, <b>don't forget it</b>." flash[:success] = "Site/user name has been changed. You will need to use this name to login, <b>don't forget it</b>."

View file

@ -196,7 +196,7 @@ class Site < Sequel::Model
%w{index not_found}.each do |name| %w{index not_found}.each do |name|
File.write file_path("#{name}.html"), render_template("#{name}.erb") File.write file_path("#{name}.html"), render_template("#{name}.erb")
PurgeCacheWorker.perform_async "#{host}/#{name}.html" purge_cache "#{name}.html"
ScreenshotWorker.perform_async values[:username], "#{name}.html" ScreenshotWorker.perform_async values[:username], "#{name}.html"
end end
@ -220,7 +220,7 @@ class Site < Sequel::Model
} }
site_files.file_list.collect {|f| f.filename}.each do |f| site_files.file_list.collect {|f| f.filename}.each do |f|
PurgeCacheWorker.async_queue "#{host}/#{f}" purge_cache f
end end
end end
@ -298,6 +298,12 @@ class Site < Sequel::Model
true true
end end
def purge_cache(filename)
payload = {site: username, path: filename}
payload[:domain] = domain if !domain.empty?
PurgeCacheWorker.perform_async payload
end
def store_file(filename, uploaded) def store_file(filename, uploaded)
if File.exist?(file_path(filename)) && if File.exist?(file_path(filename)) &&
Digest::SHA2.file(file_path(filename)).digest == Digest::SHA2.file(uploaded.path).digest Digest::SHA2.file(file_path(filename)).digest == Digest::SHA2.file(uploaded.path).digest
@ -316,7 +322,7 @@ class Site < Sequel::Model
FileUtils.mv uploaded.path, file_path(filename) FileUtils.mv uploaded.path, file_path(filename)
File.chmod(0640, file_path(filename)) File.chmod(0640, file_path(filename))
PurgeCacheWorker.perform_async "#{host}/#{filename}" purge_cache filename
ext = File.extname(filename).gsub(/^./, '') ext = File.extname(filename).gsub(/^./, '')
@ -363,7 +369,7 @@ class Site < Sequel::Model
rescue Errno::ENOENT rescue Errno::ENOENT
end end
PurgeCacheWorker.perform_async "#{host}/#{filename}" purge_cache filename
ext = File.extname(filename).gsub(/^./, '') ext = File.extname(filename).gsub(/^./, '')
@ -381,7 +387,7 @@ class Site < Sequel::Model
def install_new_html_file(name) def install_new_html_file(name)
File.write file_path(name), render_template('index.erb') File.write file_path(name), render_template('index.erb')
PurgeCacheWorker.perform_async "#{host}/#{name}" purge_cache name
end end
def file_exists?(filename) def file_exists?(filename)
@ -462,6 +468,11 @@ class Site < Sequel::Model
end end
if !values[:domain].nil? && !values[:domain].empty? if !values[:domain].nil? && !values[:domain].empty?
if values[:domain] =~ /neocities\.org/ || values[:domain] =~ /neocitiesops\.net/
errors.add :domain, "Domain is already being used.. by Neocities."
end
if !(values[:domain] =~ /^[a-zA-Z0-9.-]+\.[a-zA-Z0-9]+$/i) || values[:domain].length > 90 if !(values[:domain] =~ /^[a-zA-Z0-9.-]+\.[a-zA-Z0-9]+$/i) || values[:domain].length > 90
errors.add :domain, "Domain provided is not valid. Must take the form of domain.com" errors.add :domain, "Domain provided is not valid. Must take the form of domain.com"
end end

View file

@ -2,11 +2,14 @@ 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(url) def perform(payload)
attempt = 0
begin begin
$pubsub.publish 'purgecache', url attempt += 1
$pubsub.publish 'purgecache', payload.to_json
rescue Redis::BaseConnectionError => error rescue Redis::BaseConnectionError => error
puts "Pubsub error: #{error}, retrying in 1s" raise if attempt > 3
puts "pubsub error: #{error}, retrying in 1s"
sleep 1 sleep 1
retry retry
end end