summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Organize importsDavid Pursehouse2016-11-1488-159/+149
| | | | | Change-Id: I7c545d06b1bced678c020fab9af1382bc4416b6e Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Add {get,set}GitwebDescription to RepositoryShawn Pearce2016-11-145-6/+174
| | | | | | | | | | | | | | | | This method pair allows the caller to read and modify the description file that is traditionally used by gitweb and cgit when rendering a repository on the web. Gerrit Code Review has offered this feature for years as part of its GitRepositoryManager interface, but its fundamentally a feature of JGit and its Repository abstraction. git-core typically initializes a repository with a default value inside the description file. During getDescription() this string is converted to null as it is never a useful description. Change-Id: I0a457026c74e9c73ea27e6f070d5fbaca3439be5
* Merge "Don't serialize internal hash collision chain link"Shawn Pearce2016-11-141-1/+1
|\
| * Don't serialize internal hash collision chain linkThomas Wolf2016-10-291-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ObjectId is serializable, and so are its subtypes. Ensure that serialization does not follow the hash collision chain internal to the ObjectIdOwnerMap, otherwise completely unrelated objects may get serialized when a RevObject is serialized. Note that serializing a RevCommit or RevTag may serialize quite a few objects due to the parent/object links they contain. A user has no real control over how many objects will be written when a RevCommit is serialized. C.f [1]. This change does not resolve that, but in any case this internal hash collision chain link should not participate in serialization. [1] https://github.com/gitblit/gitblit/pull/1141 Change-Id: Ice331a9dc80a59ca360fcc04adaff8b5e750d847 Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
* | Merge "Reduce synchronized scope around ConcurrentHashMap"Shawn Pearce2016-11-141-15/+15
|\ \
| * | Reduce synchronized scope around ConcurrentHashMapPhilipp Marx2016-11-121-15/+15
| | | | | | | | | | | | | | | Change-Id: I982a78070efb6bc2d3395330456d62e0d5ce6da7 Signed-off-by: Philipp Marx <smigfu@googlemail.com>
* | | Merge changes Id89b3cd0,I5b0fb122Shawn Pearce2016-11-142-4/+21
|\ \ \ | | | | | | | | | | | | | | | | | | | | * changes: FileLfsServlet: Make sendError protected Make ObjectUploadListener public
| * | | FileLfsServlet: Make sendError protectedDavid Pursehouse2016-11-131-1/+13
| | | | | | | | | | | | | | | | | | | | Change-Id: Id89b3cd0da86a535946feb15254737bbf8d855d4 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
| * | | Make ObjectUploadListener publicDavid Pursehouse2016-11-131-3/+8
| | | | | | | | | | | | | | | | | | | | Change-Id: I5b0fb1220bc0e5c660f1b5373abc5868d985c60b Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* | | | Merge "StreamCopyThread: Remove unused AtomicInteger import"Jonathan Nieder2016-11-131-1/+0
|\ \ \ \
| * | | | StreamCopyThread: Remove unused AtomicInteger importJonathan Nieder2016-11-131-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I forgot to do this in 97f3baa0d3df7ed26a55b2240cc5ce1a04861a4c (StreamCopyThread: Remove unnecessary flushCount, 2016-11-13). Change-Id: Iaed9f345848cf0f854c9d0debcf94bc831d53054
* | | | | Merge "Extract insecure Cipher factory"Matthias Sohn2016-11-132-6/+71
|\ \ \ \ \
| * | | | | Extract insecure Cipher factoryShawn Pearce2016-11-132-6/+71
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Bazel runs ErrorProne by default and ErrorProne rightly complains that allowing the user to specify any Cipher can lead to insecure code (in particular, getCipher("AES") operates in ECB mode). Unfortunately this is required to support existing repositories insecurely stored on S3. Extract the insecure factory code to its own class so this can be built as a java_library() with this check disabled. Change-Id: I34f381965bdaa25d5aa8ebf6d8d5271b238334e0
* | | | | | Merge "Get rid of SoftReference in RepositoryCache"Jonathan Nieder2016-11-132-23/+12
|\ \ \ \ \ \ | |_|/ / / / |/| | | | |
| * | | | | Get rid of SoftReference in RepositoryCacheHugo Arès2016-11-132-23/+12
| |/ / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Now that RepositoryCache have a time based eviction strategy, get rid of the strategy to evict cache entries if heap memory is running low, i.e. soft references. Main reason why time based eviction was implemented was to offer an alternative to the unpredictable soft references. Relying on soft references is not working, especially in large heap. The JVM GC will consider collecting soft references as last resort before throwing an out of memory error. For example, an application like Gerrit configured with a 128GB heap, GC will wait until all 128GB is filled before collecting the soft references so the application will be suffering long pauses caused by GC for a long time already. In other words, you will have to restart application because it's unusable before JVM eviction kicks in. Keeping the SoftReference in RepositoryCache is causing more harm than good. If you use the time based eviction (which is the default strategy) and want to tune JVM to release soft references more aggressively, it will release repositories from the cache even though they are not expired which defeats the purpose of the repository cache. Gerrit uses Lucene library which uses soft references and this is causing a "memory leak" except if you configure JVM to release soft references more aggressively which have the nasty side effect of evicting non expired repositories from the cache. Change-Id: I9940bd800464c7f007696d0ccde52ea617b2ebce Signed-off-by: Hugo Arès <hugo.ares@ericsson.com>
* | | | | StreamCopyThread: flush cannot interrupt a writeJonathan Nieder2016-11-131-13/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Because flush calls interrupt with writeLock held, it cannot interrupt a write. Simplify by no longer defending against that. Change-Id: Ib0b39b425335ff7b0ea1b1733562da5392576a15
* | | | | StreamCopyThread: Remove unnecessary flushCountJonathan Nieder2016-11-131-12/+1
| |/ / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | StreamCopyThread#run consistently interrupts itself whenever it discovers it has been interrupted by StreamCopyThread#flush while not reading. The flushCount is not needed to avoid lost flushes. All in-tree users of StreamCopyThread never flush. As a nice side benefit, this avoids the expense of atomic operations that have no purpose for those users. Change-Id: I1afe415cd09a67f1891c3baf712a9003ad553062
* | | | Merge "Switch JSchSession to simple isolated OutputStream"Shawn Pearce2016-11-135-27/+249
|\ \ \ \ | |/ / / |/| | |
| * | | Switch JSchSession to simple isolated OutputStreamShawn Pearce2016-11-135-27/+249
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Work around issues with JSch not handling interrupts by isolating the JSch interactions onto another thread. Run write and flush on a single threaded Executor using simple Callable operations wrapping the method calls, waiting on the future to determine the outcome before allowing the caller to continue. If any operation was interrupted the state of the stream becomes fuzzy at close time. The implementation tries to interrupt the pending write or flush, but this is very likely to corrupt the stream object, so exceptions are ignored during such a dirty close. Change-Id: I42e3ba3d8c35a2e40aad340580037ebefbb99b53
* / / WalkEncryption: Cleanup Java 8 supportShawn Pearce2016-11-131-35/+3
|/ / | | | | | | | | | | | | Java 8 is now the minimum for JGit, so Java 7 only paths are not necessary. Change-Id: I0151625fed4d0da95321ebed5cca648b8c29d5f1
* | Check that DfsBlockCache#blockSize is a power of 2Philipp Marx2016-11-115-1/+99
| | | | | | | | | | | | | | | | | | | | In case a value is used which isn’t a power of 2 there will be a high chance of java.lang.ArrayIndexOutBoundsException and org.eclipse.jgit.errors.CorruptObjectException due to a mismatching assumption for the DfsBlockCache#blockSizeShift parameter. Change-Id: Ib348b3704edf10b5f93a3ffab4fa6f09cbbae231 Signed-off-by: Philipp Marx <smigfu@googlemail.com>
* | Fix loop in auto gcMatthias Sohn2016-11-074-7/+147
| | | | | | | | | | | | | | | | | | | | * GC.tooManyLooseObjects() always responded true since the loop missed to advance the iterator so it always incremented until the threshold was exceeded. * Also fix loop exit criterion which was off by 1. * Add some tests. Change-Id: I70976dfaa026efbcf3c46bd45941f37277a18e04 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Update buck to latest versionDavid Pursehouse2016-11-061-1/+1
| | | | | | | | | | | | | | Update to the same version used on Gerrit's master branch. Change-Id: I20e4edd099a095c42f23df8cc57241efad2de2ce Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* | StreamCopyThread: Do not drop data when flush is observed before writingJonathan Nieder2016-11-041-5/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | StreamCopyThread.flush was introduced in 61645b938bc934fda3b0624c5bac1e3495634750 (Add timeouts to smart transport clients, 2009-06-19) to support timeouts on write in JSch. The commit message from that change explains: JSch made a timeout on write difficult because they explicitly do a catch for InterruptedException inside of their OutputStream. We have to work around that by creating an additional thread that just shuttles data between our own OutputStream and the real JSch stream. The code that runs on that thread is structured as follows: while (!done) { int n = src.read(buf); dst.write(buf, 0, n); } with src being a PipedInputStream representing the data to be written to JSch. To add flush support, that change wanted to add an extra step if (wantFlush) dst.flush(); but to handle the case where the thread is blocked in the read() call waiting for new input, it needs to interrupt the read. So that is how it works: the caller runs pipeOut.write(some data); pipeOut.flush(); copyThread.flush(); to write some data and force it to flush by interrupting the read. After the pipeOut.flush(), the StreamCopyThread reads the data that was written and prepares to copy it out. If the copyThread.flush() call interrupts the copyThread before it acquires writeLock and starts writing, we throw away the data we just read to fulfill the flush. Oops. Noticed during the review of e67d59df3fb8ae1efe94a54efce36784f7cc83e8 (StreamCopyThread: Do not let flush interrupt a write, 2016-11-04), which introduced this bug. Change-Id: I4aceb5610e1bfb251046097adf46bca54bc1d998
* | StreamCopyThread: Do not let flush interrupt a writeJonathan Nieder2016-11-041-17/+29
| | | | | | | | | | | | | | | | | | | | flush calls interrupt() to interrupt a pending read and trigger a flush. Unfortunately that interrupt() call can also interrupt a pending write, putting Jsch in a bad state and triggering "Short read of block" errors. Add locking to ensure the flush only interrupts reads as intended. Change-Id: Ib105d9e107ae43549ced7e6da29c22ee41cde9d8
* | Fix flush call race condition in StreamCopyThreadZhen Chen2016-10-311-1/+7
| | | | | | | | | | | | | | | | | | | | If there was a new flush() call during flush previous bytes, we need to catch it in order to process the new bytes between the two flush() calls instead of going to last catch IOException clause and end the thread. Change-Id: Ibc58a1fa97559238c13590aedbb85e482d85e465 Signed-off-by: Zhen Chen <czhen@google.com>
* | Use AtomicObjectOutputStream in CleanFilterMatthias Sohn2016-10-262-22/+33
| | | | | | | | | | | | | | Enhance and use AtomicObjectOutputStream to write temporary files in CleanFilter. Change-Id: I28987dad18255a9067344f94b4e836cbd183e4b1 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | CleanFilter: use atomic move to move temporary file to media fileMatthias Sohn2016-10-261-1/+3
| | | | | | | | Change-Id: I227a0ed6e4e15ac3d96f96a6cefcaf55680ad8bb Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Fix temporary file leak in CleanFilterMatthias Sohn2016-10-261-0/+2
| | | | | | | | | | | | | | The CleanFilter leaked temporary files when a media file already existed before running clean filter. Change-Id: Ie20fce3f40d34095ce58e596d25d8d64fe0cde99 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Use AnyLongObjectId instead of LongObjectId in LFS APIMatthias Sohn2016-10-262-8/+9
| | | | | | | | Change-Id: I083ad1ea3e8d3685df7c306854c2498c92b05ffb Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Speedup CleanFilter by transferring data in chunks of 8kMatthias Sohn2016-10-261-5/+6
| | | | | | | | | | | | | | | | Transferring data byte per byte is slow, running add with CleanFilter on a 2.9MB file takes 20 seconds. Using a buffer of 8k shrinks this time to 70ms. Change-Id: I3bc2d8c11fe6cfaffcc99dc2a00643e01ac4e9cc Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Add missing @since tag for new protected field in ObjectReaderMatthias Sohn2016-10-241-2/+3
| | | | | | | | Change-Id: I93d67d7fd2fde55be39480944d9d7072dbb6c600 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* | Make streamFileThreshold configurableKevin Corcoran2016-10-244-8/+53
|/ | | | | | | | | | | | | Previously, the streamFileThreshold, the threshold at which a file would be streamed rather than loaded entirely into memory, was only configurable on a global basis. This commit makes this threshold configurable on a per-loader basis. Bug: 490404 Change-Id: I492c18c3155dbf56eedda9044a61d76120fd75f9 Signed-off-by: Kevin Corcoran <kevin.corcoran@puppetlabs.com> Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Merge "Preserve backslashes within double quotes in CLIGitCommand::split()"David Pursehouse2016-10-232-1/+3
|\
| * Preserve backslashes within double quotes in CLIGitCommand::split()Rüdiger Herrmann2016-10-232-1/+3
| | | | | | | | Change-Id: Ia6a56512baa6a0f27e2eef1b19ebb60291ba377f Signed-off-by: Rüdiger Herrmann <ruediger.herrmann@gmx.de>
* | Move constants used for config-files to ConfigConstantsChristian Halstrick2016-10-233-10/+18
| | | | | | | | Change-Id: I7d8db4bfa1a851afd599bb8eaa8f8273204d2e1d
* | Implement auto gcMatthias Sohn2016-10-238-1/+217
|/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | With the auto option, gc checks whether any housekeeping is required; if not, it exits without performing any work. Some JGit commands run gc --auto after performing operations that could create many loose objects. Housekeeping is required if there are too many loose objects or too many packs in the repository. If the number of loose objects exceeds the value of the gc.auto option jgit's GC consolidates all existing packs into a single pack (equivalent to -A option), whereas git-core would combine all loose objects into a single pack using repack -d -l. Setting the value of gc.auto to 0 disables automatic packing of loose objects. If the number of packs exceeds the value of gc.autoPackLimit, then existing packs (except those marked with a .keep file) are consolidated into a single pack by using the -A option of repack. Setting gc.autoPackLimit to 0 disables automatic consolidation of packs. Like git the following jgit commands run auto gc: - fetch - merge - rebase - receive-pack The auto gc for receive-pack can be suppressed by setting the config option receive.autogc = false Change-Id: I68a2a051b39ec2c53cb7c4b8f6c596ba65eeba5d Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* CheckoutCommand: Add method to add multiple pathsDavid Pursehouse2016-10-222-3/+21
| | | | | | | | The new method addPaths(List<String>) allows callers to add multiple paths without having to iterate over several calls to addPath(String). Change-Id: I2c3746a97ead7118fb0ed5543a2c843224719031 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Checkout: Add the ability to checkout all paths.Ned Twigg2016-10-222-3/+31
| | | | | | Change-Id: Ie1e59c566b63d0dfac231e44e7ebd7f3f08f3e9f Signed-off-by: Ned Twigg <ned.twigg@diffplug.com> Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Fix possible SIOOBE in RefDirectory.parsePackedRefsMarc Strapetz2016-10-213-0/+7
| | | | | | | | | This SIOOBE happens reproducibly when trying to access a repository containing Cygwin symlinks Change-Id: I25f103fcc723bac7bfaaeee333a86f11627a92c7 Signed-off-by: Marc Strapetz <marc.strapetz@syntevo.com> Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* TransportBundleFile: Resolve remote repository locallyThomas Meyer2016-10-211-1/+1
| | | | | | | Remove the assumption that the local repository is a file based one. Change-Id: I8f10fe7a54e9fc07f2a23d7901e52b65aa570d45 Signed-off-by: Thomas Meyer <thomas.mey@web.de> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
* TreeFormatter: disallow empty filenames in treesDavid Turner2016-10-195-1/+49
| | | | | | | | | Git barfs on these (and they don't make any sense), so we certainly shouldn't write them. Change-Id: I3faf8554a05f0fd147be2e63fbe55987d3f88099 Signed-off-by: David Turner <dturner@twosigma.com> Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Add "concurrencyLevel" option to DfsBlockCachePhilipp Marx2016-10-193-1/+39
| | | | | | | | Allow for higher concurrency on DfsBlockCache by adding a configuration for number of estimated concurrent requests. Change-Id: Ia65e58ecb2c459b6d9c9697a2f715d933270f7e6 Signed-off-by: Philipp Marx <smigfu@googlemail.com>
* DiffCommandTest: Don't call toString on String instancesDavid Pursehouse2016-10-191-5/+5
| | | | | Change-Id: Ib308b3498593d595b3d8741a9b2d241bbc7441c3 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* FileNameMatcherTest: Use Character.valueOf rather than new CharacterDavid Pursehouse2016-10-191-1/+1
| | | | | Change-Id: I9d6e20a258d34ae1d2700fbe8e6c6e3b0ba94424 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* ArchiveTest: Don't use string concatenation in loopDavid Pursehouse2016-10-191-12/+12
| | | | | | | | | | | | | | According to FindBugs: In each iteration, the String is converted to a StringBuffer/ StringBuilder, appended to, and converted back to a String. This can lead to a cost quadratic in the number of iterations, as the growing string is recopied in each iteration. Replace string concatenation with StringBuffer. Change-Id: I60e09f274bed6722f4e0e4d096b0f2b1b31ec1b4 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* CLIRepositoryTestCase: Remove unused 'trash' memberDavid Pursehouse2016-10-191-4/+0
| | | | | Change-Id: I813f3de5f059e6e5cd34af20fce1e117bfe55b55 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* Merge branch 'stable-4.5'David Pursehouse2016-10-191-3/+3
|\ | | | | | | | | | | | | | | * stable-4.5: Config: do not add spaces before units Change-Id: I54185f54e6d78d7aac873ee5f990f09582318857 Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
| * Config: do not add spaces before unitsDavid Turner2016-10-191-3/+3
| | | | | | | | | | | | | | | | | | | | | | Adding a space before the unit ('g', 'm', 'k) causes git to fail with the error: fatal: bad numeric config value Change-Id: I57f11d3a1cdcca4549858e773af1a2a80fc0369f Signed-off-by: David Turner <dturner@twosigma.com> Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>
* | Use valueOf rather than constructor for Integer and BooleanDavid Pursehouse2016-10-183-5/+5
| | | | | | | | | | Change-Id: I1c65b2e40ba6ec5860903b11b4631e014f3dc5ce Signed-off-by: David Pursehouse <david.pursehouse@gmail.com>