aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Merge branch 'stable-7.4'HEADmasterMatthias Sohn6 hours0-0/+0
|\ | | | | | | | | | | | | | | * stable-7.4: Prepare 7.4.0-SNAPSHOT builds JGit v7.4.0.202507080956-m1 Change-Id: Ic4d2f128dc9ec016e12494f1de4fd5b373d0b696
| * Prepare 7.4.0-SNAPSHOT buildsstable-7.4Matthias Sohn26 hours89-123/+123
| | | | | | | | Change-Id: If3b73f0c0fb4b2a983980d70c405a9901b20bac4
| * JGit v7.4.0.202507080956-m1v7.4.0.202507080956-m1Matthias Sohn31 hours89-123/+123
| | | | | | | | | | Signed-off-by: Matthias Sohn <matthias.sohn@sap.com> Change-Id: Ic49661bd7a289221f281e0efd64dc09ff6ed3052
* | Fix JGit version exposed in bazel moduleMatthias Sohn31 hours1-1/+1
|/ | | | | | We have released 7.3.0 in June and are now heading for 7.4.0. Change-Id: Ia0e2b371a17c90df09256bfa8e8cf82ba5d891ba
* MODULE.bazel: Include version in the jgit moduleIvan Frade34 hours1-1/+1
| | | | | | We need this version to import jgit locally in gerrit. Change-Id: I975d7da9874299bea6ef49689b5f85ca0133effc
* Update jetty to 12.0.23Matthias Sohn2 days8-55/+55
| | | | Change-Id: I3064e22a7a0044e3fd01017ae18b040a9e4068d8
* Update bytebuddy to 1.17.6Matthias Sohn2 days8-19/+19
| | | | Change-Id: Id7a7cdfcc4fef01dacddfe564940ed8b6ff9bc45
* Merge branch 'stable-7.3'Luca Milanesio5 days1-2/+8
|\ | | | | | | | | | | | | * stable-7.3: Lock reftable auto-refresh to ensure consistency Change-Id: I43df38f98f0b03dec2e64d4c52257ddc3affd64f
| * Merge branch 'stable-7.2' into stable-7.3stable-7.3Luca Milanesio5 days1-2/+8
| |\ | | | | | | | | | | | | | | | | | | * stable-7.2: Lock reftable auto-refresh to ensure consistency Change-Id: I9219f0fd606b2eb6b9a0632375934f51f1f4c547
| | * Lock reftable auto-refresh to ensure consistencystable-7.2Antonio Barone7 days1-2/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Ensure that reftable auto-refresh operations, clearing the database cache and reloading the reftable stack are executed in an exclusive critical section under lock. Previously, these steps were performed without an exclusive critical section, creating a window where concurrent threads could interfere with each other. In a race condition, one thread might clear the cache and before it had a chance of reloading the stack, another thread could repopulate the cache with stale data, keeping a reference to the open BlockSource channel to the underlying tables that are subsequently removed when the first thread reloads the stack. The above race condition resulted in attempts to access closed resources and lead to ClosedChannelException errors. As an example, consider the following scenario: * T0 - Thread-1 is executing auto-refresh and it clears the database cache * T1 - The master branch moves forward (for any reason): - A new refTable (`R_new`) file is created - An existing refTable (`R_old`) file is deleted due to auto-compaction. * T3 - Thread-2 repopulates the database cache before Thread-1 has had a chance to reload the refTable stack. * T4 - Thread-1 finally reloads the refTable stack, causing the closing of the BlockSource wrapping the removed `R_old` refTable file. * T5 - Thread-2 attempts to read from the already-closed `R_old` BlockSource and the `j.n.c.ClosedChannelException` is thrown To reproduce this problem, you can run a script created to craft this racing condition: I1e78e175cff. While such errors during concurrent execution might be expected and tolerable in isolation, the situation becomes more severe when the `RepositoryCache` is involved, as is the case with Gerrit. The `FileReftableDatabase` instance is cached within the `Repository` object. When a `BlockSource` is closed prematurely due to this race condition, the dangling reference remains in memory until the cached Repository expires, which is one hour by default. This means that, once the race occurs, the repository may be unable to perform any ref lookups for up to an hour, effectively causing a repository outage. By introducing a ReentrantLock around both operations, the refresh logic now guarantees that concurrent readers and writers maintain a consistent view of the reftable state, eliminating the race condition. Verified by executing the script provided at I1e78e175cff and no exceptions are raised anymore. Bug: jgit-130 Change-Id: I6153528a7b2695115b670bda04d4d4228c1731e1
* | | DfsObjDatabase.PackList: Remove PackListImpl subclassIvan Frade13 days1-15/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | PackList is an abstract class with two implementations, the default PackListImpl (never dirty) and NO_PACKS (always dirty). Simplify this to a class (PackList) with an special implementation for NO_PACKS. Change-Id: Ie97e1084417bbfa15c46bd570121a83883ed183c
* | | DfsObjDatabase.PackList: Remove dirty flag settersIvan Frade13 days1-34/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There are no callers for markDirty(), so in NO_PACKS dirty is always true and in the PackListImpl is always false. clearDirty() is a noop in both cases. Delete these methods to avoid confusions. Change-Id: I74d02be7dc287bef27fb7b9d6588c8d8c74105a8
* | | DfsPackFile: Delete #getIndexedObjectSize for ObjectIdIvan Frade2025-06-255-36/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This method is inneficient, as callers lookup the object in the primary index twice: once to find it is in the pack (before calling), another for the position (in the method). Now we have \#getIndexedObjectSize(ctx, indexPosition) variant, so callers find the pack with \#findIdxPosition() and reuse the idxPosition here. Remove this variant with objectId. It doesn't do anything that the combination above cannot do. Change-Id: Ia913f511338b44ab5c45c55d47754d299946f03c
* | | MultiPackIndexLoader: Add NON-NLS annotation to messageIvan Frade2025-06-251-1/+1
| | | | | | | | | | | | | | | | | | Reported as warning in the mvn build. Change-Id: I981947c5717b74ef9547322b25a7211337b32cf6
* | | ChangedPathFilter: Suppress nls warnings in toStringIvan Frade2025-06-251-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | mvn build was warning about these messages lacking the NLS annotation. As the method has 3 lines with 3 string, just suppress the warning in the whole method. Change-Id: I0dbd4055266517edd21418dc12528776078c34cc
* | | JGitText.properties: Use {n} instead %s in messagesIvan Frade2025-06-251-5/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | mvn build repors some warnings of integer castings, and seem to happen in messages that use %s instead of the positional {n} formatter. Update messages to use positional formats. Change-Id: I5336a9c10241bee27a7827ba708fc87d4b9d8875
* | | DfsReader: Reuse index position when looking up object sizeIvan Frade2025-06-242-4/+32
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To get the indexed size of an object, we do two lookups in the primary index. First to find the object, then to find its position in the index. This hits performance when checking many object sizes on big packs. The first lookup of the object returns the index position. Reuse it for the object size index. Change-Id: If875d1b5d0b70f0cf4c448e0f9da09db65caac5e
* | | DfsReader: Use new findPack instead of findPackWithObjectIvan Frade2025-06-241-32/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Now findPack does the same than findPackWithObject, but it also returns the index position of the object, which we wil use in the next change. In getObjectSize and isNotLargerThan, use "findPack" to lookup the object. There are no more usages of findPackWithObject. Change-Id: I9d26a1bf4ac4e8f87148be90e25d17efa4b70e69
* | | DfsReader: return idx position when looking up object in packsIvan Frade2025-06-242-13/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a preparatory change to avoid double lookup in the primary index when using the object size index. If we get the index position during the object lookup, we dont need to query the index again when looking up the size. Make "hasImpl" return the index position of the object in the pack (besides leaving "last" pointing to the pack). Move the "has" logic that checks "last" before other packs to a method we can reuse. Change-Id: I36d2b348971a642c54da3d3727c04d0134ca9eba
* | | DfsReader: Handle correctly invalid object-size indexesIvan Frade2025-06-241-13/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | safeGetIndexedObjectSize returns an Optional to differentiate between "object not found in index" and "index not found". This is wrong for two reasons: the IOException indicating "index not found" is only thrown once (on first loading failure) and the first loading happens in the "hasObjectSizeIndex" just before. Rethrow the IOException in getIndexesObjectSize as IllegalStateException (as it shouldn't happen) and return a plain long in the call. As a side, this saves instantiating an Optional per call and simplifies further optimizations. Change-Id: Ic728483f0e1ec7f98495fdbdb15dc0b24f30dbfd
* | | Merge branch 'stable-7.3'Matthias Sohn2025-06-201-0/+1
|\| | | | | | | | | | | | | | | | | | | | * stable-7.3: Fix: Close the "preserved" PackDirectory Change-Id: I436d2982ed902e2a8483f4476c0573c22f34b876
| * | Merge branch 'stable-7.2' into stable-7.3Matthias Sohn2025-06-201-0/+1
| |\| | | | | | | | | | | | | | | | | | | * stable-7.2: Fix: Close the "preserved" PackDirectory Change-Id: If9f2cd1278aad72f6ca7cae72fbd6b9f5ec66bc8
| | * Merge branch 'stable-7.1' into stable-7.2Matthias Sohn2025-06-201-0/+1
| | |\ | | | | | | | | | | | | | | | | | | | | | | | | * stable-7.1: Fix: Close the "preserved" PackDirectory Change-Id: I82f138f134fe09717e2e024b3c87971140f01b29
| | | * Merge branch 'stable-7.0' into stable-7.1stable-7.1Matthias Sohn2025-06-201-0/+1
| | | |\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * stable-7.0: Fix: Close the "preserved" PackDirectory Change-Id: Icd3f79322f8c021e18fd5c881cd9f2a406230fa8
| | | | * Merge branch 'stable-6.10' into stable-7.0stable-7.0Matthias Sohn2025-06-201-0/+1
| | | | |\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * stable-6.10: Fix: Close the "preserved" PackDirectory Change-Id: Ie0ecfd8178ef4e2eef6a29d46be5645648fe88f3
| | | | | * Fix: Close the "preserved" PackDirectorystable-6.10Nasser Grainawi2025-06-191-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This has been missing since the feature was first added in commit 6167641834e28f8ad322f8fde60866b339bfb7fe. It's possible we could be more aggressive and close soon after attempting to get an object from the preserved packs, but for concurrent misses that might cause thrashing. More likely it would be safe to attempt closing after successfully restoring a preserved pack. A follow up change should attempt that. Change-Id: I87d61007bcc3d03fc86bd18465ca66a2e6f697a1
* | | | | | Update jetty to 12.0.22Matthias Sohn2025-06-168-55/+55
| | | | | | | | | | | | | | | | | | | | | | | | Change-Id: I66775d3b99bb05c3ac1892f0edd5e093a40d692c
* | | | | | Update bouncycastle to 1.81Matthias Sohn2025-06-168-31/+31
| | | | | | | | | | | | | | | | | | | | | | | | Change-Id: I0d1483a9070e6aea99326ae11bf13d71ca31e8ff
* | | | | | Update last jgit release to 7.3.0.202506031305-rMatthias Sohn2025-06-141-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | Change-Id: I88c4b150ffd513c49e52c025656c5bddda07bcdb
* | | | | | Prepare 7.4.0-SNAPSHOT buildsMatthias Sohn2025-06-0389-548/+548
| | | | | | | | | | | | | | | | | | | | | | | | Change-Id: I4d81243b396783a9dca62f320a32eb8e91168e93
* | | | | | Merge branch 'stable-7.3'Matthias Sohn2025-06-0389-548/+548
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * stable-7.3: Prepare 7.3.1-SNAPSHOT builds JGit v7.3.0.202506031305-r Prepare 7.3.0-SNAPSHOT builds JGit v7.3.0.202505281347-rc1 Change-Id: I93694cb153d791a4c8be48b0e2aaf5cc24f021fd
| * | | | | Prepare 7.3.1-SNAPSHOT buildsMatthias Sohn2025-06-0389-548/+548
| | | | | | | | | | | | | | | | | | | | | | | | Change-Id: If6c3473f3d4bfdf1e61dab3cf82db1d251ed5a15
| * | | | | JGit v7.3.0.202506031305-rv7.3.0.202506031305-rMatthias Sohn2025-06-0389-123/+123
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Signed-off-by: Matthias Sohn <matthias.sohn@sap.com> Change-Id: Ie8520484ce2bfad36989cf58a9d81ddccc64f153
| * | | | | Merge branch 'master' into stable-7.3Matthias Sohn2025-06-033-37/+43
| |\ \ \ \ \ | |/ / / / / |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * master: Update maven plugins Use the same ordering/locking in delete() as C git Change-Id: Ie31317681b79a2fd281cebd16e5052b1bde394fb
* | | | | | Merge branch 'stable-7.2'Matthias Sohn2025-06-031-26/+32
|\ \ \ \ \ \ | | |/ / / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | * stable-7.2: Use the same ordering/locking in delete() as C git Change-Id: I0b583cd218c39b1dc0726ae82da86eca58cc81eb
| * | | | | Merge branch 'stable-7.1' into stable-7.2Matthias Sohn2025-06-031-26/+32
| |\ \ \ \ \ | | | |/ / / | | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | * stable-7.1: Use the same ordering/locking in delete() as C git Change-Id: Id52c938b041604162dca9162726bfb594e96f5d1
| | * | | | Merge branch 'stable-7.0' into stable-7.1Matthias Sohn2025-06-031-26/+32
| | |\ \ \ \ | | | | |/ / | | | |/| | | | | | | | | | | | | | | | | | | | | | | | | | * stable-7.0: Use the same ordering/locking in delete() as C git Change-Id: I2c38321ee410d9ec60481d56315710beaebd393a
| | | * | | Merge branch 'stable-6.10' into stable-7.0Matthias Sohn2025-06-031-26/+32
| | | |\ \ \ | | | | | |/ | | | | |/| | | | | | | | | | | | | | | | | | | | | | | | | * stable-6.10: Use the same ordering/locking in delete() as C git Change-Id: I0d06e39d06315e0b9e770bdf79164779d98f9f50
| | | | * | Use the same ordering/locking in delete() as C gitDaniele Sassoli2025-05-291-26/+32
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Following the examples of cgit, lock packed-refs *before* checking for existance of refs in it [1] and *keep the lock* until the loose ref (if any) is removed [2]. The packed-refs lock is kept even when no packed-refs update is required [3] so that somebody else doesn't pack a reference that we are trying to delete. This fixes a concurrency issue that happens on projects with a substantial amount of refs(>~500k) where packing takes long enough for a ref deletion to be triggered half way through it. Not locking the packed-refs file before checking if the refs exists is not safe, as it opens up situations where loose refs are repacked in memory and locked on disk, but before the lock is released and packed-refs is flushed to disk, a ref is deleted. As packed-refs was NOT locked while checking wether a ref existed in it, the current content on disk was read, which was about to be overwritten and did not contain the ref about to be deleted. As the delete doesn't see the ref in the current, on-disk, version of packed refs, it skips processing altogether and moves on, correctly, deleting only the associated loose ref and leaving the packed one behind. Once the new packed-refs, containing the ref that was just deleted, was commited to disk, the ref would come back to life. Therefore, the packed-refs needs to be locked before checking if it contains a ref or not in the same way the C implementation of Git does at [1]. There are tradeoffs, though, in this decision, which will reduce the parallelism of deleting loose refs and performing the refs repacking, which happens very often in certain JGit implementations like Gerrit Code Review. Before this change, repacking of refs and removal of loose refs unrelated to the in-flight repacking was possible without involving any locking; after this change, all loose refs removals have to wait for the packing of refs to be completed, even though the repacking and the refs removals were completely unrelated and their namespaces disjoint. See more details on the test's performance results and the associated tradeoffs in the Issue jgit-152. NOTE: This delete ref locking logic was incorrect regardless of how the packing of the refs is implemented. Making decisions if the pack transaction is needed or not on an unlocked resource is racy and also flagged as bug at [1]. [1]https://github.com/git/git/blob/master/refs/packed-backend.c#L1590 [2]https://github.com/git/git/blob/master/refs/files-backend.c#L3261 [3]https://github.com/git/git/blob/master/refs/files-backend.c#L2943 Bug: jgit-152 Change-Id: I158ec837904617c5fdf667e295ae667b2f037945
* | | | | | Update maven pluginsMatthias Sohn2025-05-302-11/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - git-commit-id-maven-plugin to 9.0.2 - gmavenplus-plugin to 4.2.0 - jacoco-maven-plugin to 0.8.13 - maven-deploy-plugin to 3.1.4 - maven-install-plugin to 3.1.4 - maven-project-info-reports-plugin-version to 3.9.0 - maven-surefire-plugin-version to 3.5.3 - spotbugs-maven-plugin-version to 4.9.3.0 - spring-boot-maven-plugin to 3.5.0 - tycho to 4.0.13 Change-Id: Icbe76f19afca23accab57a57395cc95500ab01a3
| | | | | * Prepare 7.3.0-SNAPSHOT buildsMatthias Sohn2025-05-2989-123/+123
| | | | | | | | | | | | | | | | | | | | | | | | Change-Id: I483ab43823984c031828e326892cc43b75023eb3
| | | | | * JGit v7.3.0.202505281347-rc1v7.3.0.202505281347-rc1Matthias Sohn2025-05-2889-123/+123
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Signed-off-by: Matthias Sohn <matthias.sohn@sap.com> Change-Id: I08bb10e50b55800a0d20f9ef463537caf42769a6
| | | | | * Merge branch 'master' into stable-7.3Matthias Sohn2025-05-288-71/+71
| | | | | |\ | |_|_|_|_|/ |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * master: Prepare 7.1.2-SNAPSHOT builds JGit v7.1.1.202505221757-r Prepare 7.0.2-SNAPSHOT builds JGit v7.0.1.202505221510-r Prepare 6.10.2-SNAPSHOT builds JGit v6.10.1.202505221210-r AmazonS3: Do not accept DOCTYPE and entities ManifestParser: Do not accept DOCTYPE and entities Update mockito to 5.18.0 Update Jetty to 12.0.21 Update com.google.code.gson:gson to 2.13.1 Change-Id: I15e7f9c057dc70d5aff7fb6b6f486f63e897ccb8
* | | | | | Merge branch 'stable-7.2'Matthias Sohn2025-05-220-0/+0
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * stable-7.2: Prepare 7.1.2-SNAPSHOT builds JGit v7.1.1.202505221757-r Prepare 7.0.2-SNAPSHOT builds JGit v7.0.1.202505221510-r Prepare 6.10.2-SNAPSHOT builds JGit v6.10.1.202505221210-r AmazonS3: Do not accept DOCTYPE and entities ManifestParser: Do not accept DOCTYPE and entities Change-Id: I540ac77a7338afd8ff6887e8b92381f121ada12d
| * | | | | Merge branch 'stable-7.1' into stable-7.2Matthias Sohn2025-05-220-0/+0
| |\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * stable-7.1: Prepare 7.1.2-SNAPSHOT builds JGit v7.1.1.202505221757-r Prepare 7.0.2-SNAPSHOT builds JGit v7.0.1.202505221510-r Prepare 6.10.2-SNAPSHOT builds JGit v6.10.1.202505221210-r AmazonS3: Do not accept DOCTYPE and entities ManifestParser: Do not accept DOCTYPE and entities Change-Id: I919d0a6890ba2fd4aed745151fda82a4de116846
| | * | | | Prepare 7.1.2-SNAPSHOT buildsMatthias Sohn2025-05-2289-540/+540
| | | | | | | | | | | | | | | | | | | | | | | | Change-Id: If1e74998a5d6495dafecd2e29b37dbf9018f99e6
| | * | | | JGit v7.1.1.202505221757-rv7.1.1.202505221757-rMatthias Sohn2025-05-2289-123/+123
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Signed-off-by: Matthias Sohn <matthias.sohn@sap.com> Change-Id: Ie69fa5fb5497f8bbb66c68b03eb161fb61bcddf1
| | * | | | Merge branch 'stable-7.0' into stable-7.1Matthias Sohn2025-05-223-1/+53
| | |\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * stable-7.0: Prepare 7.0.2-SNAPSHOT builds JGit v7.0.1.202505221510-r Prepare 6.10.2-SNAPSHOT builds JGit v6.10.1.202505221210-r AmazonS3: Do not accept DOCTYPE and entities ManifestParser: Do not accept DOCTYPE and entities Change-Id: I4506e4bf51225000418b15bf09df3287be26242a
| | | * | | Prepare 7.0.2-SNAPSHOT buildsMatthias Sohn2025-05-2289-534/+534
| | | | | | | | | | | | | | | | | | | | | | | | Change-Id: I80b330e687e96385176f00757dbf4491ce662dbc
| | | * | | JGit v7.0.1.202505221510-rv7.0.1.202505221510-rMatthias Sohn2025-05-2289-123/+123
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Signed-off-by: Matthias Sohn <matthias.sohn@sap.com> Change-Id: Id31e58be65f27c8f475f810b83491652be1266df