My plugin has several processes that run behind-the-scenes to populate portions of the filesystem. After these processes complete, I've always called VfsUtil.markDirtyAndRefresh(false, true, true, sharedRootDir) to force the IDE to update its notion of these files. That's always worked reliably...until very recently.
Now I can have one of these processes run to populate a temp directory (not under a content root), then do the following:
File ioTempDir = ExternalProcess.populateTempDir(...);
VirtualFile tempDir = VfsUtil.findFileByIoFile(ioTempDir, true);
VfsUtil.markDirtyAndRefresh(false, true, true, tempDir);
List<VirtualFile> tempFiles = VfsUtil.collectChildrenRecursively(tempDir);
and more often than not, the resulting list of files doesn't reflect the actual contents of the temporary directory on disk. I can set a breakpoint in the debugger between the last two lines and refresh a couple of additional times after which things seem to be correct, but I'm running markDirtyAndRefresh() with async=false assuming/hoping that by the time that call returns, the VFS will be up-to-date...or at least will read through to the correct state.
Again, I've implemented this pattern a few times in the past without issue, and there's really no difference in what I'm doing now other than that I'm seeing this behavior.
It's worth nothing that I see what may be related behavior as a user of the IDE in recent builds where sometimes the VCS indicators seem behind until I an explicit File>Synchronize, or files are added to my project's content roots and that's sometimes not picked up when the window gets focus...though sometimes things work fine.
It just seems like something is broken here in recent builds. Does this sound familiar to anyone else? Any thoughts on something I might do short of refreshing/collecting files in a loop until the count of returned files stabilizes?