]> source.dussan.org Git - jgit.git/commit
Invalidate DfsObjDatabase pack list when refs are updated 19/77319/4
authorDave Borowitz <dborowitz@google.com>
Thu, 14 Jul 2016 15:40:55 +0000 (11:40 -0400)
committerDave Borowitz <dborowitz@google.com>
Thu, 14 Jul 2016 19:58:14 +0000 (15:58 -0400)
commit18e9db306b52d2b49c78d0558d51f4a04cca1764
tree7c6f4abbbd7bf98fa97f7a7aeb54c89e73b66383
parentffddf8d437b5b56706871fc53dbe4e5770f20ea3
Invalidate DfsObjDatabase pack list when refs are updated

Currently, there is a race where a user of a DfsRepository in a single
thread may get unexpected MissingObjectExceptions trying to look up an
object that appears as the current value of a ref:

1. Thread A scans packs before scanning refs, for example by reading
   an object by SHA-1.
2. Thread B flushes an object and updates a ref to point to that
   object.
3. Thread A looks up the ref updated in (2). Since it is scanning refs
   for the first time, it sees the new object SHA-1.
4. Thread A tries to read the object it found in (3), using the cached
   pack list it got from (1). The object appears missing.

Allow implementations to work around this by marking the object
database's current pack list as "dirty." A dirty pack list means that
DfsReader will rescan packs and try again if a requested object is
missing. Implementations should mark objects as dirty any time the ref
database reads or scans refs that might be newer than a previously
cached pack list.

Change-Id: I06c722b20c859ed1475628ec6a2f6d3d6d580700
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsObjDatabase.java
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/InMemoryRepository.java