---
title: "Gerrit 3.6.x"
permalink: 3.6.html
hide_sidebar: true
hide_navtoggle: true
toc: true
---

Download: **[3.6.8](https://gerrit-releases.storage.googleapis.com/gerrit-3.6.8.war)**
| [3.6.7](https://gerrit-releases.storage.googleapis.com/gerrit-3.6.7.war)
| [3.6.6](https://gerrit-releases.storage.googleapis.com/gerrit-3.6.6.war)
| [3.6.5](https://gerrit-releases.storage.googleapis.com/gerrit-3.6.5.war)
| [3.6.4](https://gerrit-releases.storage.googleapis.com/gerrit-3.6.4.war)
| [3.6.3](https://gerrit-releases.storage.googleapis.com/gerrit-3.6.3.war)
| [3.6.2](https://gerrit-releases.storage.googleapis.com/gerrit-3.6.2.war)
| [3.6.1](https://gerrit-releases.storage.googleapis.com/gerrit-3.6.1.war)
| [3.6.0](https://gerrit-releases.storage.googleapis.com/gerrit-3.6.0.war)

Documentation: **[3.6.8](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.8/index.html)**
| [3.6.7](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.7/index.html)
| [3.6.6](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.6/index.html)
| [3.6.5](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.5/index.html)
| [3.6.4](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.4/index.html)
| [3.6.3](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.3/index.html)
| [3.6.2](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.2/index.html)
| [3.6.1](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.1/index.html)
| [3.6.0](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.0/index.html)

## Release highlights

Gerrit 3.6 is fully compatible with Java 17 LTS.

### Submit Requirements

Gerrit deprecates the use of Prolog for definition of custom logic in the submit rules. From this version
onwards the rules can be expressed using the new concept of [Submit Requirements](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.0/config-submit-requirements.html).

Submit Requirements have several advantages, compared to the legacy Prolog rules:

- Easier to understand, defined through simple boolean expressions using a
  higher-level change search predicates and common boolean operator.
- Lower footprint: they do not require backtracking in their evaluation,
  consuming less CPU cycles.
- Richer GUI: makes it easy for reviewers and change owners to identify and
  understand missing requirements.

Existing projects relying on Prolog will still work as expected, allowing a
smoother project transition.

Submit requirements also introduce new handy functions that allow to achieve
complex rules equivalent to the old Prolog rules but with an easier syntax:
- support checking on content modifications and file diffs with the `file:`
  operator.
- `distinctvoters` predicate allows gating submission on N distinct voters
  across more than one label.
- `authoremail` operator similar to the older `commit_author` Prolog predicate
- `message` predicate to support regular expression on the commit message as a
  condition.

> **NOTE**: With the new submit requirements, submit records are no longer emitted.
> This means that any queries with the label formats (`label:Code-Review=NEED` or `label:Code-Review=OK`) will
> no longer match with changes. See more details in [Change 330203](https://gerrit-review.googlesource.com/330203).

## Important notes

### Schema and index changes

This release doesn't formally contain schema changes, however the NoteDb format has
evolved and includes the following amendments:

- [Change 324937](https://gerrit-review.googlesource.com/c/gerrit/+/324937):
The label in NoteDb has a UUID suffix

- [Change 323897](https://gerrit-review.googlesource.com/c/gerrit/+/323897):
The review score is only read from the latest patch-set

> NOTE: Because of the above incompatibilities, upgrade is supported only from
> Gerrit v3.5.2 onwards, because of the need of the extra `copy-approvals` tool
> and the backward compatibility fix on UUID suffixed labels.
> Failing to run the `copy-approvals` tool in v3.5.2 would leave the changes
> with a potentially stale approval score once the site is migrated to v3.6.

The `changes` index version has been increased to version 77. By default the
index is automatically rebuilt upon the Gerrit startup after the
upgrade.

### Offline upgrade

Upgrade to [Gerrit v3.5.2](../3.5.html#352) or later and make sure that the `copy-approvals`
site program has been run at least once.

```sh
  java -jar gerrit.war copy-approvals -d site_path
```

Download the [Gerrit v3.6.0 war](https://gerrit-releases.storage.googleapis.com/gerrit-3.6.0.war) and
run the `init` program:

```sh
  java -jar gerrit-3.6.0.war init -d site_path
```

Run offline reindexing of the changes:

```sh
  java -jar gerrit.war reindex --index changes -d site_path
```

### Online upgrade with zero-downtime

Gerrit v3.6.x supports zero-downtime upgrade from Gerrit v3.5.2 or later when
configured using a [high-availability configuration](https://gerrit.googlesource.com/plugins/high-availability/+/refs/heads/master/README.md),
and the Git repositories are stored in a shared filesystem such as NFS or
similar.

During the zero-downtime upgrade, Gerrit end-users would not notice any outage
or service disruption. They will be able to perform any read/write Gerrit
operation on the GUI or using using any API.

The zero-downtime upgrade consists of the following steps:

1. Have Gerrit servers running v3.5.2 or later, in high-availability
   configuration, healthy and able to handle the incoming traffic properly.
2. Run the `copy-approvals` SSH command against one of the Gerrit servers
   and wait for completion on all changes for all projects.
3. Set the Gerrit server unhealthy.
4. Shutdown the Gerrit server, update gerrit.war and plugins to v3.6.x and start
   Gerrit again.
5. Verify that the Gerrit server is working properly (e.g. run automated smoke
   tests) and then make it healthy again.
6. Wait for the Gerrit server to start serving traffic normally.
7. Repeat steps 3. to 6. for all the other Gerrit servers.

### Update gerrit.reportBugUrl configuration

The issues of the Gerrit Code Review project have been migrated from
Monorail into the new Gerrit Tracker, see announcement at:
https://groups.google.com/g/repo-discuss/c/F4havFh_Bvw/m/D5MsV17yAgAJ

If the [gerrit.reportBugUrl](https://gerrit-review.googlesource.com/Documentation/config-gerrit.html#gerrit.reportBugUrl)
setting on your Gerrit server is pointing to the Gerrit Monorail project, which
is deprecated now, please update the URL to point to the new Gerrit Tracker,
e.g. change https://bugs.chromium.org/p/gerrit/issues/entry?template=Bug+Report
to https://issues.gerritcodereview.com/issues/new.

### Breaking changes


* The __ignore__ feature is completely removed from Gerrit's web app; the `ignore`
and `unignore` actions and the associated `is:ignored` predicate are not supported
anymore.

  Gerrit has the attention set feature since v3.4. If you want to ignore a change,
  then you can remove yourself from the attention set or the list of reviewers/ccs.
  That makes it also clearer to your collaborators that you don't want to participate.

  The legacy __ignore__ feature did not have any effect on the user's dashboard or
  attention set but was limited to the execution of the `is:ignored` predicate.
  On Google hosted Gerrit the feature is used by about 5 users per week.
  20% of __ignore__ action clicks were accidental.

* [Change 321607](https://gerrit-review.googlesource.com/321607):
  _Assignee_ feature is completely removed from the Gerrit UI

  The Attention Set feature has been launched in Gerrit v3.3, and assignee
  has been turned off by default for three releases. The feature is now completely
  removed and cannot be enabled anymore by config.

* [Project Owners implicit delete reference permission has been removed](https://gerrit-review.googlesource.com/c/gerrit/+/304054).

  Before this release all Project Owners had implicit delete permission to all
  refs unless force-push was blocked for the user.
  Admins that are relying on previous behavior or wish to maintain it for their
  users can simply add the permission explicitly in All-Projects:
  ```ini
    [access "refs/*"]
      delete = Project Owners
  ```
  > **NOTE**:  If you choose to do so, blocking force-push no longer has any effect
  > on permission to delete refs by means other than git (REST, UI).

* Support for CentOS is dropped and the base image replaced by AlmaLinux

  RedHat anticipated the [EOL of CentOS to December 2021](https://blog.centos.org/2020/12/future-is-centos-stream/) making
  hard for the Gerrit community to continue to support existing Docker setups on
  CentOS.
  The default base image now uses [AlmaLinux 8](https://almalinux.org/)
  which promises to have a much longer life as open-source OS and has an easy
  [migration tool from CentOS 8](https://github.com/AlmaLinux/almalinux-deploy)
  available.

* Apache Commons Lang v2 is removed

  Gerrit moved to [Apache Commons Lang v3](https://commons.apache.org/proper/commons-lang/) replacing all legacy
  use of the older lang v2 from its dependencies. Existing plugins and scripts
  that are using Apache Commons Lang v2 must be rebuilt to use the new library
  or declare the older Apache Commons Lang v2 as an explicit dependency.

### Other changes

## Plugin changes

* [Change 331259](https://gerrit-review.googlesource.com/331259):
Deprecate the `registerStyleModule()` JS plugin API

* [Change 330403](https://gerrit-review.googlesource.com/330403):
Support validation options for branch creation to be used in
RefOperationValidationListener implemented in plugins.

* [Change 330200](https://gerrit-review.googlesource.com/330200):
Add support for specifying validation options in rebase and cherry-pick REST
endpoint and implemented in plugins.

* Upgrade to gitiles v1.0.0

## Gerrit UI changes

* [Change 324242](https://gerrit-review.googlesource.com/324242):
Add syntax highlighting for Markdown

  Reuse and enable highlight.js syntax highlighting of Markdown files.

* [Issue 15715](https://crbug.com/gerrit/15715):
Fix the editing workflow in the web app

* [Change 330301](https://gerrit-review.googlesource.com/330301):
Adding tab navigation for hovercards

* [Change 330919](https://gerrit-review.googlesource.com/330919):
Show Change actions regardless if logged in or not, because the
gr-change-actions correctly hides the actions that the current user cannot do.

* [Change 333299](https://gerrit-review.googlesource.com/333299):
Remove the front-end metric `diffViewFullyLoaded` replaced by `diffViewDiplayed`
to represent highlighting a whole file.

* [Change 330204](https://gerrit-review.googlesource.com/330204):
Adds changes and dashboard link to account hovercard.

* [Change 330084](https://gerrit-review.googlesource.com/330084):
__Status__ field renamed to __About me__ and no icon is shown.

## Documentation changes

* [Change 331879](https://gerrit-review.googlesource.com/331879):
Fixed links in the [Plugin Lifecycle doc](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.0/dev-plugins-lifecycle.html)
and improved its discoverability

## End-to-End tests changes

New test properties are available in the [End-to-End](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.0/dev-e2e-tests.html#_environment_properties)
tests:

- com.google.gerrit.scenarios.project_prefix
- com.google.gerrit.scenarios.context_path
- com.google.gerrit.scenarios.replica_hostname
- com.google.gerrit.scenarios.username

## JGit changes

* Update jgit to v6.1.0.202203080745-r

  release notes:
  [6.0](https://projects.eclipse.org/projects/technology.jgit/releases/6.0.0)
  [6.1](https://projects.eclipse.org/projects/technology.jgit/releases/6.1.0)

  most important changes since 5.13:
  - [push] support the "matching" RefSpecs ":" and "+:"
  - IndexDiff: use tree filter also for SubmoduleWalk
  - Describe: add support for core.abbrev config option
  - PersonIdent: Add ctors that accept Instant in addition to Date
  - Cap describe abbrev option, minimum is 4, maximum is length of a full ObjectId
  - DescribeCommand: Add support for --abbrev=0
  - DescribeCommand: Support configuring the hash abbreviation
  - PushCommand: determine remote from git config if not given
  - PushCommand: consider push.default when no RefSpecs are given
  - Support for git config push.default
  - Support for "lfs.url" from ".lfsconfig"
  - Support LFS Server URL without .git suffix
  - [rebase] Enable users to have a Change-ID be generated when squashing or rewording commits.
  - RepoCommand: Add API to set extra files in the destination repository
  - RebaseCommand: better commit message rewording. Respect git config commit.cleanup for rewording.
  - CommitCommand: implement git commit --cleanup.
  - Provide git config commit.cleanup
  - sshd: support the ConnectTimeout ssh config
  - sshd: Skip unknown keys from the SSH agent
  - sshd: support the AddKeysToAgent ssh config
  - sshd: handle "IdentityAgent SSH_AUTH_SOCK" in ssh config
  - sshd: Connector for the Win32-OpenSSH SSH agent
  - sshd: handle IdentitiesOnly with an SSH agent
  - shd: support IdentityAgent config
  - Add config reader for user-defined difftools
  - Add command line support for "git difftool"
  - Transport: load all refs only if push refspecs have wildcards
  - UploadPack v2 protocol: Stop negotiation for orphan refs
  - PackBitmapIndexV1: support parallel loading of reverse index
  - RefDirectory.scanRef: Re-use file existence check done in snapshot creation
  - FileSnapshot: Lazy load file store attributes cache
  - Support commit.template git config option
  - ssh: Handle "ProxyJump none" from SSH config file
  - OpenSshConfigFile: update handling of line comments and quoted strings following changes in OpenSSH
  - OpenSshConfigFile: update token replacements. It appears that the OpenSSH documentation has changed; it now allows more flags for a number of keys.
  - [sshd agent] Introduce ConnectorDescriptor
  - sshd: add support for ssh-agent
  - Binary and CR-LF detection: conclude file is binary if it contains a lone CR like C git
  - Make the buffer size for text/binary detection configurable
  - GarbageCollectCommand: add numberOfBitmaps to statistics
  - Don't block in GC#gc until garbage collection finished
  - Let ObjectDatabase implement AutoClosable
  - Optimize RevWalk.getMergedInto() to improve performance
  - improve how git system config is found
  - Bump minimum required Java version to 11
  - [checkout] Use .gitattributes from the commit to be checked out
  - [push] Call the pre-push hook later in the push process
  - Prevent that an instance of PushCommand is reused
  - Stop initCause throwing in readAdvertisedRefs
  - Make sure to close Repository in tests
  - Fix resource leak in CancellableDigestOutputStreamTest
  - RebaseCommand: fix commit message in "fixup" case
  - BinaryHunkInputStream: accept CR-LF
  - Merge conflict messages: prefix conflict lines with a hash
  - ObjectWalk: close ObjectReader on close() if needed
  - LFS: Fix error occurring during delete branch
  - sshd: backport upstream fix for SSHD-1231
  - Use FileSnapshot without using configs for FileBasedConfig
  - TreeRevFilter: fix wrong stop when the given path disappears
  - storage: file: De-duplicate File.exists()+File.isFile()
  - Fix checkout of files with mixed line endings on text=auto eol=crlf
  - Fix missing peel-part in lsRefsV2 for loose annotated tags
  - Fix RevWalk.getMergedInto() ignoring annotated tags
  - Reftable: close old Db in FileRepository#convertToPackedRefs
  - Reftable: Reload the stack _before_ trying to delete the files. This ensures we don't trip over our own open file handles when deleting compacted tables.
  - Reftable: drop code for truncated reads
  - Reftable: pass on invalid object ID in conversion

## Other dependency changes

* Update sshd to 2.8.0

  The highlights of SSHD update from Gerrit's perspective are:

  - [SSHD-1216](https://issues.apache.org/jira/browse/SSHD-1216):
  Server-side implementation of the RFC 8332 server-sig-algs
  extension: the server announces that it prefers the SHA-2 signatures
  for RSA keys.

  - [SSHD-1197](https://issues.apache.org/jira/browse/SSHD-1197):
  A race condition in key exchange fixed.

  - [SSHD-1163](https://issues.apache.org/jira/browse/SSHD-1163):
  DH group exchange got a fix relating to RSA SHA-2 signatures.

  Additionally, sshd 2.8.0 now supports (and prefers) the
  chacha20-poly1305@openssh.com cipher [SSHD-1017](https://issues.apache.org/jira/browse/SSHD-1017),
  and supports the curve25519 and curve448 KEX algorithms [SSHD-704](https://issues.apache.org/jira/browse/SSHD-704).

* Update codemirror-minified to 5.65.0

* Update highlight.js to 11.5.0

* Update rules_nodejs version to 5.1.0

* Update rules_go version to 0.30

* Update protobuf version to 3.19.4

## Other core changes

* [Change 334747](https://gerrit-review.googlesource.com/334747):
Fixed missing return type in e2e-tests

* [Change 334557](https://gerrit-review.googlesource.com/334557):
Make the computing of the diff cache thread-safe.

  The computation previously failed with a zlib exception that was logged as if
  the  packfile was corrupt even though it wasn't.

* [Change 333706](https://gerrit-review.googlesource.com/333706):
Added support for 'is:<VALUE>' in approval copy condition queries to make arbitrary voting values sticky

* [Change 332139](https://gerrit-review.googlesource.com/332139):
Stop adding project-owners to `To:` of the emails for new changes.

## Bugfix releases

### 3.6.8

* Breaking Changes

  * [Change 383334](https://gerrit-review.googlesource.com/c/gerrit/+/387435):
  `refreshAfterWrite` and `maxAge` settings in gerrit config are now honored for both persistent and in-memory caches.

    Previously these settings were erroneously ignored for persistent caches.
    If you rely on them for persistent caches you should be aware they will be
    honoured now.

* New Features

  * [Change 377699](https://gerrit-review.googlesource.com/c/gerrit/+/377699):
  Allow generating safe local-only documentation, without reference to external fonts in CSS

  * [Change 390658](https://gerrit-review.googlesource.com/c/gerrit/+/390658):
  Allow disable Prolog rules evaluation on closed changes

  * [Change 390614](https://gerrit-review.googlesource.com/c/gerrit/+/390614):
  Allow uploading changes to group refs except changes to group files

  * [Change 389055](https://gerrit-review.googlesource.com/c/gerrit/+/389055):
  Allow operator aliases to be used in submit requirement expressions

  * [Change 386974](https://gerrit-review.googlesource.com/c/gerrit/+/386974):
  SSH set-reviewers cmd now handles lock failures with retries

* Performance Fixes

  * [Change 376094](https://gerrit-review.googlesource.com/c/gerrit/+/376094):
  Introduce new cache `changes_by_project` to speedup git ref advertisements on replica and git-receive-pack on primary

  * [Change 377814](https://gerrit-review.googlesource.com/c/gerrit/+/377814):
  Skip building bloom filters by default speeding up offline reindex

* Security Fixes

  * [Change 389374](https://gerrit-review.googlesource.com/c/gerrit/+/389374):
  Update Jetty to 9.4.53.v20231009 with critical security fixes [CVE-2023-36478](https://nvd.nist.gov/vuln/detail/CVE-2023-36478) and [CVE-2023-44487](https://nvd.nist.gov/vuln/detail/CVE-2023-44487)

* Bug Fixes

  * [Issue 40014568](https://issues.gerritcodereview.com/issues/40014568):
  Fix ref-updated stream events consistency for change edits

  * [Issue 304335624](https://issues.gerritcodereview.com/issues/304335624):
  Fix the changing preferred email resulting in duplicate emails set in cache

  * [Change 388054](https://gerrit-review.googlesource.com/c/gerrit/+/388054):
  Eliminated startup warning for plugins whose SshModule only provides Ssh\*CommandInterceptors

  * [Change 387217](https://gerrit-review.googlesource.com/c/gerrit/+/387217):
  Fixed case where an exception in change visibility checking could break visibility of all refs in that repo

  * [Change 387055](https://gerrit-review.googlesource.com/c/gerrit/+/387055):
  Fix SSH set-topic cmd to consider 'editTopicName' permission

  * [Issue 291102119](https://issues.gerritcodereview.com/issues/291102119)
  Avoid NullPointerException when deleting a single ref

  * [Change 387216](https://gerrit-review.googlesource.com/c/gerrit/+/387216):
  Fixed potential OOM due to SubmitRuleEvaluator creating new metrics whenever an instance was created

  * [Change 387214](https://gerrit-review.googlesource.com/c/gerrit/+/387214):
  Fixed potential OOM due to DefaultRefFilter creating new metrics whenever an instance was created

  * [Change 386976](https://gerrit-review.googlesource.com/c/gerrit/+/386976):
  Fixed potential OOM due to \*QueryProcessor classes creating new metrics whenever an instance was provided

  * [Issue 300976121](https://issues.gerritcodereview.com/issues/300976121):
  Fix NPE when `auth.httpDisplaynameHeader` is configured but header is unset

  * [Change 387054](https://gerrit-review.googlesource.com/c/gerrit/+/387054):
  Fix `force topic edit` permission to consider change owner rule

  * [Change 386994](https://gerrit-review.googlesource.com/c/gerrit/+/386994):
  Fixed InactiveAccountDisconnector NPE due to race condition

  * [Issue 295457464](https://issues.gerritcodereview.com/issues/295457464):
  Fixed SSH query not returning copied approvals on per patchset level

* Documentation Fixes

  * [Change 391858](https://gerrit-review.googlesource.com/c/gerrit/+/391858):
  Document `ChecksApi.updateResult()` in PolyGerrit plugins checks API

  * [Change 391696](https://gerrit-review.googlesource.com/c/gerrit/+/391696):
  Document `check-result-expanded` plugin endpoint in PolyGerrit plugins checks API

  * [Change 388936](https://gerrit-review.googlesource.com/c/gerrit/+/388936):
  Explain in ls-projects SSH API when the "parent" field is "?-N"

  * [Change 388530](https://gerrit-review.googlesource.com/c/gerrit/+/388530):
  Explain in /projects/ REST API when the "parent" field is "?-N"

* Replication Plugin Updates

  * [Change 384754](https://gerrit-review.googlesource.com/c/plugins/replication/+/384754):
  Avoid opportunity to inadvertently block the distributor

  * [Change 383694](https://gerrit-review.googlesource.com/c/plugins/replication/+/383694):
  Reduced log level for Task deletion errors in MP setups

* Dependency Updates

  * Update jgit to 82e277c813398c9f519f16e83d080a94fa29a27c

* Native Packaging

  * [Issue 311414905](https://issues.gerritcodereview.com/issues/311414905):
  Add trailing slash in default `canonicalWebUrl` in Docker containers

### 3.6.7

* New Features

  * [Change 385116](https://gerrit-review.googlesource.com/c/gerrit/+/385116):
  Support Cloud Spanner for AccountPatchReviewStore

* Bug Fixes

  * [Change 385557](https://gerrit-review.googlesource.com/c/gerrit/+/385557):
  Remove warning on persisted_projects cache on multi-servers setups

    The implementation of the key for persisted_project includes the
    project version, therefore it is safe when used in a multi-servers
    scenarios (HA, multi-site).

  * [Change 380154](https://gerrit-review.googlesource.com/c/gerrit/+/380154):
  Documentation: NOTE on use of sshkeys, and \*projects cache on clusters

    When using the sshkeys, and \*projects caches on a cluster, warn
    the Gerrit admin he should be aware of those caches to be potentially
    stale. The problem can be minimised by either disabling them
    altogether or setting a low value of refreshAfterWrite.

  * [Change 384214](https://gerrit-review.googlesource.com/c/gerrit/+/384214):
  Align Jetty session timeout with Gerrit web_sessions maxAge

    Do not leave Jetty having sessions kept forever but expire
    them with the same timeout of Gerrit sessions.

    Verified E2E that the Jetty sessions expires with the same
    timeout of the web_sessions maxAge value.

  * [Issue 290225204](https://issues.gerritcodereview.com/issues/290225204):
  loginUrl and loginText are hardcoded in the UI

    Gerrit UI ignored the settings in the auth section of the
    configuration [1].

    In particular auth.loginUrl [2] should be used if present and
    auth.type is set to HTTP or HTTP_LDAP.
    Also auth.loginText [3] should be used if auth.loginUrl is set.

    This change backports change 381534 to stable-3.6. We didn't cherry-pick because the code changes significantly and had many conflicts.

    [1]: https://gerrit-review.googlesource.com/Documentation/config-gerrit.html#auth
    [2]: https://gerrit-review.googlesource.com/Documentation/config-gerrit.html#auth.loginUrl
    [3]: https://gerrit-review.googlesource.com/Documentation/config-gerrit.html#auth.loginText

  * [Issue 291102119](https://issues.gerritcodereview.com/issues/291102119):
  Avoid NullPointerException when deleting multiple tags

    To avoid NPE make sure that ref is not read again after checking if
    ref exists. This prevent the issue when other call already removed
    the tag and we try to read it. Proper behaviour is to try to delete it
    and return `Cannot delete refs/tags/...: LOCK_FAILURE` if tag is already
    deleted.

  * [Issue 289505276](https://issues.gerritcodereview.com/issues/289505276):
  Fix for: change can't be submitted if another branch contains exactly the same commit.

  * [Change 380694](https://gerrit-review.googlesource.com/c/gerrit/+/380694):
  Hide Move Change from UI if change.move is set to false

  * [Issue 290641654](https://issues.gerritcodereview.com/issues/290641654):
  Fix bug in API '/projects/*/access:review' ignoring 'message' field

    Fix API endpoint 'CreateAccessChange' '/projects/*/access:review'
    not hounouring 'message' field provided via 'ProjectAccessInput' object despite setting it.
    Add condition to check if message is provided then use it instead of default 'Review access change'

* Plugin Updates

  * [Change 383360](https://gerrit-review.googlesource.com/c/gerrit/+/383360):
  Update webhooks plugin to 1dc0a71883

    This includes the following changes:
    1dc0a71 Add HTTP response code 'SC_ACCEPTED' (202) as success case in response handler
    16110f3 Annotate methods that return a definitely null value with @Nullable
    and fixes:
    [Issue 40015349](https://issues.gerritcodereview.com/issues/40015349) "plugins/webhooks doesn't accept HTTP 202 response code"


### 3.6.6

* Breaking changes

  * [Issue 40015585](https://issues.gerritcodereview.com/issues/40015585):
  Enhance metric name sanitize function to remove collision on '_' between metrics.

    Collision between the sanitized metric names can be easily
    created e.g. `foo_bar` will collide with `foo+bar`. In order
    to avoid collisions keep the rules about slashes and replace not
    supported chars with `_0x[HEX CODE]_` string. The replacement prefix
    `0x` is prepended with another replacement prefix.

* New Features

  * [Issue 287484350](https://issues.gerritcodereview.com/issues/287484350):
  Extend configurability of index pagination type

    Add NONE option to disable index backend pagination, this option
    needs to be honoured by the indexing backend and this change introduces
    the correct implementation for Lucene.

* Bug Fixes

  * [Issue 40014502](https://issues.gerritcodereview.com/issues/40014502):
  Fix JdkObsolete issues with Date caused by JGit's PersonIdent class not supporting Instant

    Gerrit has quite a lot of usages of JGit's PersonIdent class. PersonIdent
    currently doesn't support Instant, but requires a java.util.Date as input.
    This fix updates PersonIdent in JGit to support Instants (offer constructors
    that accept Instant + add a getter that returns Instant), Upgrade JGit in Gerrit,
    Fix Gerrit's usages of PersonIdent to use the new constructors and getters.

  * [Change 376334](https://gerrit-review.googlesource.com/c/gerrit/+/376334):
  Fix ExternalId differential loading when cache is inconsistent

    JGit may return a failure to update a repository, even if it actually
    succeeded. This can create an issue when loading externalIds, since
    we would retry to insert the same value into the cache twice,
    due to the retry performed by the client, leading the cache
    loader to consistently blow up.

  * [Change 347316](https://gerrit-review.googlesource.com/c/gerrit/+/347316):
  Fix Bazel build on Apple M2 ARM64 chip

    Bazel fails to select the correct java-tools binaries for Apple's ARM64
    chip and download the generic x86. This fix disable the download
    of the pre-compiled java_tools, allowing Bazel to build them
    locally using the correct architecture.

  * [Change 373186](https://gerrit-review.googlesource.com/c/gerrit/+/373186):
  Turn on JavaUtilDate bug pattern and fix related issues

    Upcoming Bazel release 5.0 includes recent error prone release that
    flags JavaUtilDate bug pattern. Demote the severity to warning to not
    block Bazel upgrade and promote it to error severity again, when all
    places were adapted.

  * [Change 357634](https://gerrit-review.googlesource.com/c/gerrit/+/357634):
  Fix parsing legacy labels for users with comma

    This change fixes a bug introduced by [336883](https://gerrit-review.googlesource.com/c/gerrit/+/336883)
    when parsing labels where a UUID was present together with a user name containing a comma.

  * [Issue 289321387](https://issues.gerritcodereview.com/issues/289321387):
  Preserve refs order in the GitBatchRefUpdateEvent event

    [Change 335758](https://gerrit-review.googlesource.com/c/gerrit/+/335758)
    introduced the concept of the single event representing batch ref update.
    However this new event did not preserve original order of the updated refs.
    This impacts event consumers behaviour and can cause failures. For example
    if meta ref is processed before patchset ref indexing operation will
    fail because of the missing patchset.

    The timeline of events is kept in the same order they are generated,
    to make sure that refs order is preserved and backward compatibility
    is kept.

* Documentation fixes

  * [Issue 40014489](https://issues.gerritcodereview.com/issues/40014489):
  Announce / document that building with Java 8 is no longer supported

    Documents that building with Java 8 is no longer supported.
    Java 11 is now required and remove now unused error_prone_warnings_toolchain.


### 3.6.5

* New Features

  * [Change 364591](https://gerrit-review.googlesource.com/c/gerrit/+/364591)
  Allow to hide download schemes from the UI

    Allow hiding a download scheme in the UI by still allowing to use it.

* Bug Fixes

  * [Change 362914](https://gerrit-review.googlesource.com/c/gerrit/+/362914)
  Fix internal server error caused by double flush in BaseCommand.TaskThunk

    Ignore `SshChannelClosedException` when flushing the task's output and error
    streams. JGit commands like `UploadPack` flush these streams already. When
    `TaskThunk` tries to flush them again `SshChannelClosedException` is thrown
    and leads to an internal server error.

  * [Change 364478](https://gerrit-review.googlesource.com/c/gerrit/+/364478):
  AndSource: Run `isVisibleToPredicate` based on its cost

    `isVisible` check can be expensive and always running it ahead of other
    cheaper predicates can increase the query time. Update `AndSource` to treat
    `isVisibleToPredicate` like any other predicate so that it runs based on its
    estimated cost.

  * [Issue 16819](https://crbug.com/gerrit/16819):
  Enable LDAP "Remember me" in login form per default

    When users are presented with the LDAP login page, the "Remember me" checkbox
    is disabled by default.  This might be a problem because, if the user doesn't
    explicitly click the checkbox, the session will be tied to the browser
    session.

  * [Issue 16814](https://crbug.com/gerrit/16814):
  Improve `Rebase-SubmitStrategy` performance in some cases

    Set uninteresting branches based on project configuration:
    `create_new_change_for_all_not_in_target`.

  * [Change 369415](https://gerrit-review.googlesource.com/c/gerrit/+/369415):
  Fix metric computation with file paths in metric name.

    Don't fail metric computation due to duplicated metric names.

  * [Change 370354](https://gerrit-review.googlesource.com/c/gerrit/+/370354):
  Improved performance of queries when backend index returns more results than needed

    Matching changes more than the limit is just extra work that is discarded at
    the end when the results are trimmed to match the limit. This can help improve
    performance of queries where a small percentage of changes are filtered in the
    initial page and the remaining results are obtained from the next page.

  * [Change 357834](https://gerrit-review.googlesource.com/c/gerrit/+/357834):
  Improved performance for plugin-provided SSH commands that perform multiple
  permission checks or ref lookups for the same project

    Move creation of `PerThreadCache` to `SshCommand` so that the cache is available
    to most commands, including plugins.

  * [Change 360221](https://gerrit-review.googlesource.com/c/gerrit/+/360221):
  Add metric for memory allocated by all threads

    Introduce [proc/jvm/memory/allocated](https://gerrit-review.googlesource.com/Documentation/metrics.html#_process)
    which can be used to monitor total memory allocation rate causing work for the Java gc.

  * [Change 361434](https://gerrit-review.googlesource.com/c/gerrit/+/361434):
  Mark `LabelType.Builder#setFunction` as deprecated

    Align the code with the
    [documentation](https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.3/config-labels.html#label_function).

  * [Issue 16823](https://crbug.com/gerrit/16823):
  Fix the search by query in the project filter

    Fix regression introduced in [Change 337994](https://gerrit-review.googlesource.com/c/gerrit/+/337994),
    in context of [Issue 15134](https://crbug.com/gerrit/15134).

* Download-commands plugin fixes

  * [Issue 15944](https://crbug.com/gerrit/15944):
  scp command for retrieving commit-sh hook fails with OpenSSH 9.0

    Http should always be available from primary servers and using scp is getting
    complicated since the implementation of scp varies between different OpenSSH
    versions.

* Dependency Updates

  * Update jgit to 5ae8d28faaf6168921f673c89a4e6d601ffad78d.

  * [JGit Bug 565854](https://bugs.eclipse.org/bugs/show_bug.cgi?id=565854)
  `SshdSession`: close channel gracefully

    Close the channel gracefully to give the server a chance to clean up properly on
    its side.

  * Update bouncycastle to 1.72.

  * Update commons-compress to 1.22.

### 3.6.4

* New features

  * [Issue 16565](https://crbug.com/gerrit/16565):
  Introduce cache.threads option to allow custom executors for Caffeine caches.

    The introduction of `cache.threads` in `gerrit.config` allows to configure
    a separate thread pool which can be tuned and decoupled from the
    rest of the JVM common threads.

  * [Change 353177](https://gerrit-review.googlesource.com/c/gerrit/+/353177):
  Add tsconfig-plugins-base.json to Gerrit TypeScript Plugin API.

    Adds `tsconfig-plugins-base.json` to the npm package so downstream plugins
    can easily use the same set of TypeScript settings.

  * [Issue 16445](https://crbug.com/gerrit/16445):
  Add slice number to the change indexing task description.

    To indicate to the administrator each task is indeed doing something
    different, add the slice number if there is more than one slice in
    total.

  * [Change 356215](https://gerrit-review.googlesource.com/c/gerrit/+/356215):
  Support `init --reindex-threads=-1` to skip reindexing after init.

    Admins may wish to run other commands after `init` and before `reindex`, but
    previously would have needed to observe and interrupt the `init` command
    process once it started reindexing in order to do so. Providing an option to
    `init` that skips the reindexing phase simplifies that workflow and makes it
    less error prone.

  * [Change 356234](https://gerrit-review.googlesource.com/c/gerrit/+/356234):
  Add CUDA syntax highlighting.

  * [Change 352534](https://gerrit-review.googlesource.com/352534):
  Introduce `--show-cache-stats` for printing cache stats during `init` and `reindex`,
  disabled by default.

* Bug Fixes

  * [Change 351674](https://gerrit-review.googlesource.com/c/gerrit/+/351674):
  SSH review cmd handles lock failures with retries.

    Retrying on lock failures helps mitigating lock failures when there is
    contention to lock the notedb ref. Retries were already implemented
    in REST API code path at a high enough layer so that it applies for all
    REST APIs.

  * [Change 353594](https://gerrit-review.googlesource.com/c/gerrit/+/353594):
  Inserting new patch-sets is retried on lock failures.

    Mitigates failures when creating new patch-sets fails if the notedb
    ref is locked for another update on the change.

  * [Issue 14686](https://crbug.com/gerrit/14686), [Issue 14779](https://crbug.com/gerrit/14779), [Issue 16030](https://crbug.com/gerrit/16030):

    In [Change 293978](https://gerrit-review.googlesource.com/c/gerrit/+/293978), eTag was
    removed from GetRevisionActions, but not RevisionResource. This resulted
    in the UI to show a stale 'submit' action on the change in the same
    submission chain. The UI now uses RevisionResource eTag, that does not include
    MergeSuperSet (all related changes).

  * [Issue 16409](https://crbug.com/gerrit/16409):
  Report pack protocol errors to the client via smart-HTTP.

    A regression introduced by [JGit Change 1926771](https://git.eclipse.org/r/c/jgit/jgit/+/192677),
    caused pack protocol errors to be reported as 500 Server errors.
    Such situations should be reported to the user as a 200 OK containing the
    details of the failed operation.

  * [Change 351759](https://gerrit-review.googlesource.com/351759):
  Fix `contrib/find-duplicate-usernames.sh` output when usernames contain spaces.

  * [Issue 16449](https://crbug.com/gerrit/16449):
  Fix project root computation in Gitweb servlet.

  * [Change 356715](https://gerrit-review.googlesource.com/356715):
  Fixed bug with negated label for queries with external groups.

  * [Change 359176](https://gerrit-review.googlesource.com/359176):
  Fix LabelPredicate group matching for included external groups.

  * [Change 357874](https://gerrit-review.googlesource.com/357874):
  Fixed ownerin/uploaderin for internal groups that include external groups.

  * [Change 355054](https://gerrit-review.googlesource.com/355054):
  Wrap #mobileSearch in a div.

    Fixes an issue on wikimedia where the search button was hidden
    even though the rules executed to make it show.

  * [Issue 16433](https://crbug.com/gerrit/16433):
  Fix 404 page shown after login using OpenID

* Dependency Updates

  * Update jgit to a1901305b26ed5e0116f138bc02837713d2cf5c3.

    Update from stable-6.1 to stable-6.5:

    * Notable enhancements and fixes from [6.2.0](https://projects.eclipse.org/projects/technology.jgit/releases/6.2.0) are:

       * [4dd9a94e](https://git.eclipse.org/r/c/jgit/jgit/+/192433): Better feedback on SSH authentication failure

       * [7b1c8cf14](https://git.eclipse.org/r/c/jgit/jgit/+/191924): Retry reading a file when there are concurrent writes

       * [fed1a5493](https://git.eclipse.org/r/c/jgit/jgit/+/197714): Refresh 'objects' dir and retry if a loose object is not found
         (Fixes cases where a new loose object is not immediately visible on a NFS
         client if it was created on another client)

       * [011c26ff3](https://git.eclipse.org/r/c/jgit/jgit/+/193939): Fix connection leak for smart http connections

       * [ac127a793](https://git.eclipse.org/r/c/jgit/jgit/+/196849): Do not handle internal git errors as an HTTP error

    * Notable enhancements and fixes from [6.3.0](https://projects.eclipse.org/projects/technology.jgit/releases/6.3.0) are:

       * [1a364c49e](https://git.eclipse.org/r/c/jgit/jgit/+/194200): JGit blame very slow for large merge commits that rename files

       * [66ace4b9](https://git.eclipse.org/r/c/jgit/jgit/+/193496): Do not check reachability of visible SHA1s in git-upload-pack

       * [035e0e23](https://git.eclipse.org/r/c/jgit/jgit/+/194500): Do not prematurely terminate timer in case of error during git-upload-pack

    * Notable enhancements and fixes from [6.4.0](https://projects.eclipse.org/projects/technology.jgit/releases/6.4.0) are:

       * [fe9aeb02e6](https://git.eclipse.org/r/c/jgit/jgit/+/196497), [93097f0018](https://git.eclipse.org/r/c/jgit/jgit/+/196323): Receive and parse client [git session-id](https://git-scm.com/docs/gitprotocol-capabilities#_session_idsession_id)

       * [59029aec3](https://git.eclipse.org/r/c/jgit/jgit/+/196905): Add option to allow using JDK's SHA1 implementation

       * [3e7281662](https://git.eclipse.org/r/c/jgit/jgit/+/197151): UploadPackServlet#doPost use try-with-resource to ensure
         UploadPack is closed

       * [1e04046a6](https://git.eclipse.org/r/c/jgit/jgit/+/194411): Fix crashes on rare combination of file names
       (This issue has been seen during offline reindex of changes with specific merge commits)

  * Update sshd to 2.9.2

    * [CVE-2022-45047](https://nvd.nist.gov/vuln/detail/CVE-2022-45047): Avoid using Java deserialization to load a serialized java.security.PrivateKey

    * [SSHD-1302](https://issues.apache.org/jira/browse/SSHD-1302): Reading again from exhausted ChannelExec#getInvertedOut() throws IOException instead of returning -1

    * [SSHD-966](https://issues.apache.org/jira/browse/SSHD-966): Deadlock on disconnection at the end of key-exchange

    * [SSHD-1231](https://issues.apache.org/jira/browse/SSHD-1231): Public key authentication: wrong signature algorithm used (ed25519 key with ssh-rsa signature)

    * [SSHD-1257](https://issues.apache.org/jira/browse/SSHD-1257): Shell is not getting closed if the command has already closed the OutputStream it is using.

    * [SSHD-1261](https://issues.apache.org/jira/browse/SSHD-1261): Sometimes async write listener is not called

    * [SSHD-1290](https://issues.apache.org/jira/browse/SSHD-1290): Race condition is logged in ChannelAsyncOutputStream

  * Update mina-core to 2.0.23

  * Update reviewnotes to 10db2cf772989d031c6f3558010c51fe07cf9722

* Documentation fixes

  * [Change 353177](https://gerrit-review.googlesource.com/353177):
  Document Gerrit TypeScript Plugin API @gerritcodereview/typescript-api in pg-plugin-dev.

### 3.6.3

* New features

  * [Issue 16322](https://crbug.com/gerrit/16322):
  Limit the number of changes that can be submitted together

    When chaining changes together, the sequence of commits to navigate
    was previously unbound, causing the potential operations explosion.
    The explosion could have also been accidental and caused by the push
    of a change with a non-existent branch, which would have resulted
    in the full scan of the repository for changes.
    Introduce a new Gerrit configuration `change.maxSubmittableAtOnce` with
    a safe default of `1024`, which would allow any use case that would have
    also worked before this change.

  * [Change 347496](https://gerrit-review.googlesource.com/c/gerrit/+/347496):
  Enable project_list cache warmer when `cache.project_list.maxAge` is set

  * [Change 341454](https://gerrit-review.googlesource.com/c/gerrit/+/341454):
  GitwebServlet: Retrieve git path from FileRepository so that it can be used
  with multi-site and cached-refdb modules

* Native packaging

  * GerritForge RPM repository updated for arm64 architecture

    [GerritForge RPM v1.4](https://gerritforge.com/gerritforge-repo-1-4.noarch.rpm)
    has been released, including the native packages for arm64 architecutre.

  * DockerHub images for arm64 architecture

    [DockerHub Gerrit images](https://hub.docker.com/r/gerritcodereview/gerrit/tags?page=1&name=3.6.3)
    include images for arm64 architecture.

* Performance Fixes

  * [Change 350577](https://gerrit-review.googlesource.com/c/gerrit/+/350577)
  copy-approvals: use multiple threads for copy-approvals, improve performance

    Split the work into slices of changes and then utilize one thread per slice.
    Also skip unnecessary reindexing. On a large Gerrit site with 1.3 million
    changes, this reduced the time for copy-approvals from 5 hours to 15-20
    minutes.

  * [Change 350236](https://gerrit-review.googlesource.com/c/gerrit/+/350236)
  Optimized change visibilty checking when the project is hidden

    Looping over every change when the whole project isn't readable is a
    waste of CPU. It's a bigger waste to fetch all the change data in the
    first place.

  * [Issue 16379](https://crbug.com/gerrit/16379):
  Remove key locking for disabled caches

    This change also makes the memoryLimit behaviour consistent with the
    diskLimit set to zero means disabling the implementation of the cache.

  * [Change 349895](https://gerrit-review.googlesource.com/c/gerrit/+/349895):
  Add AndCardinalPredicate and OrCardinalPredicate

    Before this change, IndexSource derived cardinality from predicate
    which implement `HasCardinality`. Since `AndPredicate` and `OrPredicate`
    does not return cardinality, IndexSource defaults to 10 when query
    comprises more than one predicate. Due to this behavior, `AndSource`
    chooses IndexSource almost always when query contains more than one
    index predicate.
    This helps `AndSource` to choose the right source more often.

  * [Change 347956](https://gerrit-review.googlesource.com/c/gerrit/+/347956):
  Introduce possibility to define the cardinality so that `AndSource` predicate
  can work more efficiently

    Before this change, cardinality of the IndexSource was always set to
    10. This makes `AndSource` to choose IndexSource over other sources most of
    the time.
    Add a `HasCardinality` interface which can be used by all the predicates
    which implement IndexPredicate to set a cardinality. This helps
    AndSource to choose the right datasource.

  * [Change 349355](https://gerrit-review.googlesource.com/c/gerrit/+/349355):
  Cache repository locations in LocalDiskRepositoryManager

    Obtaining the actual location of a repository using base-path
    and project name can be slow as it involves some guessing to
    locate the repository. Cache the locations once they are
    obtained to avoid repeated work, thereby improving performance
    when opening repositories.

  * [Change 347955](https://gerrit-review.googlesource.com/c/gerrit/+/347955):
  Consider cardinality while choosing the data source for `AndSource` predicate

    Before this change, `AndSource` considered cost to choose a datasource.
    Ideally cost should be used to determine which predicate to run
    `#match()` against first, so that queries are faster. Cardinality should
    be used to determine which datasource to be picked so that there are
    fewer changes to process.
    Consider cardinality of the datasource to choose the source and use
    cost when cardinality is same.

* Bug Fixes

  * [Change 350576](https://gerrit-review.googlesource.com/350576)
  copy-approvals: continue when there are corrupt meta-refs in a project

    If there was a corrupt meta-ref in a project, the copy-approvals
    failed for all changes in that project. Mitigates [Issue 16326].

  * [Change 350575](https://gerrit-review.googlesource.com/350575)
  copy-approvals: don't stop when it fails on one project

    When copying of approvals failed in one project it skipped copying of
    approvals for other projects where it would potentially finish
    successfully.

  * [Change 350414](https://gerrit-review.googlesource.com/c/gerrit/+/350414)
  Fix index rewriter to rewrite all Or/AndPredicates.
  AndSource chooses right source more often

  * [Change 349314](https://gerrit-review.googlesource.com/349314)
    Fix reindex with label copyCondition containing group.

  * [Change 77495](https://gerrit-review.googlesource.com/c/gerrit/+/347495):
    Fix for IllegalStateException during the Gerrit start when
    `cache.projects.refreshAfterWrite` is set to true and prolog rules are used

  * [Change 350014](https://gerrit-review.googlesource.com/c/gerrit/+/350014):
  Do not set cherryPickOf on RevertSubmission

    The RevertSubmission internally uses CherryPickChange operation.  It
    creates the 'normal' revert for the first change in the relation chain,
    for each subsequent change it creates a revert commit that is then
    cherry-picked. This cherry-pick is not a cherry-pick of the reverted
    change. This is a cherry-pick of the revert commit of the original
    change.
    This change fixes the bug in the logic that sets cherryPickOf to the
    original (reverted) change, using the CherryPickChange operation.

  * [Change 349894](https://gerrit-review.googlesource.com/c/gerrit/+/349894):
  Don't always rewrite And/OrPredicate to And/OrSource

    Before this change OrPredicate was always rewritten to OrSource. This
    is not the right thing to do as `OrSource#read()` will eventually fail
    when there is at least one non-datasource child. Since
    [Change 347955](https://gerrit-review.googlesource.com/c/gerrit/+/347955),
    `AndSource` picks a source which has the lowest cardinality
    which makes the `OrSource#read()` failures more visible.
    Rewrite `OrPredicate` to `OrSource` only when all the children in the
    predicate are DataSources.

  * [Change 348715](https://gerrit-review.googlesource.com/c/gerrit/+/348715);
  Clarify that a restart is needed before changes to email templates take
  effect

  * [Issue 16182](https://crbug.com/gerrit/16182):
  Reintroduce the Change-Id footer in change screen

    This change reintroduce the Change-Id footer below the commit message on
    the Gerrit UI.

  * [Issue 10168](https://crbug.com/gerrit/10168):
  Fix HTTP 404 when browsing tags on Gitweb

    The Gitweb links to tags have been broken in v2.14.10 onwards.
    Gitweb supports the 'a=tags' rendering action for annotated tags
    only, returning 404 for all lightweight tags.
    Use the generic 'a=shortlog' for Gitweb links to tags which would
    work for both annotated and lightweight ones.

  * [Change 347495](https://gerrit-review.googlesource.com/c/gerrit/+/347495):
  Fix for IllegalStateException during the Gerrit start when
  `cache.projects.refreshAfterWrite` is set to true and prolog rules are used

  * [Issue 15997](https://crbug.com/gerrit/15997):
  Make DelegateRepository#delegate() method public to allow plugins/modules to
  access it

### 3.6.2

* Security Fixes

  * [Issue 16054](https://crbug.com/gerrit/16054):
  Fix confidentiality leak by users with create ref permission
  using the create branch REST-API

    Any user with create ref permission was able to gain
    access to any SHA1 or refs, including the ones that they would
    not have permission to see.

* Breaking changes

  * [Issue 15941](https://crbug.com/gerrit/15941):
  Fix SSH queries to not show commit-message unless --commit-message is provided

    This issue has existed for several years and should be considered
    breaking as users might expect commit message to be included by
    default in SSH query results.
    Obtaining the commit message is a costly operation as the commit
    data has to be loaded. So, showing it even when --commit-message
    is not provided degrades the performance of SSH queries.

  * [Change 344300](https://gerrit-review.googlesource.com/344300):
  Add missing return values in MetricMaker's `newCallbackMetric` and
  `newConstantMetric`

    When new callback and constant metrics were created the RegistrationHandle
    was not returned, making impossible to de-register them.
    The method signature is now aligned, however, all plugins, including the core ones,
    that were registering callback or constant metrics would need to be rebuilt from
    source or downloaded from the latest build on
    [Gerrit-CI](https://gerrit-ci.gerritforge.com).

* New features

  * [Change 343096](https://gerrit-review.googlesource.com/343096):
  Introduce `index.paginationType=SEARCH_AFTER` configuration for speeding up
  query pagination

  * [Change 343798](https://gerrit-review.googlesource.com/343798):
  Introduce `index.pageSizeMultiplier` configuration to paginate index
  queries with increasing size

  * [Change 344334](https://gerrit-review.googlesource.com/344334):
  Implement `no-limit` queries with multiple pages, make them usable with
  Elasticsearch

  * [Change 345017](https://gerrit-review.googlesource.com/345017):
  Add public `EventTypes.getRegisteredEvents()` for accessing all stream
  event types from plugins

  * [Change 340714](https://gerrit-review.googlesource.com/340714):
  Introduce metrics configuration for different data reservoirs

  * [Change 347496](https://gerrit-review.googlesource.com/347496):
  New configuration option to periodically warm the project_list cache

    Reduce the likelihood of the project_list cache being evicted
    by providing an option to periodically warm it up.
    When this warmer is enabled, change detail page loads are
    consistently faster.

* Performance Fixes

  * [Change 338154](https://gerrit-review.googlesource.com/338154):
  Lazy load change notes when submit by push
    Improves performance of change submit via push

  * [Change 338614](https://gerrit-review.googlesource.com/338614)
  Optimize SSH queries to avoid loading individual accounts
    This improves performance of SSH queries.

  * [Change 338474](https://gerrit-review.googlesource.com/338474):
  Allow async receive-commits to have a thread-local cache
    Improve caching when merging changes through git push

  * [Change 338574](https://gerrit-review.googlesource.com/338574):
  Cache ProjectControl instances in SSH queries
    A PerThreadCache is used to cache ProjectControl instances to
    improve SSH query performance.

  * [Change 338834](https://gerrit-review.googlesource.com/338834):
  Avoid creating an IdentifiedUser multiple times in a SSH query
    This improves performance of SSH queries.

* Bug Fixes

  * [Issue 16306](https://crbug.com/gerrit/16306):
  Fix Bazel build on Apple M2 ARM64 chip

  * [Issue 16284](https://crbug.com/gerrit/16284):
  Fix performance issues with git-upload-pack on repositories with a large number
  of changes

  * [Issue 16043](https://crbug.com/gerrit/16043):
  Fix reindexing for changes with a commit message longer than 32766 bytes

  * [Change 347474](https://gerrit-review.googlesource.com/347474):
  Fix DefaultMemoryCacheFactory to correctly set refreshAfterWrite
    Setting refreshAfterWrite in gerrit.config now works and does not mistakenly
    set expireAfterAccess

  * [Change 340635](https://gerrit-review.googlesource.com/340635):
  Fix CSS of the Contributor Agreement screen which was preventing to sign CLAs

  * [Issue 15997](https://crbug.com/gerrit/15997):
  Make delegate() method public
    git-repo-metrics plugin now works with multi-site setup

  * [Issue 16018](https://crbug.com/gerrit/16018)
  Don't try to mark files as reviewed when not logged in
    Fix marking of reviewed flag when not logged in. "Log in is required to perform that action" popup is no longer seen
    when viewing file diffs unauthenticated.

  * [Issue 16038](https://crbug.com/gerrit/16038):
  Fix "internal error" when pushing to refs/users/xx/xxxx
    Push over HTTP to refs/users/* branch now works and doesn't fail with "error: internal error" / Not Signed In

  * [Issue 16001](https://crbug.com/gerrit/16001):
  AsciiDoctor: skip attribute when looking for title
    Fix documentation search showing :linkattrs: instead of the document title

  * [Issue 15134](https://crbug.com/gerrit/15134):
  Apply the match operator to filter projects
    Next-arrow is now not hidden when searching for repositories in the Repository section

  * [Change 337474](https://gerrit-review.googlesource.com/337474):
  Use sane value for QueryProcessor's effective limit on "--no-limit"
    Fix errors seen when --no-limit query option is used with ES index backend

  * [Change 339754](https://gerrit-review.googlesource.com/339754):
  Fix gerrit review command with branch option

    The gerrit review command was not able to find the commit with branch
    option; ensure "refs/heads/" prefix is present for branch option.

  * [Issue 16106](https://crbug.com/gerrit/16106):
  Fix label operator to work with external groups, which never worked before since
  its addition in v2.10.

  * [Change 331762](https://gerrit-review.googlesource.com/331762):
  Cache permission filtering for All-Projects, allowing a faster ACL evaluation
  to any refs.

  * [Change 343694](https://gerrit-review.googlesource.com/343694):
  Improve performance of queries that check the visibility of changes wrt a non-current user

  * [Change 346254](https://gerrit-review.googlesource.com/346254):
  Fix change queries evaluation of `AND` terms  to run match on predicate whose cost is
  least

    Sort the change queries predicates in `AND` based on cost and cardinality, which
    was broken since [Change 79391](https://gerrit-review.googlesource.com/79391).

    **WARNING**: queries containing predicates with poorly defined costs or cardinalities
    could perform worse now.

* Dependency Updates

  * Update JGit to d01376106af8800017ac3c08d7c7ac1fd5ccc9ee, including the following fixes
    and improvements:

    * 011c26ff3 - Fix connection leak for smart http connections
    * d67ac798f - Remove stray files (probes or lock files) created by background threads
    * 035e0e23f - UploadPack: don't prematurely terminate timer in case of error
    * 66ace4b9a - UploadPack: do not check reachability of visible SHA1s
    * 8984e1f66 - HTTP Smart: set correct HTTP status on error

* Documentation fixes

  * [Change 340534](https://gerrit-review.googlesource.com/340534)
  Fix link to change.mergeabilityComputationBehavior in user-search.txt

  * [Change 339235](https://gerrit-review.googlesource.com/339235)
  Add copy-approvals SSH command link to the index page

  * [Change 338949](https://gerrit-review.googlesource.com/338949)
  Fix auto-generated documentation header for plugins

  * [Change 337835](https://gerrit-review.googlesource.com/337835)
  rest-api-projects: Fix documentation for #inherited-boolean-info

  * [Change 340114](https://gerrit-review.googlesource.com/340114)
  sshd config: Reference implementation sections upstream

  * [Change 339819](https://gerrit-review.googlesource.com/339819)
  Supplement key exchange supported by Apache MINA

  * [Change 339818](https://gerrit-review.googlesource.com/339818)
  Supplement 'encrypt-then-MAC' supported by Apache MINA

  * [Change 339815](https://gerrit-review.googlesource.com/339815)
  Supplement cipher algorithms in sshd.cipher section

* Other Fixes

  * [Change 337835](https://gerrit-review.googlesource.com/337835):
  rest-api-projects: Fix documentation for #inherited-boolean-info

  * [Change 340245](https://gerrit-review.googlesource.com/340245)
  Propagate auto flush value to external index module

  * [Change 340534](https://gerrit-review.googlesource.com/340534):
  Fix link to change.mergeabilityComputationBehavior in user-search.txt

### 3.6.1

* Bug Fixes

  * [Issue 15957](https://crbug.com/gerrit/15957):
  Fix loading ssh and gpg keys in Gerrit UI and make the text areas have a white background

    The Gerrit UI did not display the list of the user's SSH and GPG keys, even if they were present
    in the user's profile and working as expected.

* Other Fixes

  * [Change 337014](https://gerrit-review.googlesource.com/337014):
  Plugins named with hyphens can now define query operators
