rust-lang / rust-lang/mdBook

mdbook build never ends

Open
#2,900 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

C-bug
Dominant language
Rust
Stars
22.2k
Forks
1.9k
PR merge metrics
PR metrics pending

Description

Problem

I'm evaluating MdBook vs TypeDoc to build the documentation for a large data model. Unfortunately build that takes a few minutes for TypeDoc never ends when using MdBook.
In a smaller setup covering only a small data model fragment, MdBook builds everything correctly, however to cover the entire data model I'm creating around 25K markdown files nested in different directories and subdirectories. (A good stress test for any framework.)
There is no single error message, but the build runs forever showing slow increment in the number of files created in book/ directory.
Here is a comparison of total markdown files number to files created in book/ after a few minutes(!) run:

$ find mdbook/src -type f | wc -l 
25091
$ find mdbook/book -type f | wc -l
3457

This is taken from my MacBook. And the 2nd number is slowly incrementing.
Originally I was suspecting container workspace mount performance issues, but this seems to be not the case as:

  1. TypeDoc is able to finish the build without any problems
  2. GH Actions pipeline runs for ~40 min on a standard Ubuntu runner without finishing the build until cancelled.
Steps

No response

Possible Solution(s)

No response

Notes

When checking the log, it looks like MdBook keeps building files while spending some time rendering.
This looks similar to #2348 but as it supposed to be fix, could be a different thing.

2025-10-22 13:50:39 [DEBUG] (mdbook::utils::fs): Creating /workspaces/avd/mdbook/book/core_interfaces/p2p_links/port_channel_structured_config/switchport/port_security/mac_address_maximum/limit.html
2025-10-22 13:50:39 [DEBUG] (mdbook::renderer::html_handlebars::hbs_renderer): Render template
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("language")], "language")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("default_theme")], "default_theme")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("text_direction")], "text_direction")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("title")], "title")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("is_print"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("base_url"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("description")], "description")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("favicon_svg"), value: Context(String("favicon.svg"), ["favicon_svg"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("favicon.svg")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("favicon_png"), value: Context(String("favicon.png"), ["favicon_png"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("favicon.png")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("css/variables.css")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("css/general.css")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("css/chrome.css")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("print_enable"), value: Context(Bool(true), ["print_enable"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("css/print.css")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("FontAwesome/css/font-awesome.css")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("copy_fonts"), value: Context(Bool(true), ["copy_fonts"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("fonts/fonts.css")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("highlight.css")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("tomorrow-night.css")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("ayu-highlight.css")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "each", params: [PathAndJson { relative_path: Some("additional_css"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("mathjax_support"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("path_to_root")], "path_to_root")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("default_theme")], "default_theme")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("preferred_dark_theme")], "preferred_dark_theme")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("search_js"), value: Context(Bool(true), ["search_js"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("searchindex.js")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("toc.js")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("search_enabled"), value: Context(Bool(true), ["search_enabled"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("default_theme")], "default_theme")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("path_to_root")], "path_to_root")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("search_enabled"), value: Context(Bool(true), ["search_enabled"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("book_title")], "book_title")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("print_enable"), value: Context(Bool(true), ["print_enable"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("path_to_root")], "path_to_root")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("git_repository_url"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("git_repository_edit_url"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("search_enabled"), value: Context(Bool(true), ["search_enabled"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("content")], "content")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "previous", params: [], hash: {}
2025-10-22 13:50:39 [DEBUG] (mdbook::renderer::html_handlebars::helpers::navigation): Get data from context
2025-10-22 13:50:39 [DEBUG] (mdbook::renderer::html_handlebars::helpers::navigation): Search for chapter
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("path_to_root")], "path_to_root")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("link")], "link")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "next", params: [], hash: {}
2025-10-22 13:50:39 [DEBUG] (mdbook::renderer::html_handlebars::helpers::navigation): Get data from context
2025-10-22 13:50:39 [DEBUG] (mdbook::renderer::html_handlebars::helpers::navigation): Search for chapter
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("path_to_root")], "path_to_root")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("link")], "link")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "previous", params: [], hash: {}
2025-10-22 13:50:39 [DEBUG] (mdbook::renderer::html_handlebars::helpers::navigation): Get data from context
2025-10-22 13:50:39 [DEBUG] (mdbook::renderer::html_handlebars::helpers::navigation): Search for chapter
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("path_to_root")], "path_to_root")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("link")], "link")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "next", params: [], hash: {}
2025-10-22 13:50:39 [DEBUG] (mdbook::renderer::html_handlebars::helpers::navigation): Get data from context
2025-10-22 13:50:39 [DEBUG] (mdbook::renderer::html_handlebars::helpers::navigation): Search for chapter
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("path_to_root")], "path_to_root")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("link")], "link")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("live_reload_endpoint"), value: Context(String("__livereload"), ["live_reload_endpoint"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering value: Path(Relative(([Named("live_reload_endpoint")], "live_reload_endpoint")))
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("google_analytics"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("playground_line_numbers"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("playground_copyable"), value: Context(Bool(true), ["playground_copyable"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("playground_js"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("search_js"), value: Context(Bool(true), ["search_js"]) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("elasticlunr.min.js")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("mark.min.js")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("searcher.js")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("clipboard.min.js")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("highlight.js")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "resource", params: [PathAndJson { relative_path: None, value: Constant(String("book.js")) }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "each", params: [PathAndJson { relative_path: Some("additional_js"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("is_print"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (handlebars::render): Rendering helper: "if", params: [PathAndJson { relative_path: Some("fragment_map"), value: Missing }], hash: {}
2025-10-22 13:50:39 [DEBUG] (mdbook::renderer::html_handlebars::hbs_renderer): Creating core_interfaces/p2p_links/port_channel_structured_config/switchport/port_security/violation.html
2025-10-22 13:50:39 [DEBUG] (mdbook::utils::fs): Creating /workspaces/avd/mdbook/book/core_interfaces/p2p_links/port_channel_structured_config/switchport/port_security/violation.html
2025-10-22 13:50:39 [DEBUG] (mdbook::renderer::html_handlebars::hbs_renderer): Render template
Version
mdbook v0.4.52
tested on ARM (DevContainer on MacBook) and x86 (Github Actions)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the issue with the 25,091 files under mdbook/src and running mdbook build, while observing output in mdbook/book. Then inspect the mdbook::renderer::html_handlebars rendering path and its Handlebars logs; done means the large documentation build completes rather than continuing indefinitely.

Written by the indexing model from the issue text.

Assessment

Tech stack
handlebars, rust
Domain
build-system, documentation, performance
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.