dexonsmith added inline comments.

================
Comment at: 
clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp:200-210
+          // FIXME: This read can fail.
+          // In that case, we should probably update `CacheEntry::MaybeStat`.
+          // However, that is concurrently read at the start of this function
+          // (`needsUpdate` -> `isReadable`), leading to a data race. If we try
+          // to avoid the data race by returning an `error_code` here (without
+          // updating the entry stat value, we can end up attempting to read 
the
+          // file again in the future, which breaks the consistency guarantees
----------------
I'm not quite following this logic. I think it's safe (and important!) to 
modify MaybeStat if `read()` fails.

We're in a critical section that either creates and partially initializes the 
entry, or incrementally updates it.

In the "creates and partially initializes" case:
- All other workers will get nullptr for `Cache.getEntry()` and try to enter 
the critical section.
- We have just seen a successful MaybeStat value.
- `needsRead()` will be `true` since we have not read contents before. We will 
immediately try to read.
- `read()` should open the original contents and can safely:
    - on success, update the value for MaybeStat to match the observed size
    - on failure, drop the value and set the error for MaybeStat to the 
observed error
- When we leave the critical section, either:
    - MaybeStat stores an error; no thread will enter the critical section again
    - OriginalContents are initialized and `needsRead()` returns false

In the "incrementally updates" case:
- `needsRead()` returns false so `read()` will not be called



================
Comment at: 
clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp:211
+          // `true` on the first read and prevent future reads of the same 
file.
+          Contents->read(CacheEntry.getName(), getUnderlyingFS());
+
----------------
Seems like the existing stat value should be passed into `read()` and the 
second stat there removed.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D114966/new/

https://reviews.llvm.org/D114966

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to