move item cache sweeping and flex syncing to background tasks
This commit is contained in:
parent
4144b4dc74
commit
728ff60c5f
10 changed files with 73 additions and 24 deletions
|
@ -37,7 +37,7 @@ GIT
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
remote: git://github.com/matchu/flex.git
|
remote: git://github.com/matchu/flex.git
|
||||||
revision: d62f508f795ecdbb383f406865daa72368b43ba5
|
revision: 6d7e3fd6e2845ae978545be67b912323888d1ebb
|
||||||
specs:
|
specs:
|
||||||
flex (0.4.1)
|
flex (0.4.1)
|
||||||
multi_json (~> 1.3.4)
|
multi_json (~> 1.3.4)
|
||||||
|
@ -186,7 +186,7 @@ GEM
|
||||||
patron (0.4.18)
|
patron (0.4.18)
|
||||||
polyglot (0.3.3)
|
polyglot (0.3.3)
|
||||||
progressbar (0.11.0)
|
progressbar (0.11.0)
|
||||||
prompter (0.1.5)
|
prompter (0.1.6)
|
||||||
dye (>= 0.1.1)
|
dye (>= 0.1.1)
|
||||||
yard (>= 0.6.3)
|
yard (>= 0.6.3)
|
||||||
rack (1.4.5)
|
rack (1.4.5)
|
||||||
|
@ -292,7 +292,7 @@ GEM
|
||||||
activesupport (>= 2.3.4)
|
activesupport (>= 2.3.4)
|
||||||
chronic (~> 0.6.3)
|
chronic (~> 0.6.3)
|
||||||
will_paginate (3.0.4)
|
will_paginate (3.0.4)
|
||||||
yard (0.8.5.2)
|
yard (0.8.7.3)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
|
|
@ -41,7 +41,8 @@ class Item < ActiveRecord::Base
|
||||||
|
|
||||||
scope :with_closet_hangers, joins(:closet_hangers)
|
scope :with_closet_hangers, joins(:closet_hangers)
|
||||||
|
|
||||||
flex.sync self
|
# Syncing is now handled in background tasks, created in the ItemObserver.
|
||||||
|
flex.sync self, callbacks: []
|
||||||
|
|
||||||
def flex_source
|
def flex_source
|
||||||
indexed_attributes = {
|
indexed_attributes = {
|
||||||
|
|
21
app/models/item/create_task.rb
Normal file
21
app/models/item/create_task.rb
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
class Item
|
||||||
|
class CreateTask
|
||||||
|
extend FragmentExpiration
|
||||||
|
|
||||||
|
TIMEOUT_IN_SECONDS = 10
|
||||||
|
|
||||||
|
@queue = :item_create
|
||||||
|
|
||||||
|
def self.perform(id)
|
||||||
|
Timeout::timeout(TIMEOUT_IN_SECONDS) do
|
||||||
|
Item.find(id).flex.sync
|
||||||
|
expire_newest_items
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.expire_newest_items
|
||||||
|
expire_fragment_in_all_locales('outfits#new newest_items')
|
||||||
|
expire_fragment_in_all_locales('items#index newest_items')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
17
app/models/item/destroy_task.rb
Normal file
17
app/models/item/destroy_task.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
class Item
|
||||||
|
class DestroyTask
|
||||||
|
extend FragmentExpiration
|
||||||
|
|
||||||
|
TIMEOUT_IN_SECONDS = 10
|
||||||
|
|
||||||
|
@queue = :item_destroy
|
||||||
|
|
||||||
|
def self.perform(id)
|
||||||
|
Timeout::timeout(TIMEOUT_IN_SECONDS) do
|
||||||
|
Item.find(id).flex.sync
|
||||||
|
# TODO: it's kinda ugly to reach across classes like this
|
||||||
|
CreateTask.expire_newest_items
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
26
app/models/item/update_task.rb
Normal file
26
app/models/item/update_task.rb
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
class Item
|
||||||
|
class UpdateTask
|
||||||
|
extend FragmentExpiration
|
||||||
|
|
||||||
|
TIMEOUT_IN_SECONDS = 10
|
||||||
|
|
||||||
|
@queue = :item_update
|
||||||
|
|
||||||
|
def self.perform(id)
|
||||||
|
Timeout::timeout(TIMEOUT_IN_SECONDS) do
|
||||||
|
item = Item.find(id)
|
||||||
|
expire_cache_for(item)
|
||||||
|
item.flex.sync
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def self.expire_cache_for(item)
|
||||||
|
expire_fragment_in_all_locales("items/#{item.id}#item_link_partial")
|
||||||
|
expire_fragment_in_all_locales("items/#{item.id} header")
|
||||||
|
expire_fragment_in_all_locales("items/#{item.id} info")
|
||||||
|
expire_key_in_all_locales("items/#{item.id}#as_json")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,31 +2,15 @@ class ItemObserver < ActionController::Caching::Sweeper
|
||||||
include FragmentExpiration
|
include FragmentExpiration
|
||||||
|
|
||||||
def after_create(item)
|
def after_create(item)
|
||||||
Rails.logger.debug "Item #{item.id} was just created"
|
Resque.enqueue(Item::CreateTask, item.id)
|
||||||
expire_newest_items
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def after_update(item)
|
def after_update(item)
|
||||||
Rails.logger.debug "Item #{item.id} was just updated"
|
# CONSIDER: can pass item.changes.keys in to choose which caches to expire
|
||||||
expire_cache_for(item)
|
Resque.enqueue(Item::UpdateTask, item.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def after_destroy(item)
|
def after_destroy(item)
|
||||||
Rails.logger.debug "Item #{item.id} was just destroyed"
|
Resque.enqueue(Item::DestroyTask, item.id)
|
||||||
expire_cache_for(item)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def expire_cache_for(item)
|
|
||||||
expire_fragment_in_all_locales("items/#{item.id}#item_link_partial")
|
|
||||||
expire_fragment_in_all_locales("items/#{item.id} header")
|
|
||||||
expire_fragment_in_all_locales("items/#{item.id} info")
|
|
||||||
expire_key_in_all_locales("items/#{item.id}#as_json")
|
|
||||||
end
|
|
||||||
|
|
||||||
def expire_newest_items
|
|
||||||
expire_fragment_in_all_locales('outfits#new newest_items')
|
|
||||||
expire_fragment_in_all_locales('items#index newest_items')
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
BIN
vendor/cache/prompter-0.1.5.gem
vendored
BIN
vendor/cache/prompter-0.1.5.gem
vendored
Binary file not shown.
BIN
vendor/cache/prompter-0.1.6.gem
vendored
Normal file
BIN
vendor/cache/prompter-0.1.6.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/yard-0.8.5.2.gem
vendored
BIN
vendor/cache/yard-0.8.5.2.gem
vendored
Binary file not shown.
BIN
vendor/cache/yard-0.8.7.3.gem
vendored
Normal file
BIN
vendor/cache/yard-0.8.7.3.gem
vendored
Normal file
Binary file not shown.
Loading…
Reference in a new issue