From 5bd042e7d67143f09b4908fc449dd06b33086cde Mon Sep 17 00:00:00 2001 From: Ben Halpern Date: Mon, 9 Mar 2020 16:22:42 -0400 Subject: [PATCH] Prune old field tests for ongoing tests (#6540) [deploy] --- .../prune_old_experiments_worker.rb | 13 +++++++++++ lib/tasks/fetch.rake | 7 ++++++ spec/factories/field_test_memberships.rb | 8 +++++++ .../prune_old_experiments_worker_spec.rb | 22 +++++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 app/workers/field_tests/prune_old_experiments_worker.rb create mode 100644 spec/factories/field_test_memberships.rb create mode 100644 spec/workers/field_tests/prune_old_experiments_worker_spec.rb diff --git a/app/workers/field_tests/prune_old_experiments_worker.rb b/app/workers/field_tests/prune_old_experiments_worker.rb new file mode 100644 index 000000000..952be381b --- /dev/null +++ b/app/workers/field_tests/prune_old_experiments_worker.rb @@ -0,0 +1,13 @@ +module FieldTests + class PruneOldExperimentsWorker + include Sidekiq::Worker + sidekiq_options queue: :low_priority, retry: 10 + + def perform + five_precent_membership_count = FieldTest::Membership.count / 20 + memberships = FieldTest::Membership.first(five_precent_membership_count) + FieldTest::Event.where(field_test_membership_id: memberships.pluck(:id)).delete_all + memberships.map(&:delete) + end + end +end diff --git a/lib/tasks/fetch.rake b/lib/tasks/fetch.rake index 75ed7dbba..4422f11fa 100644 --- a/lib/tasks/fetch.rake +++ b/lib/tasks/fetch.rake @@ -98,6 +98,13 @@ task award_contributor_badges_from_github: :environment do BadgeRewarder.award_contributor_badges_from_github end +# This task is meant to be scheduled daily +task prune_old_field_tests: :environment do + # For rolling ongoing experiemnts, we remove old experiment memberships + # So that they can be re-tested. + FieldTests::PruneOldExperimentsWorker.perform_async +end + task remove_old_html_variant_data: :environment do HtmlVariantTrial.where("created_at < ?", 2.weeks.ago).destroy_all HtmlVariantSuccess.where("created_at < ?", 2.weeks.ago).destroy_all diff --git a/spec/factories/field_test_memberships.rb b/spec/factories/field_test_memberships.rb new file mode 100644 index 000000000..13129e48e --- /dev/null +++ b/spec/factories/field_test_memberships.rb @@ -0,0 +1,8 @@ +FactoryBot.define do + factory :field_test_memberships, class: "FieldTest::Membership" do + converted { false } + experiment { :user_home_feed } + participant_type { "User" } + variant { "base" } + end +end diff --git a/spec/workers/field_tests/prune_old_experiments_worker_spec.rb b/spec/workers/field_tests/prune_old_experiments_worker_spec.rb new file mode 100644 index 000000000..1255f06ff --- /dev/null +++ b/spec/workers/field_tests/prune_old_experiments_worker_spec.rb @@ -0,0 +1,22 @@ +require "rails_helper" + +RSpec.describe FieldTests::PruneOldExperimentsWorker, type: :worker do + include_examples "#enqueues_on_correct_queue", "low_priority", 1 + include FieldTest::Helpers + + describe "#perform" do + let(:worker) { subject } + + it "prunes first 5% of memberships and events" do + create_list(:user, 40) + User.all.each do |user| + create(:field_test_memberships, participant_id: user.id.to_s) + field_test_converted(:user_home_feed, participant: user, goal: "user_creates_comment") + end + worker.perform + expect(FieldTest::Membership.count).to be(38) + expect(FieldTest::Event.count).to be(38) + expect(FieldTest::Event.pluck(:field_test_membership_id).sort).to eq(FieldTest::Membership.pluck(:id).sort) + end + end +end