Release Notes -- Apache Jackrabbit Oak -- Version 1.6.3

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.6.3 is a patch release that contains fixes and
improvements over Oak 1.6. Jackrabbit Oak 1.6.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.6.3
---------------------

Bug

    [OAK-5908] - BlobIdTracker should not resurrect deleted blob ids
    in a clustered/shared setup after GC
    [OAK-5949] - XPath: string literals parsed as identifiers
    [OAK-6374] - S3Backend masks actual thrown error when problem in
    filtering properties
    [OAK-6391] - With FastQuerySize, getSize() returns -1 if there are
    exactly 21 rows
    [OAK-6410] - NPE when removing inexistent property from checked in
    node
    [OAK-6413] - FileCache getIfPresent doesn't update cache hit/miss
    counters

Improvement

    [OAK-5899] - PropertyDefinitions should allow for some
    tweakability to declare usefulness
    [OAK-6351] - Invalidate cache entries when getChildNodes() is
    aborted
    [OAK-6388] - Enable Azure shared access signature for blob store
    connector

Test

    [OAK-6427] - Duplicate class: MongoDocumentStoreHelper

In addition to the above-mentioned changes, this release contains
all changes included up to the Apache Jackrabbit Oak 1.4.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/
