clangd-indexer fails with concurrency and multiple directories

clangd-indexer does not seem to handle compile_commands.json with different directories. I am able to workaround the problem by passing ‘-execute-concurrency=1’.

It seems to work ok with a single directory (i.e with just ‘abc’ from the example below), but fails if there are multiple, as in the example below.
I am working with revision 356635 of clangd.

With a directory structure of:

./
./abc
./abc/test.h
./abc/test.cc
./def

./def/ytest.h

./def/xtest.cc
./compile_commands.json

And a compile_commands.json of:

[
{
“arguments”: [
“g++”,
“-c”,
“-o”,

“test.o”,
“test.cc”
],
“directory”: “/home/test/abc”,
“file”: “test.cc”
},
{
“arguments”: [
“g++”,
“-c”,
“-o”,

“xtest.o”,
“xtest.cc”
],
“directory”: “/home/test/def”,
“file”: “xtest.cc”
}
]

I receive the error:

[test]$ clangd-indexer -executor=all-TUs compile_commands.json > clangd.dex
[1/2] Processing file /home/test/abc/test.cc
[2/2] Processing file /home/test/def/xtest.cc
error: no such file or directory: ‘test.cc’
error: no input files
error: unable to handle compilation, expected exactly one compiler job in ‘’
Error while processing /home/test/abc/test.cc.
Failed to run action on /home/test/abc/test.cc

I assume it may be related to a non-thread-safe chdir somewhere in the code.

Hi Shane,

Thanks for bringing this up, we actually seem to have all the required infrastructure to fix this.
I’ve created https://reviews.llvm.org/D59683 to fix this, feel free to patch it in locally while it’s on review.

The fix has landed as r356743. Let me know if it keeps failing for you after this revision.

Thank you Ilya for the quick fix. That seems to have resolved it.

Regards,
Shane