Automatically retry REST operations on failure with tracing enabled

On REST endpoint level we already retry the REST operation if there was
a potentially temporary failure such as a LockFailure. Extend this to
also retry once on non-recoverable failures, but with request tracing
switched on. This is the same as if the user would retry the REST call
with request tracing after it has failed. Capturing traces for failures
automatically can help with debugging issues and safe roundtrips between
user and supporting engineer.

This only works for REST endpoints which support retrying (REST
endpoints that extend RetryingRestModifyView or
RetryingRestCollectionModifyView). Enabling more REST endpoints to retry
is outside the scope of this change, but surely feasible.

Submit has custom retry login in MergeOp. Adapt the retry in there too.

Whether retry on failure should be done can be configured by setting
retry.retryWithTraceOnFailure in gerrit.config (default = false).

Since not all REST endpoints are atomic it can happen that a REST
endpoint did some partial updates before it failed. If the operation is
retried, in this case it can happen that this partial update is done
again or that the failure is different now. This is OK since the chances
for this are low and the same would happen if the user retries the
operation.

Change-Id: I2b78cbef50e5c3ce4fafce0d7cdcb3b1835abc86
Signed-off-by: Edwin Kempin <ekempin@google.com>
6 files changed
tree: f6698430ad9b67f1219f3dcbd5e95b2e6a188fc0
  1. .settings/
  2. antlr3/
  3. contrib/
  4. Documentation/
  5. java/
  6. javatests/
  7. lib/
  8. plugins/
  9. polygerrit-ui/
  10. prolog/
  11. prologtests/
  12. proto/
  13. resources/
  14. tools/
  15. webapp/
  16. .bazelproject
  17. .bazelrc
  18. .bazelversion
  19. .editorconfig
  20. .git-blame-ignore-revs
  21. .gitignore
  22. .gitmodules
  23. .mailmap
  24. .pydevproject
  25. BUILD
  26. COPYING
  27. INSTALL
  28. package.json
  29. README.md
  30. SUBMITTING_PATCHES
  31. version.bzl
  32. WORKSPACE
README.md

Gerrit Code Review

Gerrit is a code review and project management tool for Git based projects.

Build Status

Objective

Gerrit makes reviews easier by showing changes in a side-by-side display, and allowing inline comments to be added by any reviewer.

Gerrit simplifies Git based project maintainership by permitting any authorized user to submit changes to the master Git repository, rather than requiring all approved changes to be merged in by hand by the project maintainer.

Documentation

For information about how to install and use Gerrit, refer to the documentation.

Source

Our canonical Git repository is located on googlesource.com. There is a mirror of the repository on Github.

Reporting bugs

Please report bugs on the issue tracker.

Contribute

Gerrit is the work of hundreds of contributors. We appreciate your help!

Please read the contribution guidelines.

Note that we do not accept Pull Requests via the Github mirror.

Getting in contact

The Developer Mailing list is repo-discuss on Google Groups.

License

Gerrit is provided under the Apache License 2.0.

Build

Install Bazel and run the following:

    git clone --recurse-submodules https://gerrit.googlesource.com/gerrit
    cd gerrit && bazel build release

Install binary packages (Deb/Rpm)

The instruction how to configure GerritForge/BinTray repositories is here

On Debian/Ubuntu run:

    apt-get update & apt-get install gerrit=<version>-<release>

NOTE: release is a counter that starts with 1 and indicates the number of packages that have been released with the same version of the software.

On CentOS/RedHat run:

    yum clean all && yum install gerrit-<version>[-<release>]

On Fedora run:

    dnf clean all && dnf install gerrit-<version>[-<release>]

Use pre-built Gerrit images on Docker

Docker images of Gerrit are available on DockerHub

To run a CentOS 7 based Gerrit image:

    docker run -p 8080:8080 gerritforge/gerrit-centos7[:version]

To run a Ubuntu 15.04 based Gerrit image:

    docker run -p 8080:8080 gerritforge/gerrit-ubuntu15.04[:version]

NOTE: release is optional. Last released package of the version is installed if the release number is omitted.