So I've started to hack on jgit again, to build out more of the lower level library.
This particular series adds support for pack file index v2, which Nico added to C Git several months ago and is slated to become the default pack index file format in a future release of Git, due to its increased error checking during delta reuse.
I also cleaned up the pack file access code to be shorter and more concise. Unfortunately the overall series diffstat doesn't show it that way, but I think its now easier to follow how the control flows.
I've improved performance for packfile data access by adding a delta base cache, like we did in C Git months ago. This cache is really necessary on modern repositories as pack-objects is tending to use longer delta chains, due to the reader side now having this delta base cache. Profiling was showing jgit was spending a very large amount of time in unpacking tree deltas.
We now actually use the following .git/config options to control how the window cache limits work:
core.packedGitWindowSize core.packedGitLimit core.deltaBaseCacheLimit core.packedGitMMAP
The configuration file parser now recognizes the "k/m/g" suffixes that are comonly used in the first three parameters. The last option is a boolean and is unique to jgit.
The window cache and delta base cache also exploit SoftReferences to make the caches memory-sensitive. This way the JVM's GC can whack our caches back if its running low on memory. Its not quite the same as C Git's concept of "malloc failed, flush out some windows and retry" but its reasonably close.
Finally we now use a single WindowCache and delta base cache for the entire JVM when running in an Eclipse workbench. If the user has multiple repositories open at once (say different projects) they need to co-habitate in the JVM's virtual address space. By sharing the same caches the repositories can evict each other's windows when they need to make room.
----
The following changes since commit 3cd4f3f9119b79750bbfc542119451a668c462e3:
Robin Rosenberg (1):
Readded qualifier to version 0.3.1are available in the git repository at:
repo.or.cz:/srv/git/egit/spearce.git master
Shawn O. Pearce (41):
Make the absolute path of a WindowedFile available to callers
Include the pack index file name when reporting a bad header
Report pack file open failures to the console
Refactor index reading code from PackFile to PackIndex
Rename PackIndex.readIndexHeader to loadVersion1
Read pack index files using FileInputStream and not WindowedFile
Don't bother checking the index file length after reading it
Move index:pack object count checking into PackFile class
Refactor PackIndex version 1 handling code into PackIndexV1
Fully document the PackIndex API
Hoist readFully and decodeUInt32 up from PackIndexV1 to PackIndex
Refactor PackIndex.readFully to support reading into the middle
Read the pack index header to perform automatic version detection
Add complete reading support for pack index v2
Stop creating "new format" loose objects as C Git no longer likes them
Refactor RepositoryConfig to be stacked many levels deep
Don't make unit tests depend upon compressed file lengths
Corrected name of the method that reloads the packed-refs data
Cleanup misspelling in Javadoc of Repository class
Extract StGitPatch from Repository to its own top-level type
Refactor RepositoryState into its own top-level type
Refactor PackFile construction to take the idxFile path from scan
Shuffle the length of a WindowedFile down into its provider
Defer opening pack files until we actually need object data
Use Java 5 bit twiddling APIs rather than hand-rolling bit counting
Support reading config file integers with k/m/g suffixes
Honor core.packedGitWindowSize, packedGitLimit, packedGitMMAP config
Enable easy access to the user's ~/.gitconfig
Use a single WindowCache for the entire Eclipse workspace
Modify the WindowedFile API to pass around a WindowCursor during reads
Change ByteWindow implementations to hold data by SoftReferences
Refactor WindowedFile/WindowCache so all windows are a uniform size
Simplify WindowCache and WindowedFile internal APIs to be private
Use a proper ReferenceQueue to avoid duplpicate window entries
New RepositoryConfig getInt,getBoolean helper methods with no subsection
Change delta packed object loaders to use a PackedObjectLoader for base
Implement core.deltaBaseCacheLimit to improve unpacking performance
Remove unnecessary bitwise AND masks in readTree
Precount the number of tree entries during readTree
Change the ObjectLoader.getType method to return int
Fix ArrayIndexOutOfBoundsException in WindowCache.../egit/core/op/ConnectProviderOperation.java | 4 +- .../spearce/egit/core/project/GitProjectData.java | 27 +++- .../src/org/spearce/egit/ui/GitHistoryPage.java | 2 +- .../internal/decorators/GitResourceDecorator.java | 2 +- .../tst/org/spearce/jgit/lib/ReadTreeTest.java | 4 +- .../org/spearce/jgit/lib/RepositoryConfigTest.java | 9 +- .../tst/org/spearce/jgit/lib/T0003_Basic.java | 90 --------- .../tst/org/spearce/jgit/lib/T0004_PackReader.java | 11 +- org.spearce.jgit/META-INF/MANIFEST.MF | 3 +- .../src/org/spearce/jgit/lib/ByteArrayWindow.java | 27 +-- .../src/org/spearce/jgit/lib/ByteBufferWindow.java | 21 +-- .../src/org/spearce/jgit/lib/ByteWindow.java | 42 +++-- .../src/org/spearce/jgit/lib/Constants.java | 21 ++ .../src/org/spearce/jgit/lib/CoreConfig.java | 61 +++++- .../jgit/lib/DeltaOfsPackedObjectLoader.java | 2 +- .../spearce/jgit/lib/DeltaPackedObjectLoader.java | 29 ++- .../jgit/lib/DeltaRefPackedObjectLoader.java | 4 +- .../src/org/spearce/jgit/lib/ObjectLoader.java | 6 +- .../src/org/spearce/jgit/lib/ObjectWriter.java | 40 +--- .../src/org/spearce/jgit/lib/PackFile.java | 155 +++++---------- .../src/org/spearce/jgit/lib/PackIndex.java | 165 +++++++++++++++ .../src/org/spearce/jgit/lib/PackIndexV1.java | 84 ++++++++ .../src/org/spearce/jgit/lib/PackIndexV2.java | 125 ++++++++++++ .../org/spearce/jgit/lib/PackedObjectLoader.java | 13 +- .../src/org/spearce/jgit/lib/Repository.java | 211 +++++--------------- .../src/org/spearce/jgit/lib/RepositoryConfig.java | 172 +++++++++++----- .../src/org/spearce/jgit/lib/RepositoryState.java | 108 ++++++++++ .../src/org/spearce/jgit/lib/Tree.java | 40 ++-- .../org/spearce/jgit/lib/UnpackedObjectCache.java | 156 +++++++++++++++ .../org/spearce/jgit/lib/UnpackedObjectLoader.java | 20 +-- .../spearce/jgit/lib/WholePackedObjectLoader.java | 12 +- .../src/org/spearce/jgit/lib/WindowCache.java | 151 +++++++++++--- .../src/org/spearce/jgit/lib/WindowCursor.java | 67 ++++++ .../src/org/spearce/jgit/lib/WindowProvider.java | 75 ------- .../src/org/spearce/jgit/lib/WindowedFile.java | 207 +++++++++++-------- .../src/org/spearce/jgit/stgit/StGitPatch.java | 52 +++++ 36 files changed, 1459 insertions(+), 759 deletions(-) create mode 100644 org.spearce.jgit/src/org/spearce/jgit/lib/PackIndex.java create mode 100644 org.spearce.jgit/src/org/spearce/jgit/lib/PackIndexV1.java create mode 100644 org.spearce.jgit/src/org/spearce/jgit/lib/PackIndexV2.java create mode 100644 org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryState.java create mode 100644 org.spearce.jgit/src/org/spearce/jgit/lib/UnpackedObjectCache.java create mode 100644 org.spearce.jgit/src/org/spearce/jgit/lib/WindowCursor.java delete mode 100644 org.spearce.jgit/src/org/spearce/jgit/lib/WindowProvider.java create mode 100644 org.spearce.jgit/src/org/spearce/jgit/stgit/StGitPatch.java
-- Shawn.