Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Require script_id for SingleSectionExperiment and TeacherBasedExperiment #54843

Merged
merged 4 commits into from
Nov 14, 2023

Conversation

davidsbailey
Copy link
Member

@davidsbailey davidsbailey commented Nov 10, 2023

When we added sections 20-40 to the ai-rubrics experiment, we discovered that the presence of so many SingleSectionExperiment objects in production was causing high DB usage, because we would look up the sections of the current user on every page load. Details here: https://codedotorg.slack.com/archives/C0T0PNTM3/p1698947153623759?thread_ts=1698936572.562019&cid=C0T0PNTM3

We mitigated the problem by adding script_id to every SingleSectionExperiment in the DB. this works because the main hot codepath for looking up user experiments does not specify a script_id:

Which causes the experiment lookup to short circuit without querying the database, here:

(experiment.script_id.nil? || experiment.script_id == script.try(:id)) &&

This PR generalizes the solution by requiring that SingleSectionExperiment and TeacherBasedExperiment have a script_id, causing DB lookups to be skipped in most cases.

It's worth noting that there will still be some DB activity for each SingleSectionExperiment, because users who are viewing levels in the unit matching the script_id of any SingleSectionExperiment will trigger DB access, here:

However, empirical evidence suggests that we have sufficient headroom in database CPU that this won't become a problem with moderate numbers of SingleSectionExperiment objects, especially if they are assigned to units which are not frequently visited (i.e. not HOC units).

Testing story

added / updated unit tests

Follow-up work

open to ideas here

@davidsbailey davidsbailey marked this pull request as ready for review November 13, 2023 22:18
@davidsbailey davidsbailey requested a review from a team as a code owner November 13, 2023 22:18
@davidsbailey davidsbailey requested review from bethanyaconnor and a team November 13, 2023 22:19
@davidsbailey davidsbailey removed the request for review from a team November 13, 2023 22:20
Copy link
Contributor

@bethanyaconnor bethanyaconnor left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

As a future future improvement, I wonder if we should clean up these rows when the pilot is over. The problem isn't mitigates if we have many experiments across multiple scripts -- that doesn't feel likely to happen all at once, but could be a long-term issue.

@davidsbailey
Copy link
Member Author

I agree, we can't be sure this issue is totally behind us. I can set a reminder to remove these, but I think a greater risk than forgetting about these records is that we create too many of them in the first place. For example, the open pilot is currently estimated to have 11,000 sections in it, which seems like too many for this implementation. Would it help to add a validation that there can't be more than, say, 1000 instances of SingleSectionExperiment for a given experiment name? https://stackoverflow.com/questions/1270663/validate-max-amount-af-associated-objects

@bethanyaconnor
Copy link
Contributor

That could be helpful, but I think it's worse if we have a lot of different experiments across different scripts, right? That would result in a larger percentage of requests checking for inclusion in these experiments, possibly leading to the congestion we saw on the database. So I wonder if it makes more sense to have a strict limit on the number of rows across all experiments?

Either way, this change is definitely necessary, based on the issues we saw.

@davidsbailey davidsbailey merged commit 663fc1e into staging Nov 14, 2023
2 checks passed
@davidsbailey davidsbailey deleted the require-experiment-script-id branch November 14, 2023 21:53
@davidsbailey
Copy link
Member Author

I would argue the negative impact is proportional to the number of SingleSectionExperiments with a given script id times the frequency with which users load that script . The experiment name isn't particularly relevant from a technical standpoint, rather it seemed like a way to add a limit while avoiding the situation where one team's experiment could interfere with another's.

I think you're right that a total limit on the number of SingleSectionExperiment rows is probably better though. If a team is in a pinch, they can always bypass the validation to create row 1001 while they regroup and decide what to do next.

molly-moen added a commit that referenced this pull request Nov 15, 2023
* Tutorial explorer: preview mode on hourofcode.com

* Updated test to account for flakiness.

* Added comment

* Re-enabled test

* hoc2023: AI string updates

* Use use_preview variable

* Update schema cache dump after schema changes.

* Require script_id for SingleSectionExperiment and TeacherBasedExperiment (#54843)

* require script_id on SingleSectionExperiment and TeacherBasedExperiment

* fix and improve unit tests

* fix unit tests

* revert stray schema changes

* Update string and font size

* Split lines for explanation text.

* update injection options (#54818)

* Handle pending and error states for rubric ai evaluation (#54860)

* updated rubric for more useful error messages

* updated rubric settings tests for new errors

* undo debug changes to rubrics_controller

* bug fixes

* added messages for pending and running states

* Dance AI: Add start over button (#54899)

* Dance AI: Add start over button

* don't show on explanation page, add tooltips

* Updates to instructions in HoC progression (#54881)

Updates to instructions in HoC progression

* Allow setting workshop organizer permission (#54896)

* Allow setting workshop organizer permission

* Update Assignable Permissions

* added categories and standards csv files (#54933)

* levelbuilder content changes (-robo-commit)

* staging content changes (-robo-commit)

* * removed empty files on dashboard/public/fonts/gotham (#54906)

* P20-522: Fix Express22 level (#54789)

* P20-522: Translate `gamelab_ifVarEquals` block type NUM vsriables

* P20-522: Translate `procedures_defnoreturn` block id attr

* Revert "P20-522: Translate `procedures_defnoreturn` block id attr"

This reverts commit e0f4280.

* [DESign2-51] Add Chips component (#54064)

* Created Chips component
* created stories for Chips
* created tests for Chips
* created documentation for Chips
* removed MultiSelectGroup
* used Chips instead of MultiSelectGroup in the code

* Teachers find course button goes to catalog (#54918)

* Teachers find course button goes to catalog

* update test

* staging content changes (-)

* HoC 2023 - Fix missing string on Educators How-to guide (#54932)

* Add skinny banner to code.org/student/middle-high for AFE scholarships (#54907)

* refactor middle-high.haml and remove stylesheet

* add afe_scholarship_skinny_banner.haml view

* update grade labels and add empty alt text to images

* Dance AI: handle RTL in header, footer, and effect/code toggle (#54922)

* * add focus state for toggle code/effect buttons

* * dance ai - explanation area RTL support fixes

* * dance party - song selector RTL support fix

* * updated explanation button rtl languages positioning
* added comment (review fix)

* Center toggle in LTR/RTL, force LTR header even in RTL languages

* RTL header

* Handle RTL in footer buttons

* Fix text/icon spacing in RTL

* Undo spacing change

* Use div instead of span

---------

Co-authored-by: denyslevada <levada.denys@gmail.com>

* standardize counting of events so all are right (#54927)

* Update Neural Networks lesson text on code.org/ai/how-ai-works and hourofcode.com/ai (#54915)

* Update code.org/hourofcode see all Hour of code tutorials section (#54931)

* add see all activities section

* update images and add responsive styles

---------

Co-authored-by: breville <brendan@code.org>
Co-authored-by: Jessica Kulwik <jessica@code.org>
Co-authored-by: Dave Bailey <davidsbailey@users.noreply.github.com>
Co-authored-by: Molly Moen <molly@code.org>
Co-authored-by: Mark Barnes <mark.barnes@code.org>
Co-authored-by: Sanchit Malhotra <85528507+sanchitmalhotra126@users.noreply.github.com>
Co-authored-by: fisher-alice <107423305+fisher-alice@users.noreply.github.com>
Co-authored-by: Brendan Reville <breville@users.noreply.github.com>
Co-authored-by: Dani LaMarca <dani@code.org>
Co-authored-by: levadadenys <levada.denys@gmail.com>
Co-authored-by: Artem Vavilov <11708250+artem-vavilov@users.noreply.github.com>
Co-authored-by: Kelby Hawn <9256643+kelbyhawn@users.noreply.github.com>
Co-authored-by: bencodeorg <ben@code.org>
Co-authored-by: Turner Riley <56283563+TurnerRiley@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants