commit | 167490520dd5f8ef845482b6f1487cac66e3226e | [log] [tgz] |
---|---|---|
author | Jacek Centkowski <geminica.programs@gmail.com> | Wed Nov 23 08:27:36 2022 +0100 |
committer | Jacek Centkowski <geminica.programs@gmail.com> | Sat Dec 03 09:24:26 2022 +0100 |
tree | 6f078eebe81f83e77188f350bc2f1f8996bac173 | |
parent | 28980fe4f22a354bb0c809a13b23371789b63b6e [diff] |
Cache refs/... resolutions When `Repository.resolve` is called it recognizes if the string is a ref reference and returns its ObjectId. Cache all requests to `refs/...` so that reading from repository is avoided. Note that ref tip's parent references are not cached. Note that `PrologCompiler.call` calls `Repository.resolve` on `refs/meta/config` and that should be improved. Add integration test that compares the `resolve` method output with the JGit's one for the following patterns: * HEAD * SHA-1: a complete or abbreviated SHA-1 * refs/...: a complete reference name * refs/.../^: first parent of the complete reference name's tip commit * short-name: a short reference name under refs/heads, refs/tags, or refs/remotes namespace * tag-NN-gABBREV: output from describe, parsed by treating ABBREV as an abbreviated > SHA-1. * id^: first parent of commit id, this is the same as id^1 * id^{commit}: ensure id is a commit Bug: Issue 15556 Change-Id: I9a722d55b105a27ceda7e0ecbec1ce886ff896f5
When Serialize AccountCache series was introduced it simplified the cache eviction by always reaching out to JGit for data. Unfortunately it comes with price which is especially high when All-Users repository is accessed through the NFS and core.trustFolderStat = false
is configured in ${GERRIT_SITE}/etc/jgit.config
(quite common setup for HA/Multi-Site ens).
This plugin was developed to introduce the in-memory cache (managed by Gerrit so that evictions could be coordinated to multiple nodes) that reduces the price for reaching to refs in JGit. It is a Gerrit native alternative (that can be applied to Gerrit 3.2) to work that is currently under progress for caching Refs in JGit.
Here is the short comparison of heavy-refs-related operations performance. The test scenario was to get random change details (over the same REST API that is used in Gerrit's details page) in 8 parallel threads over 5mins period of time. The core.trustFolderStat = false
was set in ${GERRIT_SITE}/etc/jgit.config
. It was called against:
stable-3.1
in the results)stable-3.2
in the results)stable-3.2-libCache
in the results).Note that TRS
is Reqs/Sec
for each Thread.
| version | TRS Avg | TRS Std Dev | TRS Max | Total Reqs/sec | Transfer/sec(MB)| | --------------------------------- | ------- | ----------- | ------- | -------------- | --------------- | | stable-3.1 | 57,33 | 8,26 | 80 | 456,95 | 4,34 | | stable-3.2 | 13,87 | 4,92 | 20 | 110,18 | 1,07 | | stable-3.2-libCache | 105,27 | 14,55 | 150 | 834,88 | 8,41 | | stable-3.1 vs stable-3.2 | 313,34% | 67,89% | 300,00% | 314,73% | 305,61% | | stable-3.2-libCache vs stable-3.2 | 658,98% | 195,73% | 650,00% | 657,74% | 685,98% | | stable-3.2-libCache vs stable-3.1 | 83,62% | 76,15% | 87,50% | 82,71% | 93,78% |
One can clearly see that in this setup using this library module outperforms both Gerrit 3.2 and 3.1 by factor of 6 and 2 correspondingly. The test script, detailed description and more results are available here.
Clone or link this plugin to the plugins directory of Gerrit‘s source tree, and then run bazel build on the plugin’s directory.
Example:
git clone --recursive https://gerrit.googlesource.com/gerrit cd plugins git clone "https://gerrit.googlesource.com/modules/cached-refdb" cd .. && bazel build plugins/cached-refdb
The output plugin jar is created in:
bazel-bin/plugins/cached-refdb/cached-refdb.jar
Copy the cached-refdb.jar into the ${GERRIT_SITE}/lib/
so that it is being loaded when the Gerrit instance is started. Note that the following configuration options need to be added
git config --file ${GERRIT_SITE}/etc/gerrit.config --add gerrit.installDbModule\ com.googlesource.gerrit.plugins.cachedrefdb.LibDbModule git config --file ${GERRIT_SITE}/etc/gerrit.config --add gerrit.installModule\ com.googlesource.gerrit.plugins.cachedrefdb.LibSysModule
NOTE: There are situations where the binding of the module to the Gerrit's GitRepositoryManager is not desired; e.g., when using this module together with others that are trying to override it at the same time.
It is possible to just load the module using the following two options:
git config --file ${GERRIT_SITE}/etc/gerrit.config --add gerrit.installDbModule\ com.googlesource.gerrit.plugins.cachedrefdb.LibModule git config --file ${GERRIT_SITE}/etc/gerrit.config --add gerrit.installModule\ com.googlesource.gerrit.plugins.cachedrefdb.LibSysModule
By default cache can hold up to 1024
refs which will not be sufficient for any production site therefore one can configure it through the standard Gerrit cache configuration means e.g.
git config --file ${GERRIT_SITE}/etc/gerrit.config cache.ref_by_name.memoryLimit 10240
Note that library module requires the Gerrit instance restart in order to pick up the configuration changes.