blob: ee820a835eb00de15cec294e37fafbd7030f7bb2 [file] [log] [blame] [view] [edit]
# Gerrit Postgres based persistent cache
Gerrit lib module to swap existing persistent cache implementation
(that is H2 based) with implementation that stores data in Postgres.
Note that is uses [INSERT INTO ... ON CONFLICT DO UPDATE ...](https://stackoverflow.com/questions/17267417/how-to-upsert-merge-insert-on-duplicate-update-in-postgresql)
upsert syntax therefore it is Postgres *9.5+* compatible.
## How to build
Build this module similarly to standalone build for any other,
bazel based Gerrit plugin:
- Clone the cache-postgres source tree
- Run ```bazel build cache-postgres```
- The ```cache-postgres.jar``` module is generated under ```/bazel-genfiles/cache-postgres.jar```
## How install
Copy ```cache-postgres.jar``` library to Gerrit ```/lib``` and add the following
two extra settings to ```gerrit.config```:
```
[gerrit]
installModule = com.googlesource.gerrit.modules.cache.pg.CacheModule
[cache]
url = jdbc:postgresql://localhost:5432/gerrit_caches?user=gerrit&password=gerrit
```
## Core Gerrit settings: section `cache`
cache.url
: URI that specifies connection to existing DB (including both
username and passwword).
cache.poolLimit
: Maximum number of open database connections. If the server needs
more than this number, request processing threads will wait up
to `cache.poolMaxWait` seconds for a connection to be released before
they abort with an exception.
Default value is taken from `database.poolLimit`.
cache.poolMinIdle
: Minimum number of connections to keep idle in the pool.
Default is `4`.
cache.poolMaxIdle
: Maximum number of connections to keep idle in the pool. If there
are more idle connections, connections will be closed instead of
being returned back to the pool.
Default is min(`cache.poolLimit`, `16`).
cache.poolMaxWait
Maximum amount of time a request processing thread will wait to
acquire a database connection from the pool. If no connection is
released within this time period, the processing thread will abort
its current operations and return an error to the client.
Values should use common unit suffixes to express their setting:
* ms, milliseconds
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours
If a unit suffix is not specified, `milliseconds` is assumed.
Default is `30 seconds`.
## Testing with docker based Postgres setup
One can start test Postgres server that contains both `gerrit_review`
(Gerrit db) and `gerrit_caches` (db for caches) with the
following command
```
docker-compose -f docker/gerrit-caches-compose.yaml up
```
One nedds to add the following parameters to `gerrit.config`
```
git config --file ${GERRIT_ETC_DIR}/gerrit.config database.type POSTGRESQL
git config --file ${GERRIT_ETC_DIR}/gerrit.config database.hostname localhost
git config --file ${GERRIT_ETC_DIR}/gerrit.config database.port 5432
git config --file ${GERRIT_ETC_DIR}/gerrit.config database.database gerrit_review
git config --file ${GERRIT_ETC_DIR}/gerrit.config database.username gerrit
git config --file ${GERRIT_ETC_DIR}/gerrit.config database.password gerrit
git config --file ${GERRIT_ETC_DIR}/gerrit.config cache.url "jdbc:postgresql://localhost:5432/gerrit_caches?user=gerrit&password=gerrit"
```
where `GERRIT_ETC_DIR` is `GERRIT_SITE/etc`;
Notes
* container name is `gerrit-pg`
* container uses `docker_gerrit-db-data` volume therefore restarting it
preserves data
* details of Postgres user/dbs setup can be found in `docker/create-gerrit-dbs.sh`
* Postgres container details (ports, volumes, etc.) are in `docker/gerrit-caches-compose.yaml`