6aceb38eb7
* stable-2.15: Document that NoteDb migration requires a large heap Move downloaded artifact cache from buck-cache to bazel-cache Move downloaded artifact cache from buck-cache to bazel-cache Revert "Hide sensitive data from audit and gerrit logs" dev-plugins: Improve formatting of reviewer suggestion documentation ReviewerSuggestion: Reword Javadoc ReviewerRecommender: Add debug log of plugin provided weight Handle deleted project in ReindexIfStaleTask Disallow tabbing on paper-button Handle the ReindexIfStale event when a change is deleted PolyGerrit: Fix gr-diff-view arrows to use html code Migrate metrics-core to 4.0.2 version CreateChange: Fix appending Signed-off-by line after Change-Id CreateChange: Only insert Change-Id if there isn't already one CreateChangeIT: Disable "Insert Signed-off-by" after test Fix gr-group-members to add and delete using group id rather than name Fix group member URL Change-Id: I5ccbc4265266236b55b3c864347e7016cc7a2bd0
195 lines
8.2 KiB
Plaintext
195 lines
8.2 KiB
Plaintext
= Gerrit Code Review - NoteDb Backend
|
|
|
|
NoteDb is the next generation of Gerrit storage backend, which replaces the
|
|
traditional SQL backend for change and account metadata with storing data in the
|
|
same repository as code changes.
|
|
|
|
.Advantages
|
|
- *Simplicity*: All data is stored in one location in the site directory, rather
|
|
than being split between the site directory and a possibly external database
|
|
server.
|
|
- *Consistency*: Replication and backups can use a snapshot of the Git
|
|
repository refs, which will include both the branch and patch set refs, and
|
|
the change metadata that points to them.
|
|
- *Auditability*: Rather than storing mutable rows in a database, modifications
|
|
to changes are stored as a sequence of Git commits, automatically preserving
|
|
history of the metadata. +
|
|
There are no strict guarantees, and meta refs may be rewritten, but the
|
|
default assumption is that all operations are logged.
|
|
- *Extensibility*: Plugin developers can add new fields to metadata without the
|
|
core database schema having to know about them.
|
|
- *New features*: Enables simple federation between Gerrit servers, as well as
|
|
offline code review and interoperation with other tools.
|
|
|
|
== Current Status
|
|
|
|
- Storing change metadata is fully implemented in the 2.15 release, and is the
|
|
default for new sites.
|
|
- Admins may use an link:#offline-migration[offline] or
|
|
link:#online-migration[online] tool to migrate change data in an existing
|
|
site from ReviewDb.
|
|
- Storing link:config-accounts.html[account data] is fully implemented in the
|
|
2.15 release. Account data is migrated automatically during the upgrade
|
|
process by running `gerrit.war init`.
|
|
- Storing link:config-groups.html[group metadata] is fully implemented
|
|
for the 2.16 release. Group data is migrated automatically during
|
|
the upgrade process by running `gerrit.war init`
|
|
- Account, group and change metadata on the servers behind `googlesource.com` is fully
|
|
migrated to NoteDb. In other words, if you use
|
|
link:https://gerrit-review.googlesource.com/[gerrit-review], you're already
|
|
using NoteDb.
|
|
|
|
For an example NoteDb change, poke around at this one:
|
|
----
|
|
git fetch https://gerrit.googlesource.com/gerrit refs/changes/70/98070/meta \
|
|
&& git log -p FETCH_HEAD
|
|
----
|
|
|
|
== Future Work ("Gerrit 3.0")
|
|
|
|
- NoteDb will be the only database format supported by Gerrit 3.0. The offline
|
|
change data migration tool will be included in Gerrit 3.0, but online
|
|
migration will only be available in the 2.x line.
|
|
|
|
[[migration]]
|
|
== Migration
|
|
|
|
Migrating change metadata can take a long time for large sites, so
|
|
administrators choose whether to do the migration offline or online, depending
|
|
on their available resources and tolerance for downtime.
|
|
|
|
Only change metadata requires manual steps to migrate it from ReviewDb; account
|
|
and group data is migrated automatically by `gerrit.war init`.
|
|
|
|
[[online-migration]]
|
|
=== Online
|
|
|
|
To start the online migration, set the `noteDb.changes.autoMigrate` option in
|
|
`gerrit.config` and restart Gerrit:
|
|
----
|
|
[noteDb "changes"]
|
|
autoMigrate = true
|
|
----
|
|
|
|
Alternatively, pass the `--migrate-to-note-db` flag to
|
|
`gerrit.war daemon`:
|
|
----
|
|
java -jar gerrit.war daemon -d /path/to/site --migrate-to-note-db
|
|
----
|
|
|
|
Both ways of starting the online migration are equivalent. Once started, it is
|
|
safe to restart the server at any time; the migration will pick up where it left
|
|
off. Migration progress will be reported to the Gerrit logs.
|
|
|
|
*Advantages*
|
|
|
|
* No downtime required.
|
|
|
|
*Disadvantages*
|
|
|
|
* Only available in 2.x; will not be available in Gerrit 3.0.
|
|
* Much slower than offline; uses only a single thread, to leave resources
|
|
available for serving traffic.
|
|
* Performance may be degraded, particularly of updates; data needs to be written
|
|
to both ReviewDb and NoteDb while the migration is in progress.
|
|
|
|
[[offline-migration]]
|
|
=== Offline
|
|
|
|
To run the offline migration, run the `migrate-to-note-db` program:
|
|
----
|
|
java -jar gerrit.war migrate-to-note-db -d /path/to/site
|
|
----
|
|
|
|
Once started, it is safe to cancel and restart the migration process, or to
|
|
switch to the online process.
|
|
|
|
[NOTE]
|
|
Migration requires a heap size comparable to running a Gerrit server. If you
|
|
normally run `gerrit.war daemon` with an `-Xmx` flag, pass that to the migration
|
|
tool as well.
|
|
|
|
*Advantages*
|
|
|
|
* Much faster than online; can use all available CPUs, since no live traffic
|
|
needs to be served.
|
|
* No degraded performance of live servers due to writing data to 2 locations.
|
|
* Available in both Gerrit 2.x and 3.0.
|
|
|
|
*Disadvantages*
|
|
|
|
* May require substantial downtime; takes about twice as long as an
|
|
link:pgm-reindex.html[offline reindex]. (In fact, one of the migration steps is a
|
|
full reindex, so it can't possibly take less time.)
|
|
|
|
[[trial-migration]]
|
|
==== Trial mode
|
|
|
|
The migration tool also supports "trial mode", where changes are
|
|
migrated to NoteDb and read from NoteDb at runtime, but their primary storage
|
|
location is still ReviewDb, and data is kept in sync between the two locations.
|
|
|
|
To run the migration in trial mode, add `--trial` to `migrate-to-note-db` or
|
|
`daemon`:
|
|
----
|
|
java -jar gerrit.war migrate-to-note-db --trial -d /path/to/site
|
|
# OR
|
|
java -jar gerrit.war daemon -d /path/to/site --migrate-to-note-db --trial
|
|
----
|
|
|
|
Or, set `noteDb.changes.trial=true` in `gerrit.config`.
|
|
|
|
There are several use cases for trial mode:
|
|
|
|
* Help test early releases of the migration tool for bugs with lower risk.
|
|
* Try out new NoteDb-only features like
|
|
link:rest-api-changes.html#get-hashtags[hashtags] without running the full
|
|
migration.
|
|
|
|
To continue with the full migration after running the trial migration, use
|
|
either the online or offline migration steps as normal. To revert to
|
|
ReviewDb-only, remove `noteDb.changes.read` and `noteDb.changes.write` from
|
|
`notedb.config` and restart Gerrit.
|
|
|
|
== Configuration
|
|
|
|
The migration process works by setting a configuration option in `notedb.config`
|
|
for each step in the process, then performing the corresponding data migration.
|
|
|
|
Config options are read from `notedb.config` first, falling back to
|
|
`gerrit.config`. If editing config manually, you may edit either file, but the
|
|
migration process itself only touches `notedb.config`. This means if your
|
|
`gerrit.config` is managed with Puppet or a similar tool, it can overwrite
|
|
`gerrit.config` without affecting the migration process. You should not manage
|
|
`notedb.config` with Puppet, but you may copy values back into `gerrit.config`
|
|
and delete `notedb.config` at some later point after completing the migration.
|
|
|
|
In general, users should not set the options described below manually; this
|
|
section serves primarily as a reference.
|
|
|
|
- `noteDb.changes.write=true`: During a ReviewDb write, the state of the change
|
|
in NoteDb is written to the `note_db_state` field in the `Change` entity.
|
|
After the ReviewDb write, this state is written into NoteDb, resulting in
|
|
effectively double the time for write operations. NoteDb write errors are
|
|
dropped on the floor, and no attempt is made to read from ReviewDb or correct
|
|
errors (without additional configuration, below).
|
|
- `noteDb.changes.read=true`: Change data is written
|
|
to and read from NoteDb, but ReviewDb is still the source of truth. During
|
|
reads, first read the change from ReviewDb, and compare its `note_db_state`
|
|
with what is in NoteDb. If it doesn't match, immediately "auto-rebuild" the
|
|
change, copying data from ReviewDb to NoteDb and returning the result.
|
|
- `noteDb.changes.primaryStorage=NOTE_DB`: New changes are written only to
|
|
NoteDb, but changes whose primary storage is ReviewDb are still supported.
|
|
Continues to read from ReviewDb first as in the previous stage, but if the
|
|
change is not in ReviewDb, falls back to reading from NoteDb. +
|
|
Migration of existing changes is described in the link:#migration[Migration]
|
|
section above. +
|
|
Due to an implementation detail, writes to Changes or related tables still
|
|
result in write calls to the database layer, but they are inside a transaction
|
|
that is always rolled back.
|
|
- `noteDb.changes.disableReviewDb=true`: All access to Changes or related tables
|
|
is disabled; reads return no results, and writes are no-ops. Assumes the state
|
|
of all changes in NoteDb is accurate, and so is only safe once all changes are
|
|
NoteDb primary. Otherwise, reading changes only from NoteDb might result in
|
|
inaccurate results, and writing to NoteDb would compound the problem. +
|