This commit is contained in:
Joey Hess 2021-10-01 11:49:12 -04:00
parent 42c6bc6c3e
commit 17a31f8e1b
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38

View file

@ -0,0 +1,38 @@
[[!comment format=mdwn
username="joey"
subject="""comment 10"""
date="2021-10-01T14:57:11Z"
content="""
The second hash is done by isUnmodifiedLowLevel, and
is indeed done because the inode cache does not verify.
The inode cache does not verify because for some reason,
it does not have any inode cached for the object file
when that is called.
The reason this only happens in sync and not get is that sync also sends
files it received to other remotes, and to do that it needs to check if
their content is present. Which is normally inexpensive, so not a problem.
It so happens that sync calls inAnnex even when
there are no other remotes to send the content to. Which is unncessary, and
avoiding that could be used to fix this problem. But there would still be a
problem if there were some other remote that the content ought to be sent to,
if it still called inAnnex in that case. Maybe it's possible to avoid it calling
inAnnex at all though, since it knows when it's gotten the content.
The inode cache gets written to the database before sync calls
inAnnex. And queued writes get flushed to the database before reading
from it. I've confirmed all this is happening.
So why does getting the inode cache from the db not see the previously
written data?
I suspect this is where NTFS enters the picture. Perhaps
something about it is causing changes to the sqlite database to not
be visible immediately to a reader. Might involve whatever locking
sqlite is or is not able to do on NTFS, or something like that.
(Interestingly, at the end of the sync, the smudge clean filter
gets called, and it is able to read the inode cache from the db
at that point. So another process run just a bit later can see the data.)
"""]]