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

* Version 1.8.2 (2018-05-19)

This is a bug fix release with one beta feature.
  - Fix a possible issue with the security config when spaces are present in the
    authentication type.
  - Add beta support for split-meta from HBASE-11288 for large, multi-tenant
    clusters. The table names may change in the future.
  - Auto-detect HBase 2.0 by catching an exception thrown when getClosestRowOrBefore
    is called. HBASE-20237.
  - Log the version setting, min and max timestamps in Scanners.
  - Add CallQueueTooBig retry handling in the RegionClient without NSREing.

* Version 1.8.1 (2018-03-18)

This is a bug fix release.
  - Revert locking in an RPC to synchronizing on the key instead of the entire
    object as well as setting the suspend probe flag to volatile.
  - Fix GetRequests where the family was masked and immutable after being set.
  - Fix setting the scanner reverse flag in the setReversed() setter. 
    Previously when called it would only set the flag to `true`.
  - Add RegionTooBusyException to allow for retries when newer versions of HBase
    send this exception.
  - Fix processing of encoded (private) RPCs and catch + log exceptions during
    SASL negotiation.
  - Add a configuration flag 'hbase.meta.scan' to switch meta lookups to 
    use a reverse scan when finding tables for compatibility with HBase 2.x
	where the old method of getting the closest row was disabled.
  - Fix an issue with AssertionErrors being thrown when a multi-action RPC
    had an exception of a type that didn't implement the make() method.
  - Fix an issue with multi-actions sent to HBase 1.31 an later where the
    request was sorted by row key so that responses no longer matched the
	request order. Now we sort by row key as well.
  
Noteworthy bug Fixes:

* Version 1.8.0 (2017-06-09)

This is feature release with new APIs and behaviors.

New Features:
  - Support HBase 1.3.0 and later where scanner behavior changed.
  - Add optional support for buffered AtomicIncrement calls to bypass the WAL
    for quicker writes.
  - Add an API for writing AtomicIncrements over multiple columns in a single
    RPC.
  - Add the MultipleColumnPrefixFilter.
  - Add a "multi-get" API that allows for batching GetRequests and sending them
    in a single request. Useful if the client wants to fetch a number of 
    disparate rows when scanning would be less efficient.
  - Support for reverse scanning

* Version 1.7.3 (2017-06-09)

This is a bug fix release.

Noteworthy bug Fixes:
  - Properly handle IPV6 addresses in the RegionClientPipeline.
  - Avoid a deadlock when calling the RegionClient.toString() method.
  - Avoid a synchronization deadlock handling NSRE probes.

* Version 1.7.2 (2016-09-17)

This is a bug fix release.

Noteworthy bug Fixes:
  - Fix a race condition where messages in the NSRE queue could be stuck and
    never retried properly. This will help region server crash recovery.
  - Fix a bug in batched RPCs where, on exception, the batch RPC itself was
    returned in the exception instead of the individual RPCs.
  - Changed watermark variables to integers instead of shorts to avoid 
    overflows when set to values over 32K.
  - Added retries of CallQueueTooBigExceptions. These still need to avoid
    flushing the region cache but at least they'll be retried.
  - Fix calls to scanner.setFamilies() where NPEs were being thrown.
  - Retry RPCs on RegionServerAbortedException, ServerNotRunningYetExceptions
    and RegionServerStoppedExceptions.
  - Fix CompareAndSetRequests so they serialize timestamps as well as the data
    to target specific versions.
  - Update the protobuf compiler plugin for Maven.

* Version 1.7.1 (2016-02-10)

This is a bug fix release.

Noteworthy bug Fixes:
  - Fix a regression where RPCs from pre-0.96 HBase clusters were not parsed
    properly when large responses were split across packets. RPC timeouts were
    not handled properly either and now they are.

* 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: