Support 'max_result_window' config for Elasticsearch indexes

Gerrit supports Elasticsearch as the index for search API. This is very
convenient for users to choose the index type they want. But when there
exists a large number of documents in the index of Elasticsearch, some
relative functions such as the front pages and APIs will become
unusable.

This is because of the default Elasticsearch 'max_result_window' setting
being 10000. When the query result (from + size) is greater than it, the
query will fail.

When gerrit executes a query on the index (such as the user is searching
on the Gerrit front pages, which makes a request to the Gerrit
backend API), then Gerrit will execute an HTTP request to the
Elasticsearch API to query the relative data and return the data back
to the front user to view the data they want.

But if the result set that exists in the index is greater than the
default value 10000, Gerrit will encounter this issue because
Elasticsearch API will return an error response to tip the invoker
that the result window is exceeded with the query.

There are three different solutions to the problem:

    1. Support 'max_result_window' config for Elasticsearch indexes. It
is the simplest solution and the common solution for multiple releases
of Gerrit (all Elasticsearch versions supported by Gerrit support this
setting).

    2. Use Elasticsearch Scroll Query API instead. This way decreases
the costs of query performance, but brings other problems. Elasticsearch
does not support traditional pagination by using scroll API and has
some limitation with the '_scoll_id'; it is not recommended to use it
for real-time user requests.

    3. Use Elasticsearch Search After API instead. It's the best way in
Elasticsearch to solve the costly deep pagination. But, it only supports
Elasticsearch versions greater than 6.2, while Gerrit still supports
5.6.

[1] https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request-body-search-scroll
[2] https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request-body-search-search-after

Bug: Issue 12444
Change-Id: I39da7d1d50df7bbe9dc88411632bb029c77f9f36
3 files changed
tree: 042ece9a721c7705f5e327466768493f0efcefe9
  1. .settings/
  2. antlr3/
  3. contrib/
  4. Documentation/
  5. gerrit-gwtdebug/
  6. gerrit-gwtui/
  7. gerrit-gwtui-common/
  8. gerrit-plugin-gwtui/
  9. java/
  10. javatests/
  11. lib/
  12. plugins/
  13. polygerrit-ui/
  14. prolog/
  15. prologtests/
  16. proto/
  17. resources/
  18. tools/
  19. webapp/
  20. .bazelignore
  21. .bazelproject
  22. .bazelrc
  23. .bazelversion
  24. .editorconfig
  25. .git-blame-ignore-revs
  26. .gitignore
  27. .gitmodules
  28. .gitreview
  29. .mailmap
  30. .pydevproject
  31. BUILD
  32. COPYING
  33. INSTALL
  34. Jenkinsfile
  35. package.json
  36. README.md
  37. SUBMITTING_PATCHES
  38. version.bzl
  39. 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.