= Release notes for Gerrit 2.0.21

Gerrit 2.0.21 is now available in the usual location:

link:https://www.gerritcodereview.com/download/index.html[https://www.gerritcodereview.com/download/index.html]


== Schema Change

*WARNING: This version contains a schema change* (since 2.0.19)

* The schema change may be difficult to undo once applied.
+
Downgrading could be very difficult once the upgrade has been
started.  Going back to 2.0.20 may not be possible.

* Do not run the schema change while the server is running.
+
This upgrade changes the primary key of a table, an operation
which shouldn't occur while end-users are able to make
modifications to the database.  I _strongly_ suggest a full
shutdown, schema upgrade, then startup approach for this release.

* There may be some duplicate keys
+
This upgrade removes a column from the primary key of a table,
which may result in duplicates being found.  You can search
for these duplicates before updating:
{{{
SELECT account_id,external_id FROM account_external_ids e
WHERE e.external_id IN (SELECT external_id
FROM account_external_ids
GROUP BY external_id
HAVING COUNT(*) > 1);
}}}
Resolving duplicates is left up to the administrator, in
general though you will probably want to remove one of the
duplicate records.  E.g. in one case I had 3 users with the
same mailing list email address registered.  I just deleted
those and sent private email asking the users to use their
personal/work address instead of a mailing list.
Apply the database specific schema script:
----
  java -jar gerrit.war --cat sql/upgrade017_018_postgres.sql | psql reviewdb
  java -jar gerrit.war --cat sql/upgrade017_018_mysql.sql    | mysql reviewdb
----


== Important Notices

* Prior User Sessions
+
The cookie used to identify a signed-in user has been changed.
Again.  All users will be automatically signed-out during
this upgrade, and will need to sign-in again after the upgrade
is complete.  The new schema has more room for extensions, so
this might be the last time we will need to invalidate sessions.

* Harmless error on first startup
+
Starting 2.0.21 on an instance which previously had the diff
cache stored on disk will result in the following non-fatal error
in the server logs during the first launch of .21 on that system:
----
2009-09-02 18:50:07,446::INFO : com.google.gerrit.server.cache.CachePool  - Enabling disk cache /home/gerrit2/android_codereview/disk_cache
Sep 2, 2009 6:50:07 PM net.sf.ehcache.store.DiskStore readIndex
SEVERE: Class loading problem reading index. Creating new index. Initial cause was com.google.gerrit.server.patch.DiffCacheKey
java.lang.ClassNotFoundException: com.google.gerrit.server.patch.DiffCacheKey
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
...
----
    This error can be safely ignored.  It is caused by a change
    in the diff cache's on disk schema, invalidating all existing
    cache entries.

* Significantly larger "diff" cache
+
The diff cache schema change noted above changed the element
stored in the cache from per-file to per-patchset.  That is,
a patch set which modifies 500 files will now occupy only 1
element in the diff cache, rather than 500 distinct elements.
Accordingly, the default `cache.diff.memoryLimit` setting has
been reduced to 128.

* Removed configuration settings
+
The following configuration settings are no longer honored:
`cache.maxAge`, `cache.memoryLimit`, `cache.diskLimit`, and
`cache.diskBuffer`.  These settings may now only be set on a
per-cache basis (e.g. `cache.diff.maxAge`).

* Connection pool recommendation: Apache Commons DBCP
+
All of the servers I run now use Apache Commons DBCP instead
of c3p0 for their connection pools, and the setup guide and
sample jetty_gerrit.xml reference DBCP now.
We've run into problems with c3p0 under high loads, or when
the connection pool is completely exhausted.  DBCP seems to
fail more gracefully, and seems to give us less trouble.
Changing pool implementations is not required, c3p0 is still
a supported provider.  I just want to make it clear that I no
longer recommend it in production.

== New Features

* GERRIT-189  Show approval status in account dashboards
+
Account dashboards now show a summary of the approval status on
each change.  Unreviewed changes are now highlighted to bring
the reviewer's attention to them.  Tooltips when hovering over
a cell will bring up slightly more detailed information.

* GERRIT-276  Allow users to see what groups they are members of
+
Under Settings > Groups a user can now view what groups Gerrit
has placed them into.  This may help administrators to debug
a user's access problems, as they can ask the user to verify
Gerrit is seeing what they expect.

* GERRIT-276  Show simple properties of an LDAP group
+
If auth.type is HTTP_LDAP, groups which are marked as automatic
membership now show non-repeating LDAP attributes below their
description under Admin > Groups.  This display should help an
administrator to verify that Gerrit has mapped an LDAP group
correctly.

* Move Patch entity out of database and store in cache
+
The `patches` database table has been deleted, Gerrit now makes
the list of affected files on the fly and stores it within the
diff cache.  This change is part of a long-running series to
remove redundant information from the database before we switch
to a pure Git backed data storage system.

* Only copy blocking negative votes to replacement patch
+
Previously Gerrit copied any negative vote in any approval
category whenever a replacement patch set was uploaded to
a change.  Now Gerrit only copies "Code Review -2".
This change should make it easier for reviewers (and scripts
scanning `patch_set_approvals`) to identify updated changes
which might require a new review.
Adminstrators who have created their own categories and want to
copy the blocking negative vote should set `copy_min_score = 'Y'`
in the corresponding approval_categories records.

* show-caches: Make output more concise
+
Instead of showing ~12 lines of output per cache, each cache is
displayed as one line of a table.

* Handle multiple accountBase and groupBase
+
ldap.accountBase and ldap.groupBase may now be specified multiple
times in gerrit.config, to search more than one subtree within
the directory.

* Summarize collapsed comments
+
Collapsed comments (both inline on a file and on the change
itself) now show a short summary of the comment message, making
it faster to locate the relevant comment to expand for more
detailed reading.

* Edit inline drafts on Publish Comments screen
+
Inline comment drafts may now be directly edited on the Publish
Comments screen, which can be useful for fixing up a minor typo
prior to publication.

* Less toggly thingies on change screen
+
The change description and the approvals are no longer nested
inside of a foldy block.  Most users never collapse these, but
instead just scroll the page to locate the information they are
looking for.

* Restore Enter/o to toggle collapse state of comments
+
Enter and 'o' now expand or collapse an inline comment on the
the current row of a file.

* Display abbreviated hexy Change-Id in screen titles
* Use hexy Change-Id in emails sent from Gerrit
+
Change-Id abbreviations are now used through more of the UI,
including emails sent by Gerrit and window/page titles.  This
change breaks email threading for any existing review emails.
That is comments on a change created before the upgrade will
not appear under the original change notification thread.

* Add sendemail.from to control setting From header
+
Gerrit no longer forges the From header in notification emails.
To enable the prior forging behavior, set `sendemail.from`
to `USER` in gerrit.config.  For more details see
link:http://gerrit.googlecode.com/svn/documentation/2.0/config-gerrit.html#sendemail.from[sendemail.from]

== Bug Fixes

* Fix ReviewDb to actually be per-request scoped
+
When we switched to Guice a misconfiguration allowed Guice to
give out multiple database connections per web or SSH request.
This could exhaust the connection pool faster than expected.

* Send no-cache headers during HTTP login
+
An oversight in the HTTP login code path may have allowed a proxy
server between the user's browser and the Gerrit server to cache
a user's session cookie.  Fixed by sending the correct no-cache
headers, disallowing any caching of the authentication response.

* Fix project owner permissions
+
Folks reported on repo-discuss that a project owner also had to
have READ permission to use the Branches tab of their project.
This was a regression introduced when we refactored some of the
code when adding Guice to the project.  Fixed.

* GERRIT-277  Fix hyperlinks in messages
+
Hyperlinks in commit messages such as "<http://foo>" were
including the trailing > in the URL, making the link broken.
The trailing > is now properly not included in the URL.

* GERRIT-266  Fix web session cookie refresh time
+
In 2.0.19 we introduced web sessions stored in Ehcache, but the
logic was causing sessions to expire roughly half-way through the
`cache.web_sessions.maxAge` time.  At the default setting, active
sessions were expiring after 6 hours.  The cache management has
been refactored to make this a lot less likely.

* Cleanup not signed in error to be more user friendly
+
The error message which comes up when your session is expired
is now much more useful.  From the dialog you can restart your
session by clicking the "Sign-In" button, and return to the
screen you are currently on.

* Fix commit-msg hook to work with commit -v option
+
The commit-msg hook was buggy and did not handle `git commit -v`
correctly.  It also did some bad insertions, placing the magic
`Change-Id: I...` line at the wrong position in the commit
message.  The updated hook resolves most of these problems,
but must be recopied to individual Git repositories by end-users.

* Identify PGP configuration errors during startup
+
If the encrypted contact store is enabled, the required encryption
algorithms are checked at startup to ensure they are enabled
in the underlying JVM.  This is necessary in case the JVM is
updated and the administrator forgot to install the unlimited
strength policy file in the new runtime directory.  Recently
review.source.android.com was bitten by just such an upgrade.

* GERRIT-278  Fix missing reply comments on old patch set
+
Some comments were not visible because they were replies made
to a comment on say patch set 1 while looking at the difference
between patch set 1 and patch set 2 of a change.  Fixed.

* Make external_id primary key of account_external_ids
+
The database schema incorrectly allowed two user accounts to have
the same email address, or to have the same OpenID auth token.
Fixed by asserting a unique constraint on the column.

== Other Changes
* Start 2.0.21 development
* Support cleaning up a Commons DBCP connection pool
* Clarify which Factory we are importing in ApproveComma...
* Avoid loading Patch object in /cat/ servlet
* Remove unnecessary reference of patch key in save draft
* GERRIT-266  Tweak cache defaults to be more reasonable
* Merge change I131e6c4c
* Bring back the "No Differences" message when files are...
* Pick up gwtorm 1.1.2-SNAPSHOT
* Refactor GroupListScreen's inner table for reuse
* Do not normalize approval scores on closed changes in ...
* Don't obtain 0 approvals or submit approvals in dashbo...
* Update JGit to 0.5.0-93-g5b89a2c
* Add tests for Change-Id generating commit-msg hook
* Add test for commit-msg with commit -v
* Fix formatting error in ApprovalCategory
* Fix typo in change table column header "Last Update"
* Fix reference to the All Projects broken when we remov...
* Use category abbreviations in the dashboard approval c...
* Format approvals columns in change tables with minimal...
* Shrink the Last Updated column in dashboards and chang...
* Highlight changes which need to be reviewed by this us...
* Fix typo in ChangeTable comment
* Reduce the window used for "Mon dd" vs. "Mon dd yyyy" ...
* Don't assume "Anonymous Users" and "Registered Users" ...
* Log encrypted contact store failures
* Identify PGP configuration errors during startup
* Take the change description block out of the disclosure...
* Move the approval table out of a disclosure panel
* Explicitly show what value is needed to submit
* Modernize the display of comments on a change
* Modernize the display of inline comments on a file
* Fix "Publish Comments" when there are no inline drafts
* Merge change 11666
* Fix display of "Gerrit Code Review" authored comments
* Fix source code formatting error in FormatUtil
* Remove unnecessary fake author on inline comments
* Auto expand all drafts on publish comments screen
* Remove unused local variable in PublishCommentsScreen
* Remove unused import from PublishCommentsScreen
* Use gwtorm, gwtexpui release versions
* Add javadoc for Change.getKey
* Updated documentation for eclipse development.
* Merge change 11698
* Merge change 11699
* Merge change 11700
* Merge change 11703
* Merge change 11705
* Moved creation of GerritPersonIdent to a separate provi...
* Remove unused dependency on GerritServer.
* Renamed GerritServert to GitRepositoryManager and moved...
* Remove declaration of OrmException that is never thrown.
* Increase margin space between buttons of comment editors
* Simplify GerritCallback error handling
* Correct comment documenting SignInDialog
* Remove unused CSS class gerrit-ErrorDialog-ErrorMessage
* Clarify become any account servlet errors
* Fix anchor in sshd.reuseAddress documentation
* Extract parametrized string formatting out of LdapQuery
* Make cache APIs interfaces for mocking
* Add easymock 2.5.1 to our test dependencies
* Add sendemail.from to control setting From header
* gerrit 2.0.21