# Gerrit Cloud Spanner refdb

This plugin provides an implementation of the Gerrit global refdb backed by
[Cloud Spanner](https://cloud.google.com/spanner).

Requirements for using this plugin are:

- Gerrit v3.6 or later
- Cloud spanner as a provisioned instance
- Optional, for testing: a locally hosted
[emulator](https://cloud.google.com/spanner/docs/emulator)

## Typical use case

A global refdb implementation is a requirement for a Gerrit multi-master
scenario in a multi-site setup to ensure refs are updated consistently across
multiple Gerrit primary sites.

Refer to the
[Gerrit multi-site plugin](https://gerrit.googlesource.com/plugins/multi-site/+/master/DESIGN.md)
for more details on the high level architecture.

## Use with Cloud Spanner emulator

The [in-memory Cloud Spanner emulator](https://cloud.google.com/spanner/docs/emulator)
can be used during development. There are several limitations of the emulator
that differ from the production service.

An easy way to run the emulator is to use gcloud CLI and Docker. Following the
install instructions [here](https://cloud.google.com/spanner/docs/emulator#install)
will provide a local instance that the plugin can access. The gcloud CLI
commands will be sent to the emulator instead of the production service. A test
spanner instance and database will need to be created.

```
gcloud spanner instances create test-instance --config=emulator-config --description="Test Instance" --nodes=1

gcloud spanner databases create global-refdb --instance=test-instance
```

There are several
[limitations](https://cloud.google.com/spanner/docs/emulator#limitations)
of the emulator which differ from the production service.

## Use with simulated multi-site setup

In order to easily set up and begin testing the spanner-refdb plugin, the
multi-site plugin's
[local environment setup](https://gerrit.googlesource.com/plugins/multi-site/+/refs/heads/master/setup_local_env/)
can be used.

This simulates a multi-site setup using two local gerrit instances. Build the
release.war to include spanner-refdb and follow the linked example setup.

## Configuration options

Configuration details can be found in the
[spanner-refdb config documentation](src/main/resources/Documentation/config.md).

When not used with the emulator, the plugin requires the path to credentials in
the config to authenticate with google. To create the key see the
[official documentation](https://cloud.google.com/iam/docs/keys-create-delete).