When during sync it can happen that the block of dir is already present in A but the block of subdir is not. Then during merge A first starts merging dir which creates an empty directory in A's branch whose version vector is {A: 0, B: 1} (which is the initial version vector dir was originally created with by B) and then proceeds to merge subdir. But because the block of subdir is missing, this fails and the merge ends. This leaves dir in B's branch (vv = {A: 0, B: 2}) as happens-after the one in A's branch (vv = {A: 0, B: 1}). Then when the trash job starts, it identifies the blocks of A's dir as unreachable and removes then both from the block store and the index. Then later when another merge job starts, it tries to open dir in both branches, but the one in A's branch fails on LocatorNotFound because it was previously garbage collected which fails the whole merge job. This situation is then never resolved and so A never gets synced.
Consider two replicas, A and B, where A is initially empty and B has the following content:
When during sync it can happen that the block of
dir
is already present in A but the block ofsubdir
is not. Then during merge A first starts mergingdir
which creates an empty directory in A's branch whose version vector is{A: 0, B: 1}
(which is the initial version vectordir
was originally created with by B) and then proceeds to mergesubdir
. But because the block ofsubdir
is missing, this fails and the merge ends. This leavesdir
in B's branch (vv ={A: 0, B: 2}
) as happens-after the one in A's branch (vv ={A: 0, B: 1}
). Then when thetrash
job starts, it identifies the blocks of A'sdir
as unreachable and removes then both from the block store and the index. Then later when anothermerge
job starts, it tries to opendir
in both branches, but the one in A's branch fails onLocatorNotFound
because it was previously garbage collected which fails the wholemerge
job. This situation is then never resolved and so A never gets synced.