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

"Permission denied" while creating sandbox with immutable inputs #13899

Closed
Eric-Arellano opened this issue Dec 16, 2021 · 15 comments · Fixed by #14016 or #15652
Closed

"Permission denied" while creating sandbox with immutable inputs #13899

Eric-Arellano opened this issue Dec 16, 2021 · 15 comments · Fixed by #14016 or #15652
Assignees
Labels

Comments

@Eric-Arellano
Copy link
Contributor

Seen in CI in the lint job:

Engine traceback:
323
  in select
324
  in pants.core.goals.check.check
325
  in pants.backend.scala.goals.check.scalac_check
326
  in pants.engine.internals.graph.coarsened_targets
327
  in pants.engine.internals.graph.transitive_dependency_mapping
328
  in pants.engine.internals.graph.resolve_unexpanded_targets (testprojects/src/jvm/org/pantsbuild/example/app/ExampleApp.scala)
329
  in pants.engine.internals.graph.resolve_dependencies (testprojects/src/jvm/org/pantsbuild/example/app/ExampleApp.scala)
330
  in pants.backend.scala.dependency_inference.rules.infer_scala_dependencies_via_source_analysis (testprojects/src/jvm/org/pantsbuild/example/app/ExampleApp.scala)
331
  in pants.jvm.dependency_inference.symbol_mapper.merge_first_party_module_mappings
332
  in pants.backend.scala.dependency_inference.symbol_mapper.map_first_party_scala_targets_to_symbols
333
  in pants.backend.scala.dependency_inference.scala_parser.resolve_fallible_result_to_analysis
334
  in pants.backend.scala.dependency_inference.scala_parser.analyze_scala_source_dependencies
335
  in pants.jvm.jdk_rules.setup_jdk
336
  in process
337
Traceback (no traceback):
338
  <pants native internals>
339
Exception: Error opening file /tmp/.tmpKR6VWC/b1e85defcb8b440ef412d75b327d3c03dfa1731616bbf7ca5e39ffd45cea246c/coursier_wrapper_script.sh for writing: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
@stuhood
Copy link
Member

stuhood commented Dec 16, 2021

This is most likely related to #13848: it's possible that we have overlapping immutable input digests somewhere.

@Eric-Arellano
Copy link
Contributor Author

Happened again in the lint shard for a different PR. Same error.

@jsirois
Copy link
Contributor

jsirois commented Dec 23, 2021

And again:

18:22:34.52 [INFO] [rules] Successfully loaded Toolchain token from env var 'TOOLCHAIN_AUTH_TOKEN', expiration: 2022-03-16T17:22:32+00:00.
18:22:35.58 [INFO] View on BuildSense: https://app.toolchain.com/organizations/pantsbuild/repos/pants/builds/pants_run_2021_12_23_18_22_34_488_a33fd79edf52414f8e24262e06138c61/
18:22:36.70 [INFO] Completed: Lint with shfmt - shfmt succeeded.
18:22:39.59 [INFO] Starting: Building flake8.pex from 3rdparty/python/lockfiles/flake8.txt
18:22:39.76 [INFO] Completed: Lint with Hadolint - hadolint succeeded.
18:22:48.22 [INFO] Completed: Building flake8.pex from 3rdparty/python/lockfiles/flake8.txt
18:22:48.68 [INFO] Completed: Lint with Shellcheck - Shellcheck succeeded.
18:22:56.34 [INFO] Completed: Lint with docformatter - Docformatter succeeded.
18:23:15.34 [INFO] Completed: Lint with autoflake - autoflake succeeded.
18:23:16.41 [INFO] Completed: Lint with Black - Black succeeded.
All done! ✨ 🍰 ✨
822 files would be left unchanged.


18:23:19.55 [INFO] Completed: Lint with isort - isort succeeded.
18:23:37.26 [INFO] Completed: Lint with Flake8 - Flake8 succeeded.

✓ Black succeeded.
✓ Docformatter succeeded.
✓ Flake8 succeeded.
✓ Shellcheck succeeded.
✓ autoflake succeeded.
✓ hadolint succeeded.
✓ isort succeeded.
✓ shfmt succeeded.
18:23:52.41 [ERROR] 1 Exception encountered:

Engine traceback:
  in select
  in pants.core.goals.check.check
  in pants.backend.scala.goals.check.scalac_check
  in pants.engine.internals.graph.coarsened_targets
  in pants.engine.internals.graph.transitive_dependency_mapping
  in pants.engine.internals.graph.resolve_unexpanded_targets (testprojects/src/jvm/org/pantsbuild/example/app/ExampleApp.scala)
  in pants.engine.internals.graph.resolve_dependencies (testprojects/src/jvm/org/pantsbuild/example/app/ExampleApp.scala)
  in pants.backend.scala.dependency_inference.rules.infer_scala_dependencies_via_source_analysis (testprojects/src/jvm/org/pantsbuild/example/app/ExampleApp.scala)
  in pants.jvm.dependency_inference.symbol_mapper.merge_first_party_module_mappings
  in pants.backend.scala.dependency_inference.symbol_mapper.map_first_party_scala_targets_to_symbols
  in pants.backend.scala.dependency_inference.scala_parser.resolve_fallible_result_to_analysis
  in pants.backend.scala.dependency_inference.scala_parser.analyze_scala_source_dependencies
  in pants.jvm.jdk_rules.setup_jdk
  in process
Traceback (no traceback):
  <pants native internals>
Exception: Error opening file /tmp/.tmp7MiIF0/b1e85defcb8b440ef412d75b327d3c03dfa1731616bbf7ca5e39ffd45cea246c/coursier_post_processing_script.py for writing: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }

@Eric-Arellano
Copy link
Contributor Author

I continue seeing this frequently in the lint job. Probably 30% of runs if I had to guess. Always the same stacktrace.

@jsirois jsirois self-assigned this Dec 28, 2021
jsirois added a commit to jsirois/pants that referenced this issue Dec 28, 2021
Previously we used the double-checked-cell-async crate (See:
https://github.com/chrislearn/double-checked-cell-async/blob/46cd3b04eddddbe279282143fe8a936d5854588c/src/lib.rs#L228-L260),
which performed the second check of the double check lock with relaxed
ordering. The relevant code is snipped below and annotated:

```rust
pub struct DoubleCheckedCell<T> {
    value: UnsafeCell<Option<T>>,
    initialized: AtomicBool,
    lock: Mutex<()>,
}

impl<T> DoubleCheckedCell<T> {
    pub fn new() -> DoubleCheckedCell<T> {
        DoubleCheckedCell {
            value: UnsafeCell::new(None),
            initialized: AtomicBool::new(false),
            lock: Mutex::new(()),
        }
    }

    pub async fn get_or_try_init<Fut, E>(&self, init: Fut) -> Result<&T, E>
    where
        Fut: Future<Output = Result<T, E>>
    {
        // 1.) 1st load & check.
        if !self.initialized.load(Ordering::Acquire) {
            // 2.) Lock.
            let _lock = self.lock.lock().await;
            // 3.) 2nd load & check.
            if !self.initialized.load(Ordering::Relaxed) {
                {
                    // 4.) Critical section.
                    let result = init.await?;
                    let value = unsafe { &mut *self.value.get() };
                    value.replace(result);
                }
                // 5.) Store with lock held.
                self.initialized.store(true, Ordering::Release);
            }
        }
        let value = unsafe { &*self.value.get() };
        Ok(unsafe { value.as_ref().unchecked_unwrap() })
    }
}
```

Per the C++11 memory model used by Rust (See:
https://en.cppreference.com/w/cpp/language/memory_model), this would
seem to indicate the second load could be reordered to occur anywhere
after the 1st load with acquire ordering and anywhere before the store
with released ordering. If that second load was reordered to occur
before the lock was acquired, two threads could enter the critical
section in serial and the second thread would try to materialize to
paths that already were created and marked read-only. Switch to the
async-oncecell crate which performs both loads of the double-checked
lock with acquire ordering, ensuring they are not re-ordered with
respect to the interleaved non-atomics code.

Also fixup the materialization process to be atomic. We now cleanup
materialization chroots when materialization fails and only move their
contents to the destination path if the full materialization has
succeeded.

Fixes pantsbuild#13899

[ci skip-build-wheels]
@jsirois
Copy link
Contributor

jsirois commented Dec 29, 2021

I'm going to unassign and release this back to the pool since I won't be hacking again until Jan 7th.

@jsirois jsirois removed their assignment Dec 29, 2021
@asherf
Copy link
Member

asherf commented Dec 30, 2021

jsirois added a commit to jsirois/pants that referenced this issue Jan 7, 2022
Previously we used the double-checked-cell-async crate (See:
https://github.com/chrislearn/double-checked-cell-async/blob/46cd3b04eddddbe279282143fe8a936d5854588c/src/lib.rs#L228-L260),
which performed the second check of the double check lock with relaxed
ordering. The relevant code is snipped below and annotated:

```rust
pub struct DoubleCheckedCell<T> {
    value: UnsafeCell<Option<T>>,
    initialized: AtomicBool,
    lock: Mutex<()>,
}

impl<T> DoubleCheckedCell<T> {
    pub fn new() -> DoubleCheckedCell<T> {
        DoubleCheckedCell {
            value: UnsafeCell::new(None),
            initialized: AtomicBool::new(false),
            lock: Mutex::new(()),
        }
    }

    pub async fn get_or_try_init<Fut, E>(&self, init: Fut) -> Result<&T, E>
    where
        Fut: Future<Output = Result<T, E>>
    {
        // 1.) 1st load & check.
        if !self.initialized.load(Ordering::Acquire) {
            // 2.) Lock.
            let _lock = self.lock.lock().await;
            // 3.) 2nd load & check.
            if !self.initialized.load(Ordering::Relaxed) {
                {
                    // 4.) Critical section.
                    let result = init.await?;
                    let value = unsafe { &mut *self.value.get() };
                    value.replace(result);
                }
                // 5.) Store with lock held.
                self.initialized.store(true, Ordering::Release);
            }
        }
        let value = unsafe { &*self.value.get() };
        Ok(unsafe { value.as_ref().unchecked_unwrap() })
    }
}
```

Per the C++11 memory model used by Rust (See:
https://en.cppreference.com/w/cpp/language/memory_model), this would
seem to indicate the second load could be reordered to occur anywhere
after the 1st load with acquire ordering and anywhere before the store
with released ordering. If that second load was reordered to occur
before the lock was acquired, two threads could enter the critical
section in serial and the second thread would try to materialize to
paths that already were created and marked read-only. Switch to the
async-oncecell crate which performs both loads of the double-checked
lock with acquire ordering, ensuring they are not re-ordered with
respect to the interleaved non-atomics code.

Also fixup the materialization process to be atomic. We now cleanup
materialization chroots when materialization fails and only move their
contents to the destination path if the full materialization has
succeeded.

Fixes pantsbuild#13899

[ci skip-build-wheels]
jsirois added a commit to jsirois/pants that referenced this issue Jan 7, 2022
Previously we used the double-checked-cell-async crate (See:
https://github.com/chrislearn/double-checked-cell-async/blob/46cd3b04eddddbe279282143fe8a936d5854588c/src/lib.rs#L228-L260),
which performed the second check of the double check lock with relaxed
ordering. The relevant code is snipped below and annotated:

```rust
pub struct DoubleCheckedCell<T> {
    value: UnsafeCell<Option<T>>,
    initialized: AtomicBool,
    lock: Mutex<()>,
}

impl<T> DoubleCheckedCell<T> {
    pub fn new() -> DoubleCheckedCell<T> {
        DoubleCheckedCell {
            value: UnsafeCell::new(None),
            initialized: AtomicBool::new(false),
            lock: Mutex::new(()),
        }
    }

    pub async fn get_or_try_init<Fut, E>(&self, init: Fut) -> Result<&T, E>
    where
        Fut: Future<Output = Result<T, E>>
    {
        // 1.) 1st load & check.
        if !self.initialized.load(Ordering::Acquire) {
            // 2.) Lock.
            let _lock = self.lock.lock().await;
            // 3.) 2nd load & check.
            if !self.initialized.load(Ordering::Relaxed) {
                {
                    // 4.) Critical section.
                    let result = init.await?;
                    let value = unsafe { &mut *self.value.get() };
                    value.replace(result);
                }
                // 5.) Store with lock held.
                self.initialized.store(true, Ordering::Release);
            }
        }
        let value = unsafe { &*self.value.get() };
        Ok(unsafe { value.as_ref().unchecked_unwrap() })
    }
}
```

Per the C++11 memory model used by Rust (See:
https://en.cppreference.com/w/cpp/language/memory_model), this would
seem to indicate the second load could be reordered to occur anywhere
after the 1st load with acquire ordering and anywhere before the store
with released ordering. If that second load was reordered to occur
before the lock was acquired, two threads could enter the critical
section in serial and the second thread would try to materialize to
paths that already were created and marked read-only. Switch to the
async-oncecell crate which performs both loads of the double-checked
lock with acquire ordering, ensuring they are not re-ordered with
respect to the interleaved non-atomics code.

Also fixup the materialization process to be atomic. We now cleanup
materialization chroots when materialization fails and only move their
contents to the destination path if the full materialization has
succeeded.

Fixes pantsbuild#13899

[ci skip-build-wheels]
@jsirois jsirois self-assigned this Jan 8, 2022
@jsirois
Copy link
Contributor

jsirois commented Jan 8, 2022

@asherf there actually was interesting, but unfortunately unenlightening, data from your failure / @stuhood's debug addition. The perms on the pre-existing dir were 0o40755 (16877); so it was writable. That means it either could be a remnant that was partially materialized or a DCL bug where racing materializations were observable before completion:

Exception: Destination for immutable digest already exists: Metadata { file_type: FileType(FileType { mode: 16877 }), is_dir: true, is_file: false, permissions: Permissions(FilePermissions { mode: 16877 }), modified: Ok(SystemTime { tv_sec: 1640823460, tv_nsec: 251230820 }), accessed: Ok(SystemTime { tv_sec: 1640823460, tv_nsec: 251230820 }), created: Ok(SystemTime { tv_sec: 1640823460, tv_nsec: 251230820 }), .. }

jsirois added a commit that referenced this issue Jan 8, 2022
Previously we used the double-checked-cell-async crate (See:
https://github.com/chrislearn/double-checked-cell-async/blob/46cd3b04eddddbe279282143fe8a936d5854588c/src/lib.rs#L228-L260),
which performed the second check of the double check lock with relaxed
ordering. The relevant code is snipped below and annotated:

```rust
pub struct DoubleCheckedCell<T> {
    value: UnsafeCell<Option<T>>,
    initialized: AtomicBool,
    lock: Mutex<()>,
}

impl<T> DoubleCheckedCell<T> {
    pub fn new() -> DoubleCheckedCell<T> {
        DoubleCheckedCell {
            value: UnsafeCell::new(None),
            initialized: AtomicBool::new(false),
            lock: Mutex::new(()),
        }
    }

    pub async fn get_or_try_init<Fut, E>(&self, init: Fut) -> Result<&T, E>
    where
        Fut: Future<Output = Result<T, E>>
    {
        // 1.) 1st load & check.
        if !self.initialized.load(Ordering::Acquire) {
            // 2.) Lock.
            let _lock = self.lock.lock().await;
            // 3.) 2nd load & check.
            if !self.initialized.load(Ordering::Relaxed) {
                {
                    // 4.) Critical section.
                    let result = init.await?;
                    let value = unsafe { &mut *self.value.get() };
                    value.replace(result);
                }
                // 5.) Store with lock held.
                self.initialized.store(true, Ordering::Release);
            }
        }
        let value = unsafe { &*self.value.get() };
        Ok(unsafe { value.as_ref().unchecked_unwrap() })
    }
}
```

Per the C++11 memory model used by Rust (See:
https://en.cppreference.com/w/cpp/language/memory_model), this would
seem to indicate the second load could be reordered to occur anywhere
after the 1st load with acquire ordering and anywhere before the store
with released ordering. If that second load was reordered to occur
before the lock was acquired, two threads could enter the critical
section in serial and the second thread would try to materialize to
paths that already were created and marked read-only. Switch to the
async-oncecell crate which performs both loads of the double-checked
lock with acquire ordering, ensuring they are not re-ordered with
respect to the interleaved non-atomics code.

Also fixup the materialization process to be atomic. We now cleanup
materialization chroots when materialization fails and only move their
contents to the destination path if the full materialization has
succeeded.

Fixes #13899
@Eric-Arellano
Copy link
Contributor Author

This resurfaced in lint job in main ci: https://github.com/pantsbuild/pants/runs/5025554838?check_suite_focus=true#step:10:270

Exception: Failed to move materialized immutable input for Digest { hash: Fingerprint<e595f66597908daedc4c5c3eed7f240e89b337cd194f9de429155914da910dda>, size_bytes: 425 } from "/tmp/immutable_inputsYnyRMj/.tmpbKabv8" to "/tmp/immutable_inputsYnyRMj/e595f66597908daedc4c5c3eed7f240e89b337cd194f9de429155914da910dda": Directory not empty (os error 39)
285
Parent directory (un-writeable parent dir?) metadata: Ok(Ok(Metadata { file_type: FileType(FileType { mode: 16877 }), is_dir: true, is_file: false, permissions: Permissions(FilePermissions { mode: 16877 }), modified: Ok(SystemTime { tv_sec: 1643737497, tv_nsec: 503120358 }), accessed: Ok(SystemTime { tv_sec: 1643737482, tv_nsec: 986958050 }), created: Ok(SystemTime { tv_sec: 1643737482, tv_nsec: 986958050 }), .. }))
286
Destination directory (collision?) metadata: Ok(Metadata { file_type: FileType(FileType { mode: 16749 }), is_dir: true, is_file: false, permissions: Permissions(FilePermissions { mode: 16749 }), modified: Ok(SystemTime { tv_sec: 1643737496, tv_nsec: 979114062 }), accessed: Ok(SystemTime { tv_sec: 1643737496, tv_nsec: 979114062 }), created: Ok(SystemTime { tv_sec: 1643737496, tv_nsec: 979114062 }), .. })
287
Current immutable check outs (~dup fingerprints / differing sizes?): {Digest { hash: Fingerprint<e595f66597908daedc4c5c3eed7f240e89b337cd194f9de429155914da910dda>, size_bytes: 425 }: OnceCell(None)}

@Eric-Arellano Eric-Arellano reopened this Feb 1, 2022
@jsirois jsirois removed their assignment Feb 15, 2022
@asherf
Copy link
Member

asherf commented Feb 15, 2022

also seeing this w/ the golang backend enabled:

Exception: Failed to move materialized immutable input for Digest { hash: Fingerprint<e5fc47311eda4f076c7c18ce6a37060fd910a04fb738d51a45721454aa1fb824>, size_bytes: 95 } from "/tmp/immutable_inputsBQ4ON3/.tmpnnf9kd" to "/tmp/immutable_inputsBQ4ON3/e5fc47311eda4f076c7c18ce6a37060fd910a04fb738d51a45721454aa1fb824": File exists (os error 17)
Parent directory (un-writeable parent dir?) metadata: Ok(Ok(Metadata { file_type: FileType(FileType { mode: 16877 }), is_dir: true, is_file: false, permissions: Permissions(FilePermissions { mode: 16877 }), modified: Ok(SystemTime { tv_sec: 1644936029, tv_nsec: 472285822 }), accessed: Ok(SystemTime { tv_sec: 1644936018, tv_nsec: 404264582 }), created: Ok(SystemTime { tv_sec: 1644936018, tv_nsec: 404264582 }), .. }))
Destination directory (collision?) metadata: Ok(Metadata { file_type: FileType(FileType { mode: 16749 }), is_dir: true, is_file: false, permissions: Permissions(FilePermissions { mode: 16749 }), modified: Ok(SystemTime { tv_sec: 1644936029, tv_nsec: 144285192 }), accessed: Ok(SystemTime { tv_sec: 1644936029, tv_nsec: 136285177 }), created: Ok(SystemTime { tv_sec: 1644936029, tv_nsec: 136285177 }), .. })
Current immutable check outs (~dup fingerprints / differing sizes?): {Digest { hash: Fingerprint<e5fc47311eda4f076c

@stuhood stuhood changed the title "Permission denied" when opening coursier_wrapper_script.sh "Permission denied" while creating sandbox with immutable inputs Apr 1, 2022
@stuhood stuhood self-assigned this Apr 1, 2022
@tdyas
Copy link
Contributor

tdyas commented Apr 13, 2022

I wrote a unit test that reliably triggers the error. #15140

@tdyas
Copy link
Contributor

tdyas commented Apr 13, 2022

I'm inclined to fix the issue by appending a sequence number to the digest's final path. This would prevent path conflicts if there were a partially materialized digest already in the output directory from an earlier materialization of that digest in the same run potentially failing.

@asherf
Copy link
Member

asherf commented Apr 28, 2022

FWIW -still. happens on pants 2.11 rc5:

Exception: Failed to move materialized immutable input for Digest { hash: Fingerprint<e616f6719bac444c8d5a45de572cce6e983765f2f9f0a26c8002c7439e99d05b>, size_bytes: 95 } from "/tmp/immutable_inputsnKh4Nk/.tmpKwhwIw" to "/tmp/immutable_inputsnKh4Nk/e616f6719bac444c8d5a45de572cce6e983765f2f9f0a26c8002c7439e99d05b": File exists (os error 17)
Parent directory (un-writeable parent dir?) metadata: Ok(Ok(Metadata { file_type: FileType(FileType { mode: 16877 }), is_dir: true, is_file: false, permissions: Permissions(FilePermissions { mode: 16877 }), modified: Ok(SystemTime { tv_sec: 1651156074, tv_nsec: 783539231 }), accessed: Ok(SystemTime { tv_sec: 1651156065, tv_nsec: 519544316 }), created: Ok(SystemTime { tv_sec: 1651156065, tv_nsec: 519544316 }), .. }))
Destination directory (collision?) metadata: Ok(Metadata { file_type: FileType(FileType { mode: 16749 }), is_dir: true, is_file: false, permissions: Permissions(FilePermissions { mode: 16749 }), modified: Ok(SystemTime { tv_sec: 1651156074, tv_nsec: 219539533 }), accessed: Ok(SystemTime { tv_sec: 1651156074, tv_nsec: 219539533 }), created: Ok(SystemTime { tv_sec: 1651156074, tv_nsec: 219539533 }), .. })
Current immutable check outs (~dup fingerprints / differing sizes?): {Digest { hash: Fingerprint<e616f6719bac444c8d5a45de572cce6e98376
``

@jyggen
Copy link
Member

jyggen commented May 24, 2022

Seeing something similar relatively often on CI with remote cache enabled (never saw it in CI before we enabled it). Pants 2.11.0.

09:15:05.84 [ERROR] 1 Exception encountered:
  Exception: Failed to move materialized immutable input for Digest { hash: Fingerprint<44995ef037b41b114bbaf7d07cf965145d5b16c5c2f77304dcfd46c37b27a375>, size_bytes: 243 } from "/tmp/immutable_inputsDivzq5/.tmp4J2h2N" to "/tmp/immutable_inputsDivzq5/44995ef037b41b114bbaf7d07cf965145d5b16c5c2f77304dcfd46c37b27a375": Directory not empty (os error 39)
Parent directory (un-writeable parent dir?) metadata: Ok(Ok(Metadata { file_type: FileType(FileType { mode: 16877 }), is_dir: true, is_file: false, permissions: Permissions(FilePermissions { mode: 16877 }), modified: Ok(SystemTime { tv_sec: 1653297305, tv_nsec: 833571818 }), accessed: Ok(SystemTime { tv_sec: 1653297300, tv_nsec: 533641861 }), created: Ok(SystemTime { tv_sec: 1653297300, tv_nsec: 533641861 }), .. }))
Destination directory (collision?) metadata: Ok(Metadata { file_type: FileType(FileType { mode: 16749 }), is_dir: true, is_file: false, permissions: Permissions(FilePermissions { mode: 16749 }), modified: Ok(SystemTime { tv_sec: 1653297304, tv_nsec: 713586619 }), accessed: Ok(SystemTime { tv_sec: 1653297304, tv_nsec: 713586619 }), created: Ok(SystemTime { tv_sec: 1653297304, tv_nsec: 713586619 }), .. })
Current immutable check outs (~dup fingerprints / differing sizes?): {Digest { hash: Fingerprint<44995ef037b41b114bbaf7d07cf965145d5b16c5c2f77304dcfd46c37b27a375>, size_bytes: 243 }: OnceCell(None)}

@Eric-Arellano
Copy link
Contributor Author

Oh! Thanks @jyggen for that hint about remote caching! Notably Pants and Toolchain both use remote caching. Pantsbuild/pants sees this error quite frequently

@stuhood stuhood self-assigned this May 25, 2022
@stuhood
Copy link
Member

stuhood commented May 25, 2022

Thanks @jyggen ... that gives me a fairly good idea of what this might be then. Cancellation, causing the materialization of directories to be interrupted. i.e.: the various async-value crates we've used must not be cancellation safe.

Will take a look at this one.

stuhood added a commit that referenced this issue May 26, 2022
stuhood added a commit to stuhood/pants that referenced this issue May 26, 2022
stuhood added a commit to stuhood/pants that referenced this issue May 26, 2022
stuhood added a commit that referenced this issue May 27, 2022
… digest. (Cherry-pick of #15652) (#15680)

Fixes #13899.

[ci skip-build-wheels]
stuhood added a commit that referenced this issue May 27, 2022
… digest. (Cherry-pick of #15652) (#15679)

Fixes #13899.

[ci skip-build-wheels]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
6 participants