Skip to content

load crate menu contents on demand #1772

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

Open
jsha opened this issue Jul 16, 2022 · 1 comment
Open

load crate menu contents on demand #1772

jsha opened this issue Jul 16, 2022 · 1 comment
Labels
A-frontend Area: Web frontend C-enhancement Category: This is a new feature E-medium Effort: This requires a fair amount of work

Comments

@jsha
Copy link
Contributor

jsha commented Jul 16, 2022

Most page navigations don't result in opening the crate menu. We could load that menu using JS, either immediately after page load or on click / hover.

That would simplify #1560 because a page's HTML wouldn't depend on the list of crate versions and yanked versions.

It would also, I believe, result in an improvement in performance, reducing database load and wall clock time to load rustdoc pages.

Right now, every page load invokes this JOIN query across releases, crates, doc_coverage, and repositories:

let query = "
SELECT
crates.id AS crate_id,
releases.id AS release_id,
crates.name,
releases.version,
releases.description,
releases.dependencies,
releases.readme,
releases.description_long,
releases.release_time,
releases.build_status,
releases.rustdoc_status,
releases.archive_storage,
releases.repository_url,
releases.homepage_url,
releases.keywords,
releases.have_examples,
releases.target_name,
repositories.host as repo_host,
repositories.stars as repo_stars,
repositories.forks as repo_forks,
repositories.issues as repo_issues,
repositories.name as repo_name,
releases.is_library,
releases.yanked,
releases.doc_targets,
releases.license,
releases.documentation_url,
releases.default_target,
releases.doc_rustc_version,
doc_coverage.total_items,
doc_coverage.documented_items,
doc_coverage.total_items_needing_examples,
doc_coverage.items_with_examples
FROM releases
INNER JOIN crates ON releases.crate_id = crates.id
LEFT JOIN doc_coverage ON doc_coverage.release_id = releases.id
LEFT JOIN repositories ON releases.repository_id = repositories.id
WHERE crates.name = $1 AND releases.version = $2;";
. If the initial page load doesn't need doc_coverage and repository info, we can reduce this to a JOIN across releases and crates.

Each page load also does a query across owners and owner_rels, which doesn't need to be done at page load time:

let owners = conn.query(
"SELECT login, avatar
FROM owners
INNER JOIN owner_rels ON owner_rels.oid = owners.id
WHERE cid = $1",
&[&crate_id],
)?;

This query in releases_for_crate, across the releases table (with no LIMIT) could also be avoided at page load time:

let mut releases: Vec<Release> = conn
.query(
"SELECT
id,
version,
build_status,
yanked,
is_library,
rustdoc_status
FROM releases
WHERE
releases.crate_id = $1",
&[&crate_id],
)?

So I think the net result would be replacing three queries (two of them using JOINs) with a single, simple query with a single result.

@syphar
Copy link
Member

syphar commented Jul 16, 2022

While this is definitely a valid optimization, we probably won't need it when the pages are fully cached. Even a full invalidation including old version for every release on each crate doesn't hurt much.

@syphar syphar added E-medium Effort: This requires a fair amount of work A-frontend Area: Web frontend C-enhancement Category: This is a new feature labels Aug 2, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-frontend Area: Web frontend C-enhancement Category: This is a new feature E-medium Effort: This requires a fair amount of work
Projects
None yet
Development

No branches or pull requests

2 participants