AsyncHBase - User visible and noteworthy changes.
This project uses Semantic Versioning (see http://semver.org/).

* Version 1.7.0 (2015-09-11) 

This release adds support for secure HBase installations, more filters and
greater configuration.

New public APIs:
  - The Config object handles configuration of the client and can be set
    manually or it may load a list of settings from a properties file.
  - Introduction of AppendRequest to allow for appending data to the value
    of a column in HBase. Appends can be buffered similar to PutRequests.
  - Introduction of Kerberos and simple authentication support against HBase
    region servers. Configuration is similar to the HTable client.
  - Introduction of locateRegions() and RegionLocation similar to HTable to
    allow users the ability to get a list of regions for a table.
  - Add filter support and timestamp ranges to GetRequests.
  - Add a socket idle handler to close connections to region clients after
    some period of inactivity.
  - Introduce RPC timeouts on either a global or per-RPC basis.
  - Netty threads are now named for easier debugging.
  - Add filters including FirstKeyOnlyFilter, ColumnPaginationFilter,
    KeyOnlyFilter and FuzzyRowFilter
  - Introduce the RegionClientStats object for tracking metrics around individual
    region client connections.

Noteworthy bug fixes:
  - Add the RegionOpeningException as a recoverable exception (#117)
  - Region clients can now check the status of the socket write buffer before
    sending RPCs to avoid OOM issues. Must be enabled via the config.
  - Fix a small meta lookup permit bug when an exception is thrown and the 
    semaphore isn't released.
  - Fix an issue with stale region clients created when a region server
    restarts.
  - Fix a bug with CDH5 and HBase 0.96 when closing a scanner that has rows
    remaining to be read.
  - Fix a potential bug with decoding byte array backed ChannelBuffers in
    the region client.
  - Fix an issue where an RPC could be stranded in the inflight map when an
    exception is thrown.

* Version 1.6.0 (2014-10-07) [a56249b]

This is mostly a bugfix release, but the introduction of a few new APIs made
it become 1.6.0 instead of 1.5.1.

New public APIs:
  - Introduction of RegionMovedException.
  - Introduction of a lot of new filters (BinaryComparator,
    BinaryPrefixComparator, BitComparator, CompareFilter,
    DependentColumnFilter, FamilyFilter, FilterComparator,
    QualifierFilter, RegexStringComparator, RowFilter,
    SubstringComparator, TimestampsFilter, ValueFilter).
Noteworthy bug fixes:
  - When a region was unavailable, some RPCs could be spuriously retried more
    than once, which could lead to double-counting when the RPC was an atomic
    increment (#81).
  - Fix an error handling bug that arises when an RPC response fails to be
    de-serialized properly (something that shouldn't happen in the first
    place).
  - Fix a compatibility issue with the latest versions of CDH5 that were
    causing scanners to raise an InvalidResponseException.
  - Properly handle RegionMovedException.
  - Make our probes to recover from moving regions more lightweight by
    crafting an unlikely key that is very unlikely to be present in the table,
    since unfortunately exists() still materializes the row in memory in the
    RegionServer, which is problematic for tables with big rows (#82).
  - Fixed an off-by-one in the serialization of batched RPCs that could lead
    to an uncaught IndexOutOfBoundsException.


* Version 1.5.0 (2013-12-13) [67fc3b7]

This release introduces compatibility with HBase 0.96 and up, and adds
a dependency on Google's protobuf-java library.  Note that HBase 0.95.x,
which was a "developer preview" release train, is NOT supported.

Please note that support for explicit row locks has been removed from
HBase 0.95 and up.  While the classes and functionality remain usable
when using earlier versions of HBase, an `UnsupportedOperationException'
will be raised if one attempt to send a `RowLockRequest' to a newer
version of HBase.

Please note that while AsyncHBase never made any guarantees about
the exact order in which multiple edits are applied within a batch,
the order is now different when talking to HBase 0.96 and up.

New public APIs:
  - Scanners can now use a variety of different filters via the new
    `ScanFilter' interfaces and its various implementations.
  - It's possible to specify specific families to scan via `setFamilies'.
  - Scanners can put an upper bound on the amount of data fetched by RPC
    via the new `setMaxNumKeyValues' (works with HBase 0.96 and up only).
  - HBaseRpc now has a `failfast()' and a `setFailfast(boolean)' pair
    of methods to allow RPCs to fail as soon as their encounter an
    issue out of the ordinary (e.g. not just a `NotSuchRegionException').
  - `GetRequest' has additional constructor overloads that make its API
    more uniform with that of other RPCs.
  - HBaseClient has new `prefetchMeta' methods to prefetch metadata about
    the regions of a table (for the entire table or a given key range).

Noteworthy bug fixes:
  - DeleteRequest wasn't honoring its timestamp if one was given (#58).
  - When a connection attempt fails, buffered RPCs weren't cleaned up
    or retried properly.
  - When one RPC fails because of another one (e.g. we fail to send an
    RPC because a META lookup failed), the asynchronous exception that
    is given to the callback now properly carries the original RPC that
    failed.
  - There was an unlikely race condition that could cause an NPE while
    trying to retrieve the ROOT region from ZooKeeper.
  - There was an unlikely race if the client got disconnected right
    after successfully establishing a connection to a RegionServer, while
    it was flushing RPC buffered while waiting to be connected.  Also
    when those RPCs were flushed, the batchable RPCs weren't given a
    chance to get batched.
  - It was not possible to scan the ROOT region (or the hbase:meta region
    when using HBase 0.96+).


* Version 1.4.1 (2013-02-14) [1cbc303]

Noteworthy bug fixes:
  - Under certain failure modes, especially during RegionServer failures
    or regions split, asynchbase could incorrectly discard an RPC instead
    of retrying it.  This made the client look like it was stuck if the
    RPC was a ROOT or META lookup (#1).
  - Update all dependencies.  Due to new dependencies in Junit and PowerMock,
    asynchbase now depends on hamcrest-core and objenesis respectively.
    These are test-only dependencies.
  - Maven releases are now signed with the GPG key of tsunanet@gmail.com


* Version 1.4.0 (2012-11-10) [fae1a04]

New public APIs:
  - Scanners can now scan multiple qualifiers at a time (#35).
  - Scanner and GetRequest now enable you to specify how many versions
    to read from HBase.

Noteworthy changes:
  - Fixed cases where calling `flush()' or `shutdown()' while the
    client is still starting up could cause it to terminate too early
    and to not execute all pending/buffered RPCs (#2).
  - Fixed an RPC serialization bug when batching whole-row deletes.
    See issue #25.
  - The Deferred returned by `flush()' now guarantees that buffered
    atomic increments have also completed (#38).
  - Upgraded to Netty 3.5.9 to avoid an IndexOutOfBoundsException
    when deserializing a KeyValue with an empty qualifier or
    value, under certain circumstances (#40).
  - Fix increment coalescing to prevent overflowing Deferred callback
    chains when too many increments pile up for some counter (#40).
  - Increment coalescing now also supports negative values as well as
    large positive values (previously the limit was 65535).
  - Upgraded to suasync 1.3.1 and Netty 3.5.9.
  - Added a series of integration tests to help ongoing QA.


* Version 1.3.2 (2012-07-10) [2af9f55]

Noteworthy changes:
  - Upgraded to Netty 3.5.2.
  - KeyValue now allows a timestamp of 0.


* Version 1.3.1 (2012-06-16) [7ea151b]

  - Critical bug fix of issue #27 that makes some keys unusable
    given certain region boundaries, in rare circumstances.
  - `ensureTableFamilyExists' and `ensureTableExists' are cheaper
    as they partially work around HBASE-3170.


* Version 1.3.0 (2012-05-06) [bb9168c]

New public APIs:
  - PleaseThrottleException can now give you a Deferred.
  - There is now a `Counter' class that provides a highly concurrent
    replacement for AtomicLong from jsr166e's LongAdder.
  - HBaseClient now has a `bufferAtomicIncrement' method used to
    coalesce atomic counter increments.
  - A new method, `stats()', provides detailed statistics on the client's
    activities (number of calls for various RPCs, number of connections
    created, etc.)
  - `HBaseClient' has a new `compareAndSet(PutRequests, byte[])' method
    for atomic Compare-And-Set (CAS) operation.
  - The Scanner has new methods to allow specifying a time range to scan.
  - `PutRequest' has extra constructors so as to be able to affect multiple
    columns in a row.  This is required to be able to atomically CAS more
    than one column at a time on a given row.

Deprecated public APIs:
  - In HBaseClient, the methods `rootLookupCount()',
    `uncontendedMetaLookupCount()', and `contendedMetaLookupCount()' are
    deprecated in favor of the new `stats()' API.  These methods will be
    removed in the 2.0 release.

Noteworthy changes:
  - Upgraded to Netty 3.4.3, suasync to 1.2.0.
  - asynchbase now depends on Google's Guava library (v12.0).


* Version 1.2.0 (2012-02-21) [a7ae238]

Noteworthy changes:
  - Add support for HBase 0.92, as the on-wire RPC format underwent
    significant changes that aren't compatible with previous versions.
    NOTE: HBase never had a release in the 0.91 branch, and as such
    this branch isn't fully supported.
  - When talking to HBase 0.92, we automatically batch `DeleteRequests'
    with `PutRequests'.  Note that batching is enabled by default, and
    will thus introduce a delay before sending out `DeleteRequests' to
    HBase, whereas in earlier versions (or when talking to HBase 0.90
    and before) the `DeleteRequests' are sent out immediately.

New public APIs:
  - KeyValue now supports timestamps.
  - HBaseClient now accepts a custom socket factory or executor, which can
    be used to share an existing thread pool instead of having its own.
  - The Netty Timer used by asynchbase is now available through an API, so
    that code dependent on asynchbase can re-use the existing Timer thread
    instead of having to create its own.


* Version 1.1.0 (2011-12-22) [1272a9e]

Noteworthy changes:
  - Add support for CDH3b3's non-standard authentication code.  This support
    is enabled by specifying the Java system property "org.hbase.async.cdh3b3".
  - Add support for HBase 0.90, as on-wire protocol changed in a non-backward
    compatible way for the `get' RPC.
  - Fix a dumb mistake in the `memcmp()' version that uses an offset and a
    length.  This function wasn't called either by asynchbase or by OpenTSDB.
  - Bytes.pretty() no longer renders control characters like `^X' (which is
    similar to what `cat -t' does).  Instead they're now rendered like other
    non-ASCII characters, using the hex notation `\xXX'.  This makes the output
    non-ambiguous and pastable into a Python shell.
  - HBaseClient.shutdown() could callback too early, while the shutdown
    sequence was still running.
  - After doing a full-table scan, calling Scanner.close() would trigger an
    error as the scanner would attempt to close itself again.
  - When disconnecting from a RegionServer, if the socket wasn't getting
    closed immediately, a Deferred could get called back twice, which would
    trigger an AssertionError.
  - DeleteRequest used to delete the last version of a cell, which wasn't the
    intended behavior.  It has been changed to delete all the previous
    versions of a cell.
  - Fixed various other race conditions during startup / shutdown that would
    generally affect short-lived programs or MapReduce users.

New public APIs:
  - DeleteRequest now has constructors for deleting multiple qualifiers per
    row at once and deleting a whole family at once.
  - New `qualifiers' method in GetRequest for getting multiple qualifiers per
    row at once.
  - Add new interfaces nested in `HBaseRpc' to provide public APIs to be able
    to introspect the contents of RPCs.


* Version 1.0 (2010-11-08) [dafc645]

Initial beta release (bundled with OpenTSDB):
  - Switched from LGPLv3+ to BSD license.
  - Fixed many bugs, including incorrect or inefficient error handling,
    synchronization bugs (race conditions).
  - Shutting down the client now correctly waits until all RPCs in flight
    have successfully completed.
  - No public API changes.


* Version 0.1 (2010-09-08) [d0646bb]

Initial alpha release:
  - Get, Put, Scan, ICV, with row locks and time-based edit buffering.

-----

Copyright (C) 2010-2012  The Async HBase Authors.  All rights reserved.
This file is part of Async HBase.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
  - Redistributions of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.
  - Redistributions in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.
  - Neither the name of the StumbleUpon nor the names of its contributors
    may be used to endorse or promote products derived from this software
    without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

Local Variables:
mode: outline
End: