Release Notes -- Apache Jackrabbit Oak -- Version 1.8.2

Introduction
------------

Jackrabbit Oak is a scalable, high-performance hierarchical content
repository designed for use as the foundation of modern world-class
web sites and other demanding content applications.

Jackrabbit Oak 1.8.2 is a patch release that contains fixes and
improvements over Oak 1.8. Jackrabbit Oak 1.8.x releases are
considered stable and targeted for production use.

The Oak effort is a part of the Apache Jackrabbit project.
Apache Jackrabbit is a project of the Apache Software Foundation.

Changes in Oak 1.8.2
---------------------

Bug

    [OAK-7162] - Race condition on revisions head between compaction
    and scheduler could result in skipped commit
    [OAK-7174] - The check command returns a zero exit code on error
    [OAK-7223] - Files could be kept partially in case of
    disconnection from backends
    [OAK-7227] - MountPermissionProvider getNumEntries prone to
    overflow
    [OAK-7241] - oak-run documentation typo for "checkpoints" command
    [OAK-7244] - RDBDocumentStore: fix typo in metadata

Improvement

    [OAK-6373] - oak-run check should also check checkpoints
    [OAK-7222] - Log a warn when CoW opens input from remote due to
    size mismatch

Task

    [OAK-7189] - Improve code coverage for InitialContentMigrator

In addition to the above-mentioned changes, this release contains
all changes included up to the Apache Jackrabbit Oak 1.8.x release.

For more detailed information about all the changes in this and other
Oak releases, please see the Oak issue tracker at

  https://issues.apache.org/jira/browse/OAK

Release Contents
----------------

This release consists of a single source archive packaged as a zip
file.
The archive can be unpacked with the jar tool from your JDK
installation.
See the README.md file for instructions on how to build this release.

The source archive is accompanied by SHA1 and MD5 checksums and a PGP
signature that you can use to verify the authenticity of your
download.
The public key used for the PGP signature can be found at
http://www.apache.org/dist/jackrabbit/KEYS.

About Apache Jackrabbit Oak
---------------------------

Jackrabbit Oak is a scalable, high-performance hierarchical content
repository designed for use as the foundation of modern world-class
web sites and other demanding content applications.

The Oak effort is a part of the Apache Jackrabbit project. 
Apache Jackrabbit is a project of the Apache Software Foundation.

For more information, visit http://jackrabbit.apache.org/oak

About The Apache Software Foundation
------------------------------------

Established in 1999, The Apache Software Foundation provides
organizational,
legal, and financial support for more than 140 freely-available,
collaboratively-developed Open Source projects. The pragmatic Apache
License
enables individual and commercial users to easily deploy Apache
software;
the Foundation's intellectual property framework limits the legal
exposure
of its 3,800+ contributors.

For more information, visit http://www.apache.org/
