Commit 0a38626f0a32cc17f9c9b6f1af36632d66196653
1 parent
33c616dd
Exists in
master
and in
1 other branch
catchup fix
when an idea is activated, reduce prompt_queue cache to refill size and schedule delayed job to regenerate prompts
Showing
3 changed files
with
30 additions
and
3 deletions
Show diff stats
app/models/choice.rb
... | ... | @@ -16,6 +16,7 @@ class Choice < ActiveRecord::Base |
16 | 16 | named_scope :inactive, :conditions => { :active => false} |
17 | 17 | |
18 | 18 | after_save :update_questions_counter |
19 | + after_save :update_prompt_queue | |
19 | 20 | |
20 | 21 | attr_protected :prompts_count, :wins, :losses, :score, :prompts_on_the_right_count, :prompts_on_the_left_count |
21 | 22 | attr_readonly :question_id |
... | ... | @@ -23,6 +24,14 @@ class Choice < ActiveRecord::Base |
23 | 24 | def update_questions_counter |
24 | 25 | self.question.update_attribute(:inactive_choices_count, self.question.choices.inactive.length) |
25 | 26 | end |
27 | + | |
28 | + # if changing a choice to active, we want to regenerate prompts | |
29 | + def update_prompt_queue | |
30 | + if self.changed.include?('active') && self.active? | |
31 | + self.question.mark_prompt_queue_for_refill | |
32 | + self.question.choose_prompt | |
33 | + end | |
34 | + end | |
26 | 35 | |
27 | 36 | def before_create |
28 | 37 | unless self.score | ... | ... |
app/models/question.rb
... | ... | @@ -29,6 +29,12 @@ class Question < ActiveRecord::Base |
29 | 29 | |
30 | 30 | attr_readonly :site_id |
31 | 31 | |
32 | + # regenerate prompts if cache is less than this full | |
33 | + # ideally this prevents active marketplaces from | |
34 | + # regenerating prompts too frequently | |
35 | + @@percent_full = 0.9 | |
36 | + @@num_prompts = 1000 | |
37 | + | |
32 | 38 | named_scope :created_by, lambda { |id| |
33 | 39 | {:conditions => { :local_identifier => id } } |
34 | 40 | } |
... | ... | @@ -474,13 +480,20 @@ class Question < ActiveRecord::Base |
474 | 480 | $redis.del(self.pq_key) |
475 | 481 | end |
476 | 482 | |
483 | + | |
484 | + # make prompt queue less than @@precent_full | |
485 | + def mark_prompt_queue_for_refill | |
486 | + # 2 because redis starts indexes at 0 | |
487 | + new_size = (@@num_prompts * @@percent_full - 2).floor | |
488 | + $redis.ltrim(self.pq_key, 0, new_size) | |
489 | + end | |
490 | + | |
477 | 491 | def add_prompt_to_queue |
478 | - num_prompts = 1000 | |
479 | 492 | # if less than 90% full, regenerate prompts |
480 | 493 | # we skip generating prompts if more than 90% full to |
481 | 494 | # prevent one busy marketplace for ruling the queue |
482 | - if $redis.llen(self.pq_key) < num_prompts * 0.9 | |
483 | - prompts = self.catchup_choose_prompt(num_prompts) | |
495 | + if $redis.llen(self.pq_key) < @@num_prompts * @@percent_full | |
496 | + prompts = self.catchup_choose_prompt(@@num_prompts) | |
484 | 497 | # clear list |
485 | 498 | $redis.ltrim(self.pq_key, 0, 0) |
486 | 499 | $redis.lpop(self.pq_key) | ... | ... |
spec/models/choice_spec.rb
... | ... | @@ -86,6 +86,11 @@ describe Choice do |
86 | 86 | choice1.should be_active |
87 | 87 | end |
88 | 88 | |
89 | + it "should create a delayed job on activation" do | |
90 | + choice1 = Choice.create!(@valid_attributes.merge(:data => '1234')) | |
91 | + proc { choice1.deactivate! }.should change(Delayed::Job, :count).by(1) | |
92 | + end | |
93 | + | |
89 | 94 | it "should update a question's counter cache on deactivation" do |
90 | 95 | prev_inactive = @question.inactive_choices_count |
91 | 96 | choice1 = Choice.create!(@valid_attributes.merge(:data => '1234')) | ... | ... |