I don't want to take over Aaron's troubleshooting, but to answer this specific question: Full Refresh and Refresh both go through the same code path to retrieve directory listings and update last modified times.
We have a global data structure that represents all of the directories and files we know about, and a separate structure that represents the comparison of two directories and and just stores references to those files/folders. In both Refresh and Full Refresh, we retrieve a directory listing and update that first structure in place. The only difference between them is that in Refresh's case, the comparison structure gets notifications for every file that's changed, and in Full Refresh's case the comparison structure is thrown out and rebuilt from scratch. There are some other, irrelevant, differences, but in the end, there's only one copy of each file's last modified time in the system, and there's only one routine that updates that last modified time.
I'd happily look into the code further if there was an obvious place to do so, but there isn't, especially if rules-based comparisons are disabled and if Full Refresh is the failing one.
If I had to guess, a possible culprit could be if you somehow had two directories with identical names (maybe differing only in case) in the same parent directory, or if there were accented characters that were messing thing up. Creating duplicate entries requires bypassing the Windows APIs (e.g., using the Linux subsystem) and the second isn't terribly likely, since BC is conservative in how it handles Unicode filenames, but if you wanted to rule them out, try testing with a new directory structure/share where all of the paths are ASCII characters.
We have a global data structure that represents all of the directories and files we know about, and a separate structure that represents the comparison of two directories and and just stores references to those files/folders. In both Refresh and Full Refresh, we retrieve a directory listing and update that first structure in place. The only difference between them is that in Refresh's case, the comparison structure gets notifications for every file that's changed, and in Full Refresh's case the comparison structure is thrown out and rebuilt from scratch. There are some other, irrelevant, differences, but in the end, there's only one copy of each file's last modified time in the system, and there's only one routine that updates that last modified time.
I'd happily look into the code further if there was an obvious place to do so, but there isn't, especially if rules-based comparisons are disabled and if Full Refresh is the failing one.
If I had to guess, a possible culprit could be if you somehow had two directories with identical names (maybe differing only in case) in the same parent directory, or if there were accented characters that were messing thing up. Creating duplicate entries requires bypassing the Windows APIs (e.g., using the Linux subsystem) and the second isn't terribly likely, since BC is conservative in how it handles Unicode filenames, but if you wanted to rule them out, try testing with a new directory structure/share where all of the paths are ASCII characters.
Comment