rust-lang / rust-lang/rust

Massive memory usage when type annotations needed

Open
#125,651 19 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

C-bug E-needs-mcve I-compilemem T-compiler T-types
Dominant language
Rust
Stars
119k
Forks
16.2k
PR merge metrics
PR metrics pending

Description

This is a bit of a complicated issue to report, because it happened seemingly at random after introducing a change in my code. This change lead to a compile error, and afterward a single rustc thread caused my computer to freeze with 15gb of ram usage, and 100% of a single cpu core.

An archive of my project is included. This happens when running any of cargo check, clippy, build in the project folder.

Sorry, this is not a minimally-reproducible example, because it happened on a complex project, and I am not sure what part of my code causes this behavior to show.

The behavior described below does not appear if the following lines in src/routes/game.rs are commented. In that case, cargo reports some warnings, then exits normally.

    // (near line 30)
    if let Some(game) = game.first() {
        //let language_ids = game.languages.iter().map(|x| x.id).collect();
        //let other_languages = conn
        //    .run(|c| {
        //        language::table
        //            .filter(language::columns::id.is_distinct_from(language_ids))
        //            .load(c)
        //    })
        //    .await?;
        Ok(Template::render(
            "game_full",
            context! {
                game,
            },
        ))
    } else {
        Err(ApplicationError::NoSuchGame { id })
    }

I expected to see this happen: rustc to show the error and eventually exit

Instead, this happened: cargo shows the following error:

error[E0283]: type annotations needed
    --> src/routes/game.rs:31:13
     |
31   |         let language_ids = game.languages.iter().map(|x| x.id).collect();
     |             ^^^^^^^^^^^^                                       ------- type must be known at this point
     |
     = note: cannot satisfy `_: FromIterator<i32>`
note: required by a bound in `std::iter::Iterator::collect`
    --> /home/khais/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs:1999:19
     |
1999 |     fn collect<B: FromIterator<Self::Item>>(self) -> B
     |                   ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `Iterator::collect`
help: consider giving `language_ids` an explicit type
     |
31   |         let language_ids: Vec<_> = game.languages.iter().map(|x| x.id).collect();
     |                         ++++++++

^C  Building [=======================> ] 380/381: ttrpgs(bin)

and then consumes more and more ram until I am forced to kill the process

ps capture of the offending process:

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
khais    2303047 99.6 57.1 31193988 18702996 pts/1 SNl+ 12:32   5:51 /home/khais/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/rustc --crate-name ttrpgs --edition=2021 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --diagnostic-width=175 --crate-type bin --emit=dep-info,metadata -C embed-bitcode=no -C debuginfo=2 -C metadata=43694494ee23ddb7 -C extra-filename=-43694494ee23ddb7 --out-dir /home/khais/src/ttrpgs_bug_report/target/debug/deps -C incremental=/home/khais/src/ttrpgs_bug_report/target/debug/incremental -L dependency=/home/khais/src/ttrpgs_bug_report/target/debug/deps --extern chrono=/home/khais/src/ttrpgs_bug_report/target/debug/deps/libchrono-df20a4981cc1ae50.rmeta --extern csv=/home/khais/src/ttrpgs_bug_report/target/debug/deps/libcsv-914302b8947f3c7d.rmeta --extern diesel=/home/khais/src/ttrpgs_bug_report/target/debug/deps/libdiesel-e10c470af87fb562.rmeta --extern dotenvy=/home/khais/src/ttrpgs_bug_report/target/debug/deps/libdotenvy-9821549988c77cf3.rmeta --extern regex=/home/khais/src/ttrpgs_bug_report/target/debug/deps/libregex-e744e5e84862ee01.rmeta --extern rocket=/home/khais/src/ttrpgs_bug_report/target/debug/deps/librocket-f85756e2b94ef3e4.rmeta --extern rocket_db_pools=/home/khais/src/ttrpgs_bug_report/target/debug/deps/librocket_db_pools-0b6644166093e0a7.rmeta --extern rocket_dyn_templates=/home/khais/src/ttrpgs_bug_report/target/debug/deps/librocket_dyn_templates-d688c2b13a9ab27e.rmeta --extern rocket_sync_db_pools=/home/khais/src/ttrpgs_bug_report/target/debug/deps/librocket_sync_db_pools-0fae6578655fff9d.rmeta --extern sea_orm=/home/khais/src/ttrpgs_bug_report/target/debug/deps/libsea_orm-c9115e6c44d3c8a0.rmeta --extern serde=/home/khais/src/ttrpgs_bug_report/target/debug/deps/libserde-2640d9b683a951ea.rmeta --extern smol=/home/khais/src/ttrpgs_bug_report/target/debug/deps/libsmol-abd1ae4bbcdc3952.rmeta --extern thiserror=/home/khais/src/ttrpgs_bug_report/target/debug/deps/libthiserror-3084c89a5d4ce759.rmeta --extern tokio=/home/khais/src/ttrpgs_bug_report/target/debug/deps/libtokio-5825f409e9792f63.rmeta --extern ttrpgs=/home/khais/src/ttrpgs_bug_report/target/debug/deps/libttrpgs-60d690e0592caaf5.rmeta -C linker=clang -C link-arg=-fuse-ld=lld -L native=/usr/lib
Meta

rustc --version --verbose:

rustc 1.78.0 (9b00956e5 2024-04-29)
binary: rustc
commit-hash: 9b00956e56009bab2aa15d7bff10916599e3d6d6
commit-date: 2024-04-29
host: x86_64-unknown-linux-gnu
release: 1.78.0
LLVM version: 18.1.2

This also happens in nightly (not sure how to check the version).
rustup +nightly show

Default host: x86_64-unknown-linux-gnu
rustup home:  /home/khais/.rustup

installed toolchains
--------------------

stable-x86_64-unknown-linux-gnu (default)
nightly-x86_64-unknown-linux-gnu

active toolchain
----------------

nightly-x86_64-unknown-linux-gnu (overridden by +toolchain on the command line)
rustc 1.80.0-nightly (84b40fc90 2024-05-27)

System information:

Linux 6.8.5-zen1-1-zen #1 ZEN SMP PREEMPT_DYNAMIC Thu, 11 Apr 2024 01:47:18 +0000 x86_64 unknown unknown GNU/Linux
CPU: 13th Gen Intel i5-13400F (16) @ 4.600GHz

ttrpgs_bug_report.tar.gz

Backtrace

This is not applicable here, since compilation does not finish.

I am happy to provide more details if requested. I am not very experienced in compiler internals, and this is the first time I'm submitting a bug report here.

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 unpacking the linked ttrpgs_bug_report.tar.gz and running cargo check, clippy, or build with the code in src/routes/game.rs enabled. Investigate the rustc behavior around the E0283 type-annotation error from collect. Done would mean reproducing the report and making compilation terminate with the diagnostic instead of exhausting memory.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
compilers
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
20/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.