oxidecomputer / oxidecomputer/humility

probe attach doesn't compile in `async` contexts

Open
#723 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Rust
Stars
584
Forks
63
Avg merge
3h
Merged PRs (30d)
2

Description

While working on using humility as a library I ran into this:

error[E0277]: `OnceCell<Result<Option<Box<DwoUnit<EndianReader<LittleEndian, Arc<[u8]>>>>>, Error>>` cannot be shared between threads safely
    --> verifier/src/hiffy.rs:108:5
     |
 108 |     async fn get_measurement_log(&self) -> Result<Log, AttestError> {
     |     ^^^^^ `OnceCell<Result<Option<Box<DwoUnit<EndianReader<LittleEndian, Arc<[u8]>>>>>, Error>>` cannot be shared between threads safely
     |
     = help: within `[addr2line::unit::ResUnit<gimli::read::endian_reader::EndianReader<gimli::endianity::LittleEndian, Arc<[u8]>>>]`, the trait `Sync` is not implemented for `OnceCell<Result<Option<Box<DwoUnit<EndianReader<LittleEndian, Arc<[u8]>>>>>, Error>>`
     = note: if you want to do aliasing and mutation between multiple threads, use `std::sync::OnceLock` instead

...

note: required because it appears within the type `HubrisArchive`
    --> /home/labbott/.cargo/git/checkouts/humility-a1f94f6d75a1535e/80dae8d/humility-core/src/hubris.rs:1133:12
     |
1133 | pub struct HubrisArchive {
     |            ^^^^^^^^^^^^^
note: required because it appears within the type `AttestHiffy`
    --> verifier/src/hiffy.rs:66:12
     |
  66 | pub struct AttestHiffy {
     |            ^^^^^^^^^^^
     = note: required for `&AttestHiffy` to implement `Send`
note: required because it's used within this `async` block
    --> verifier/src/hiffy.rs:108:5
     |
 108 |     async fn get_measurement_log(&self) -> Result<Log, AttestError> {
     |     ^^^^^
     = note: required for the cast from `Pin<Box<{async block@verifier/src/hiffy.rs:108:5: 108:10}>>` to `Pin<Box<dyn Future<Output = Result<MeasurementLog<16>, AttestError>> + Send>>`
     = note: the full name for the type has been written to '/home/labbott/dice-util/target/debug/deps/dice_verifier-b365f235203b0dbe.long-type-6895664460909633821.txt'
     = note: consider using `--verbose` to print the full type name to the console

$ cat /home/labbott/dice-util/target/debug/deps/dice_verifier-b365f235203b0dbe.long-type-3655248516427123308.txt
std::ptr::Unique<[addr2line::unit::ResUnit<gimli::read::endian_reader::EndianReader<gimli::endianity::LittleEndian, Arc<[u8]>>>]>
hashbrown::raw::RawTable<(HubrisTask, addr2line::Context<gimli::read::endian_reader::EndianReader<gimli::endianity::LittleEndian, Arc<[u8]>>>)>
hashbrown::map::HashMap<HubrisTask, addr2line::Context<gimli::read::endian_reader::EndianReader<gimli::endianity::LittleEndian, Arc<[u8]>>>, RandomState>
HashMap<HubrisTask, addr2line::Context<gimli::read::endian_reader::EndianReader<gimli::endianity::LittleEndian, Arc<[u8]>>>>

This looks like the addr2line and gimli crates don't play nice with async at the moment and humility needs a little bit of refactoring.

Contributor guide

No contributing guide indexed for this repository

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 at verifier/src/hiffy.rs:108 and inspect HubrisArchive in humility-core/src/hubris.rs:1133, where the compiler reports the OnceCell Send/Sync problem. Reproduce the async compilation failure and trace the addr2line and gimli types involved. Done means probe attach compiles in async contexts without this error.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
devtools
Issue type
Refactor
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.