// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

[[prior_release_notes]]
= Apache Kudu Prior Version Release Notes

:author: Kudu Team
:imagesdir: ./images
:icons: font
:toc: left
:toclevels: 3
:doctype: book
:backend: html5
:sectlinks:
:experimental:

This section reproduces the release notes for new features and incompatible
changes in prior releases of Apache Kudu.


NOTE: The list of known issues and limitations for prior releases are not
reproduced on this page. Please consult the
link:http://kudu.apache.org/releases/[documentation of the appropriate release]
for a list of known issues and limitations.

[[rn_1.15.0]]
= Apache Kudu 1.15.0 Release Notes

[[rn_1.15.0_upgrade_notes]]
== Upgrade Notes

[[rn_1.15.0_obsoletions]]
== Obsoletions

* The `kudu-mapreduce` integration has been removed in the 1.15.0 release.
Similar functionality and capabilities now exist via the Apache Spark, Apache Hive, Apache Impala,
and Apache NiFi integrations. See link:https://issues.apache.org/jira/browse/KUDU-3142[KUDU-3142]
for details.

[[rn_1.15.0_deprecations]]
== Deprecations

* Support for Python 2.x and Python 3.4 and earlier is deprecated and may be removed in the next minor
release.

[[rn_1.15.0_new_features]]
== New features

* Kudu now experimentally supports multi-row transactions. Currently only `INSERT` and
`INSERT_IGNORE` operations are supported.
See link:https://github.com/apache/kudu/blob/master/docs/design-docs/transactions.adoc[here] for a
design overview of this feature.

* Kudu now supports Raft configuration change for Kudu masters and CLI tools for orchestrating
addition and removal of masters in a Kudu cluster. These tools substantially simplify the process
of migrating to multiple masters, recovering a dead master and removing masters from a Kudu cluster.
For detailed steps, see the latest administration documentation. This feature is evolving and
the steps to add, remove and recover masters may change in the future.
See link:https://issues.apache.org/jira/browse/KUDU-2181[KUDU-2181] for details.

* Kudu now supports table comments directly on Kudu tables which are automatically synchronized
when the Hive Metastore integration is enabled. These comments can be added at table creation time
and changed via table alteration.

* Kudu now experimentally supports per-table size limits based on leader disk space usage or number
of rows. When generating new authorization tokens, Masters will now consider the size limits and
strip tokens of `INSERT` and `UPDATE` privileges if either limit is reached. To enable this feature,
set the `--enable_table_write_limit` master flag; adjust the `--table_disk_size_limit` and
`--table_row_count_limit` flags as desired or use the `kudu table set_limit` tool to set limits per
table.

[[rn_1.15.0_improvements]]
== Optimizations and improvements

* It is now possible to change the Kerberos Service Principal Name using the `--principal` flag. The
default SPN is still `kudu/_HOST`. Clients connecting to a cluster using a non-default SPN must set
the `sasl_protocol_name` or `saslProtocolName` to match the SPN base
(i.e. “kudu” if the SPN is “kudu/_HOST”) in the client builder or the Kudu CLI.
See link:https://issues.apache.org/jira/browse/KUDU-1884[KUDU-1884] for details.

* Kudu RPC now supports TLSv1.3.  Kudu servers and clients automatically negotiate TLSv1.3 for Kudu
RPC if OpenSSL (or Java runtime correspondingly) on each side supports TLSv1.3.
If necessary, use the newly introduced flag `--rpc_tls_ciphersuites` to customize TLSv1.3-specific
cipher suites at the server side.
See link:https://issues.apache.org/jira/browse/KUDU-2871[KUDU-2871] for details.

* TLS ciphers renegotiation for TLSv1.2 and prior protocol versions is now explicitly disabled.
See link:https://issues.apache.org/jira/browse/KUDU-1926[KUDU-1926] for details.

* The location assignment for Kudu clients is now disabled by default since it doesn’t bring a lot
of benefits, but rather puts an extra load to Kudu masters.  This change reduces the load on Kudu
masters which is essential if too many clients run in a cluster.  To enable the location assignment
for clients, override the default by setting `--master_client_location_assignment_enabled=true` for
Kudu masters.

* The behavior of the C++ client replica selection for closest replica, the default, was updated to
match the behavior of the Java client. Instead of picking a random replica each time, a static value
is used for each process ensuring that the selection remains deterministic and can benefit from
better caching. See link:https://issues.apache.org/jira/browse/KUDU-3248[KUDU-3248] for details.

* The Web UI /rpcz endpoint now displays information on whether an RPC connection is protected by
TLS, and if so, provides information on the negotiated TLS cipher suite.

* Tooling requests and C++ client requests bound for leader masters will now be retried in the event
the masters cannot be reached.

* Cluster tooling will now validate that the master argument contains no duplicate values.
See link:https://issues.apache.org/jira/browse/KUDU-3226[KUDU-3226] for details.

* The error message output by Kudu Java client in an attempt to write into a non-existent table
partition now contains the table’s name.
See link:https://issues.apache.org/jira/browse/KUDU-3267[KUDU-3267] for details.

[[rn_1.15.0_fixed_issues]]
== Fixed Issues

* Fixed a bug in the Kudu tablet servers that could result in a crash when performing an incremental
backup of rows that had many batches of updates.
See link:https://issues.apache.org/jira/browse/KUDU-3291[KUDU-3291] for more details.

* The Kudu Java client will now retry scans bound for tablets hosted on quiescing tablet servers at
replicas on other tablet servers. See
link:https://issues.apache.org/jira/browse/KUDU-3213[KUDU-3213] for more details.

* Fixed a race between the scheduling of a maintenance op and the destruction of a tablet. This
could previously lead to a crash.
See link:https://issues.apache.org/jira/browse/KUDU-3268[KUDU-3268] for more details.

* Fixed crash in Kudu C++ client introduced with KUDU-1802.
See link:https://issues.apache.org/jira/browse/KUDU-3254[KUDU-3254] for details.

* Fixed bug in Kudu Java client which manifested in `AUTO_FLUSH_BACKGROUND` sessions hung in a call
to `KuduSession.flush()` method.  Another sign of the bug were stuck data ingest workloads based on
Java client (e.g., kudu-spark applications) with
"java.lang.AssertionError: This Deferred was already called!" message in the logs.
See link:https://issues.apache.org/jira/browse/KUDU-3277[KUDU-3277] for details.

* Fixed crash in Kudu server due to lack of `getrandom(2)` system call in Linux kernel version
earlier than 3.17 by instead using `/dev/random` for uuid generation in the Boost library.
Crash includes the following message in the logs
"terminate called after throwing an instance of 'boost::wrapexcept<boost::uuids::entropy_error>'".
See the link:https://gerrit.cloudera.org/c/17354/[fix] for a sample stack trace.

[[rn_1.15.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.15.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.15 clients may connect to servers running Kudu 1.0 or later. If the client uses
features that are not available on the target server, an error will be returned.
* Rolling upgrade between Kudu 1.14 and Kudu 1.15 servers is believed to be possible
though has not been sufficiently tested. Users are encouraged to shut down all nodes
in the cluster, upgrade the software, and then restart the daemons on the new version.
* Kudu 1.0 clients may connect to servers running Kudu 1.15 with the exception of the
below-mentioned restrictions regarding secure clusters.

The authentication features introduced in Kudu 1.3 place the following limitations
on wire compatibility between Kudu 1.15 and versions earlier than 1.3:

* If a Kudu 1.15 cluster is configured with authentication or encryption set to "required",
clients older than Kudu 1.3 will be unable to connect.
* If a Kudu 1.15 cluster is configured with authentication and encryption set to "optional"
or "disabled", older clients will still be able to connect.

[[rn_1.15.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.15.0

* Updated hash computation for empty strings in the FastHash implementation to conform with the
handling in Apache Impala. For Bloom filter predicate pushdown feature that uses FastHash,
this makes the Kudu client older than version 1.15.0 incompatible with Kudu server version 1.15.0
and Kudu client version at or newer than 1.15.0 incompatible with Kudu server version earlier than
1.15.0. Both client library and Kudu server need to be updated to version 1.15.0 or above if using
the Bloom filter predicate feature. One manifestation of this incompatibility is following message
in the logs, "Not implemented: call requires unsupported application feature flags: 4".
See link:https://issues.apache.org/jira/browse/KUDU-3286[KUDU-3286] for details.

[[rn_1.15.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.15 Java client library is API- and ABI-compatible with Kudu 1.14. Applications
written against Kudu 1.14 will compile and run against the Kudu 1.15 client library and
vice-versa.

* The Kudu 1.15 {cpp} client is API- and ABI-forward-compatible with Kudu 1.14.
Applications written and compiled against the Kudu 1.14 client library will run without
modification against the Kudu 1.15 client library. Applications written and compiled
against the Kudu 1.15 client library will run without modification against the Kudu 1.14
client library.

* The Kudu 1.15 Python client is API-compatible with Kudu 1.14. Applications
written against Kudu 1.14 will continue to run against the Kudu 1.15 client
and vice-versa.

[[rn_1.15.0_known_issues]]
== Known Issues and Limitations

Please refer to the link:known_issues.html[Known Issues and Limitations] section of the
documentation.

[[rn_1.15.0_contributors]]
== Contributors

Kudu 1.15.0 includes contributions from 12 people, including 2 first-time contributors:

* Abhishek Chennaka
* shenxingwuying

Thank you for your contributions!

[[rn_1.14.0]]
= Apache Kudu 1.14.0 Release Notes

[[rn_1.14.0_upgrade_notes]]
== Upgrade Notes

[[rn_1.14.0_obsoletions]]
== Obsoletions

* Support for CentOS 6/RHEL 6, Ubuntu 14, Ubuntu 16, and Debian 8 platforms has been dropped
given they are at or near end-of-life. We will no longer validate these platforms as a
part of the release process, though patches will still be accepted going forward.

* Developer support for OS X 10.10 Yosemite, OS X 10.11 El Capitan, and OS X 10.12 Sierra
has been dropped. We will no longer validate these versions as a part of the release
process, though patches will still be accepted going forward.

[[rn_1.14.0_deprecations]]
== Deprecations

* Support for Python 2.x and Python 3.4 and earlier is deprecated and may be
removed in the next minor release.

* The `kudu-mapreduce` integration has been deprecated and may be removed in the
next minor release. Similar functionality and capabilities now exist via the
Apache Spark, Apache Hive, Apache Impala, and Apache NiFi integrations.

[[rn_1.14.0_new_features]]
== New features

* Full support for `INSERT_IGNORE`, `UPDATE_IGNORE`, and `DELETE_IGNORE` operations
was added. The `INSERT_IGNORE` operation will insert a row if one matching the key
does not exist and ignore the operation if one already exists. The `UPDATE_IGNORE`
operation will update the row if one matching the key exists and ignore the operation
if one does not exist. The `DELETE_IGNORE` operation will delete the row if one matching
the key exists and ignore the operation if one does not exist. These operations are
particularly useful in situations where retries or duplicate operations could occur and
you do not want to handle the errors that could result manually or you do not want to cause
unnecessary writes and compaction work as a result of using the `UPSERT` operation.
The Java client can check if the cluster it is communicating with supports these operations
by calling the `supportsIgnoreOperations()` method on the KuduClient. See
link:https://issues.apache.org/jira/browse/KUDU-1563[KUDU-1563] for more details.

* Spark 3 compatible JARs compiled for Scala 2.12 are now published for the Kudu Spark integration.
See link:https://issues.apache.org/jira/browse/KUDU-3202[KUDU-3202] for more details.

* Every Kudu cluster now has an automatically generated cluster Id that can be used to uniquely
identify a cluster. The cluster Id is shown in the masters web-UI, the `kudu master list` tool,
and in master server logs. See link:https://issues.apache.org/jira/browse/KUDU-2574[KUDU-2574]
for more details.

* It is now possible to enforce that OpenSSL is initialized in FIPS approved mode in the servers
and the C++ client by setting the KUDU_REQUIRE_FIPS_MODE environment variable to “1”, “yes” or
“true”. See link:https://issues.apache.org/jira/browse/KUDU-3210[KUDU-3210] for more details.

[[rn_1.14.0_improvements]]
== Optimizations and improvements

* Downloading the WAL data and data blocks when copying tablets to another tablet server is now
parallelized, resulting in much faster tablet copy operations. These operations occur when
recovering from a down tablet server or when running the cluster rebalancer. See
link:https://issues.apache.org/jira/browse/KUDU-1728[KUDU-1728] and
link:https://issues.apache.org/jira/browse/KUDU-3214[KUDU-3214] for more details.

* The HMS integration now supports multiple Kudu clusters associated with a single HMS
including Kudu clusters that do not have HMS synchronization enabled. This is possible,
because the Kudu master will now leverage the cluster Id to ignore notifications from
tables in a different cluster. Additionally, the HMS plugin will check if the Kudu cluster
associated with a table has HMS synchronization enabled.
See link:https://issues.apache.org/jira/browse/KUDU-3192[KUDU-3192] and
link:https://issues.apache.org/jira/browse/KUDU-3187[KUDU-3187] for more details.

* The HMS integration now supports gzipped HMS notifications. This is important in order to
support Hive 4 where the default encoder was changed to be the GzipJSONMessageEncoder. See
link:https://issues.apache.org/jira/browse/KUDU-3201[KUDU-3201] for more details.

* Kudu will now fail tablet replicas that have been corrupted due to KUDU-2233 instead of
crashing the tablet server. If a healthy majority still exists, a new replica will be created
and the failed replica will be evicted and deleted. See
link:https://issues.apache.org/jira/browse/KUDU-3191[KUDU-3191] and
link:https://issues.apache.org/jira/browse/KUDU-2233[KUDU-2233] for more details.

* DeltaMemStores will now be flushed as long as any DMS in a tablet is older than the point
defined by `--flush_threshold_secs`, rather than flushing once every `--flush_threshold_secs`
period. This can reduce memory pressure under update- or delete-heavy workloads, and lower tablet
server restart times following such workloads. See
link:https://issues.apache.org/jira/browse/KUDU-3195[KUDU-3195] for more details.

* The `kudu perf loadgen` CLI tool now supports `UPSERT` for storing the generated data into
the table. To switch to `UPSERT` for row operations (instead of default `INSERT`), add the
`--use_upsert` command-line flag.

* Users can now specify the level of parallelization when copying a tablet using the
`kudu local_replica copy_from_remote` CLI tool by passing the
`--tablet_copy_download_threads_nums_per_session` argument.

* The Kudu Masters now discriminate between overlapped and exact duplicate key ranges when adding
new partitions, returning `Status::AlreadyPresent()` for exact range duplicates and
`Status::InvalidArgument()` for otherwise overlapped ones. In prior releases, the master
returned `Status::InvalidArgument()` both in case of duplicate and otherwise overlapped ranges.

* The handling of an empty list of master addresses in Kudu C++ client has improved. In prior
releases, `KuduClientBuilder::Build()` would hang in `ConnectToCluster()` if no master addresses
were provided. Now, `KuduClientBuilder::Build()` instantly returns `Status::InvalidArgument()`
in such a case.

* The connection negotiation timeout for Kudu C++ client is now programmatically configurable.
  To customize the connection negotiation timeout, use the newly introduced
  `KuduClientBuilder::connection_negotiation_timeout()` method in the Kudu C++ client API.

* All RPC-related `kudu` CLI tools now have `--negotiation_timeout_ms` command line flag to
control the client-side connection negotiation timeout. The default value for the new flag is
set to 3000 milliseconds for backward compatibility. Keep in mind that the total RPC timeout
includes the connection negotiation time, so in general it makes sense to bump `--timeout_ms`
along with `--negotiation_timeout_ms` by the same delta.

* Kudu now reports on slow SASL calls (i.e. calls taking more than 250  milliseconds to complete)
when connecting to a server. This is to help diagnose issues like described in
link:https://issues.apache.org/jira/browse/KUDU-3217[KUDU-3217].

* MaintenanceManager now has a new histogram-based `maintenance_op_find_best_candidate_duration`
metric to capture the stats on how long it takes (in microseconds) to find the best maintenance
operation among available candidates. The newly introduced metric can help in diagnosing
conditions where MaintenanceManager seems lagging behind the rate of write operations in a busy
Kudu cluster with many replicas per tablet server.

* The KuduScanToken Java API has been extended with a `deserializeIntoScannerBuilder()` method that
can be used to further customize generated tokens.

* Logging of the error message produced when applying an op while a Java KuduSession is closed
has been throttled. See
link:https://issues.apache.org/jira/browse/KUDU-3012[KUDU-3012] for more details.

* Added a new `uptime` metric for a Kudu server. The metric's value is reported as the length of
the time interval passed from the start of the server, in microseconds. Knowing the server's
uptime, it's easier to interpret and compare metrics reported by different Kudu servers.

* Documentation for Kudu’s metrics are now automatically generated for each release and can be seen
link:https://kudu.apache.org/docs/metrics_reference.html[here].

[[rn_1.14.0_fixed_issues]]
== Fixed Issues

* Fixed lock contention between MaintenanceManager op registration and the scheduling of new
maintenance ops. On particularly dense tablet servers, this contention was previously shown to
significantly slow down startup times. See
link:https://issues.apache.org/jira/browse/KUDU-3149[KUDU-3149] for more details.

* Fixed lock contention between MaintenanceManager’s threads performing already scheduled
operations and the scheduler thread itself. This benefits clusters with heavy ingest/update
workloads that have many replicas per tablet server. See
link:https://issues.apache.org/jira/browse/KUDU-1954[KUDU-1954] for more details.

* Fixed a bug in the merge iterator that could result in a crash. This could surface as a crash
when performing ordered or differential scans, particularly when the underlying data contained
deletes and reinserts. See
link:https://issues.apache.org/jira/browse/KUDU-3108[KUDU-3108] for more details.

* Fixed a heap-use-after-free bug in Kudu C++ client that might manifest itself when altering a
table to update the partitioning schema. See
link:https://issues.apache.org/jira/browse/KUDU-3238[KUDU-3238] for more details.

* Fixed a bug where building scan tokens would result in a NullPointerException if a tablet not
found error occurred before generating the token. See
link:https://issues.apache.org/jira/browse/KUDU-3205[KUDU-3205] for more details.

* Fixed a bug where a delete operation would fail if the row being deleted contained exactly
64 columns and all values were set on the row. See
link:https://issues.apache.org/jira/browse/KUDU-3198[KUDU-3198] for more details.

* Fixed a bug where Slf4j classes were shaded into the Spark integration JARs. See
link:https://issues.apache.org/jira/browse/KUDU-3157[KUDU-3157] for more details.

* Fixed a bug where the 'kudu hms fix' tool mistakenly reports non-matching master addresses
when the addresses are in-fact canonically the same. See
link:https://issues.apache.org/jira/browse/KUDU-2884[KUDU-2884] for more details.

[[rn_1.14.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.14.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.14 clients may connect to servers running Kudu 1.0 or later. If the client uses
features that are not available on the target server, an error will be returned.
* Rolling upgrade between Kudu 1.13 and Kudu 1.14 servers is believed to be possible
though has not been sufficiently tested. Users are encouraged to shut down all nodes
in the cluster, upgrade the software, and then restart the daemons on the new version.
* Kudu 1.0 clients may connect to servers running Kudu 1.14 with the exception of the
below-mentioned restrictions regarding secure clusters.

The authentication features introduced in Kudu 1.3 place the following limitations
on wire compatibility between Kudu 1.14 and versions earlier than 1.3:

* If a Kudu 1.14 cluster is configured with authentication or encryption set to "required",
clients older than Kudu 1.3 will be unable to connect.
* If a Kudu 1.14 cluster is configured with authentication and encryption set to "optional"
or "disabled", older clients will still be able to connect.

[[rn_1.14.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.14.0


[[rn_1.14.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.14 Java client library is API- and ABI-compatible with Kudu 1.13. Applications
written against Kudu 1.13 will compile and run against the Kudu 1.14 client library and
vice-versa.

* The Kudu 1.14 {cpp} client is API- and ABI-forward-compatible with Kudu 1.13.
Applications written and compiled against the Kudu 1.13 client library will run without
modification against the Kudu 1.14 client library. Applications written and compiled
against the Kudu 1.14 client library will run without modification against the Kudu 1.13
client library.

* The Kudu 1.14 Python client is API-compatible with Kudu 1.13. Applications
written against Kudu 1.13 will continue to run against the Kudu 1.14 client
and vice-versa.

[[rn_1.14.0_known_issues]]
== Known Issues and Limitations

Please refer to the link:known_issues.html[Known Issues and Limitations] section of the
documentation.

[[rn_1.14.0_contributors]]
== Contributors

Kudu 1.14.0 includes contributions from 12 people, including 1 first-time
contributors:

* liguohao

Thank you for your contributions!

[[rn_1.13.0]]
= Apache Kudu 1.13.0 Release Notes

[[rn_1.13.0_upgrade_notes]]
== Upgrade Notes

* The Sentry integration has been removed and the Ranger integration should now
be used in its place for fine-grained authorization.

[[rn_1.13.0_deprecations]]
== Deprecations

* Support for Python 2.x and Python 3.4 and earlier is deprecated and may be
removed in the next minor release.
* The `kudu-mapreduce` integration has been deprecated and may be removed in the
next minor release. Similar functionality and capabilities now exist via the
Apache Spark, Apache Hive, Apache Impala, and Apache NiFi integrations.

[[rn_1.13.0_new_features]]
== New features

* Added table ownership support. All newly created tables are automatically
owned by the user creating them. It is also possible to change the owner by
altering the table. You can also assign privileges to table owners via Apache
Ranger (see link:https://issues.apache.org/jira/browse/KUDU-3090[KUDU-3090]).
* An experimental feature is added to Kudu that allows it to automatically
rebalance tablet replicas among tablet servers. The background task can be
enabled by setting the `--auto_rebalancing_enabled` flag on the Kudu masters.
Before starting auto-rebalancing on an existing cluster, the CLI rebalancer
tool should be run first (see
link:https://issues.apache.org/jira/browse/KUDU-2780[KUDU-2780]).
* Bloom filter column predicate pushdown has been added to allow optimized
execution of filters which match on a set of column values with a
false-positive rate. Support for Impala queries utilizing Bloom filter
predicate is available yielding performance improvements of 19% to 30% in TPC-H
benchmarks and around 41% improvement for distributed joins across large
tables. Support for Spark is not yet available. (see
link:https://issues.apache.org/jira/browse/KUDU-2483[KUDU-2483]).
* AArch64-based (ARM) architectures are now supported including published Docker
images.
* The Java client now supports the columnar row format returned from the server
transparently. Using this format can reduce the server CPU and size of the
request over the network for scans. The columnar format can be enabled via the
setRowDataFormat() method on the KuduScanner.
* An experimental feature that can be enabled by setting the
`--enable_workload_score_for_perf_improvement_ops` prioritizes flushing and
compacting hot tablets.

[[rn_1.13.0_improvements]]
== Optimizations and improvements

* Hive metastore synchronization now supports Hive 3 and later.
* The Spark KuduContext accumulator metrics now track operation counts per table
instead of cumulatively for all tables.
* The `kudu local_replica delete` CLI tool now accepts multiple tablet
identifiers. Along with the newly added `--ignore_nonexistent` flag, this
helps with scripting scenarios when removing multiple tablet replicas from a
particular Tablet Server.
* Both Master’s and Tablet Server’s web UI now displays the name for a service
thread pool group at the `/threadz` page
* Introduced `queue_overflow_rejections_` metrics for both Masters and Tablet
Servers: number of RPC requests of a particular type dropped due to RPC
service queue overflow.
* Introduced a CoDel-like queue control mechanism for the apply queue. This
helps to avoid accumulating too many write requests and timing them out in
case of seek-bound workloads (e.g., uniform random inserts). The newly
introduced queue control mechanism is disabled by default. To enable it, set
the `--tablet_apply_pool_overload_threshold_ms` Tablet Server’s flag to
appropriate value, e.g. 250 (see
link:https://issues.apache.org/jira/browse/KUDU-1587[KUDU-1587]).
* Java client’s error collector can be resized (see
link:https://issues.apache.org/jira/browse/KUDU-1422[KUDU-1422]).
* Calls to the Kudu master server are now drastically reduced when using scan
tokens. Previously deserializing a scan token would result in a GetTableSchema
request and potentially a GetTableLocations request. Now the table schema and
location information is serialized into the scan token itself avoiding the
need for any requests to the master when processing them.
* The default size of Master’s RPC queue is now 100 (it was 50 in earlier
releases). This is to optimize for use cases where a Kudu cluster has many
clients working concurrently.
* Masters now have an option to cache table location responses. This is
targeted for Kudu clusters which have many clients working concurrently. By
default, the caching of table location responses is disabled. To enable table
location caching, set the proper capacity of the table location cache using
Master’s `--table_locations_cache_capacity_mb` flag (setting to 0 disables the
caching). Up to 17% of improvement is observed in GetTableLocations request
rate when enabling the caching.
* Removed lock contention on Raft consensus lock in Tablet Servers while
processing a write request. This helps to avoid RPC queue overflows when
handling concurrent write requests to the same tablet from multiple clients
(see link:https://issues.apache.org/jira/browse/KUDU-2727[KUDU-2727]).
* Master’s performance for handling concurrent GetTableSchema requests has been
improved. End-to-end tests indicated up to 15% improvement in sustained
request rate for high concurrency scenarios.
* Kudu servers now use protobuf Arena objects to perform all RPC
request/response-related memory allocations. This gives a boost for overall
RPC performance, and with further optimization the result request rate
was increased significantly for certain methods. For example, the result request
rate increased up to 25% for Master’s GetTabletLocations() RPC in case of
highly concurrent scenarios (see
link:https://issues.apache.org/jira/browse/KUDU-636[KUDU-636]).
* Tablet Servers now use protobuf Arena for allocating Raft-related runtime
structures. This results in substantial reduction of CPU cycles used and
increases write throughput (see
link:https://issues.apache.org/jira/browse/KUDU-636[KUDU-636]).
* Tablet Servers now use protobuf Arena for allocating EncodedKeys to reduce
allocator contention and improve memory locality (see
link:https://issues.apache.org/jira/browse/KUDU-636[KUDU-636]).
* Bloom filter predicate evaluation for scans can be computationally expensive.
A heuristic has been added that verifies rejection rate of the supplied Bloom
filter predicate below which the Bloom filter predicate is automatically
disabled. This helped reduce regression observed with Bloom filter predicate
in TPC-H benchmark query #9 (see
link:https://issues.apache.org/jira/browse/KUDU-3140[KUDU-3140]).
* Improved scan performance of dictionary and plain-encoded string columns by
avoiding copying them (see
link:https://issues.apache.org/jira/browse/KUDU-2844[KUDU-2844]).
* Improved maintenance manager's heuristics to prioritize larger memstores
(see link:https://issues.apache.org/jira/browse/KUDU-3180[KUDU-3180]).
* Spark client's KuduReadOptions now supports setting a snapshot timestamp for
repeatable reads with READ_AT_SNAPSHOT consistency mode (see
link:https://issues.apache.org/jira/browse/KUDU-3177[KUDU-3177]).

[[rn_1.13.0_fixed_issues]]
== Fixed Issues

* Kudu scans now honor location assignments when multiple tablet servers are
co-located with the client.
* Fixed a bug that caused IllegalArgumentException to be thrown when trying to
create a predicate for a DATE column in Kudu Java client (see
link:https://issues.apache.org/jira/browse/KUDU-3152[KUDU-3152]).
* Fixed a potential race when multiple RPCs work on the same scanner object.

[[rn_1.13.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.13.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.13 clients may connect to servers running Kudu 1.0 or later. If the client uses
features that are not available on the target server, an error will be returned.
* Rolling upgrade between Kudu 1.12 and Kudu 1.13 servers is believed to be possible
though has not been sufficiently tested. Users are encouraged to shut down all nodes
in the cluster, upgrade the software, and then restart the daemons on the new version.
* Kudu 1.0 clients may connect to servers running Kudu 1.13 with the exception of the
below-mentioned restrictions regarding secure clusters.

The authentication features introduced in Kudu 1.3 place the following limitations
on wire compatibility between Kudu 1.13 and versions earlier than 1.3:

* If a Kudu 1.13 cluster is configured with authentication or encryption set to "required",
clients older than Kudu 1.3 will be unable to connect.
* If a Kudu 1.13 cluster is configured with authentication and encryption set to "optional"
or "disabled", older clients will still be able to connect.

[[rn_1.13.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.13.0


[[rn_1.13.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.13 Java client library is API- and ABI-compatible with Kudu 1.12. Applications
written against Kudu 1.12 will compile and run against the Kudu 1.13 client library and
vice-versa.

* The Kudu 1.13 {cpp} client is API- and ABI-forward-compatible with Kudu 1.12.
Applications written and compiled against the Kudu 1.12 client library will run without
modification against the Kudu 1.13 client library. Applications written and compiled
against the Kudu 1.13 client library will run without modification against the Kudu 1.12
client library.

* The Kudu 1.13 Python client is API-compatible with Kudu 1.12. Applications
written against Kudu 1.12 will continue to run against the Kudu 1.13 client
and vice-versa.

[[rn_1.13.0_known_issues]]
== Known Issues and Limitations

Please refer to the link:known_issues.html[Known Issues and Limitations] section of the
documentation.

[[rn_1.13.0_contributors]]
== Contributors

Kudu 1.13.0 includes contributions from 22 people, including 9 first-time
contributors:

* Jim Apple
* Kevin J McCarthy
* Li Zhiming
* Mahesh Reddy
* Romain Rigaux
* RuiChen
* Shuping Zhou
* ningw
* wenjie

[[rn_1.12.0]]
= Apache Kudu 1.12.0 Release Notes

[[rn_1.12.0_upgrade_notes]]
== Upgrade Notes


[[rn_1.12.0_obsoletions]]
== Obsoletions

* The Flume sink has been migrated to the Apache Flume project and removed
from Kudu. Users depending on the Flume integration can use the old
`kudu-flume` jars or migrate to the Flume jars containing the Kudu sink.

* Support for Apache Sentry authorization has been deprecated and may be
removed in the next minor release. Users depending on the Sentry integration
should migrate to the Apache Ranger integration for fine-grained authorization.

* Support for Python 2 has been deprecated and may be removed in the next minor
release.

* Support for CentOS/RHEL 6, Debian 8, Ubuntu 14 has been deprecated and may
be removed in the next minor release.

[[rn_1.12.0_deprecations]]
== Deprecations


[[rn_1.12.0_new_features]]
== New features

* Kudu now supports native fine-grained authorization via integration with
Apache Ranger. Kudu may now enforce access control policies defined for
Kudu tables and columns stored in Ranger. See the
link:security.html#fine_grained_authz[authorization documentation]
for more details.

* Kudu’s web UI now supports proxying via Apache Knox. Kudu may be deployed
in a firewalled state behind a Knox Gateway which will forward HTTP requests
and responses between clients and the Kudu web UI.

* Kudu’s web UI now supports HTTP keep-alive. Operations that access multiple
URLs will now reuse a single HTTP connection, improving their performance.

* The `kudu tserver quiesce` tool is added to quiesce tablet servers. While a
tablet server is quiescing, it will stop hosting tablet leaders and stop
serving new scan requests. This can be used to orchestrate a rolling restart
without stopping on-going Kudu workloads.

* Introduced `auto` time source for HybridClock timestamps. With
`--time_source=auto` in AWS and GCE cloud environments, Kudu masters and
tablet servers use the built-in NTP client synchronized with dedicated NTP
servers available via host-only networks. With `--time_source=auto` in
environments other than AWS/GCE, Kudu masters and tablet servers rely on
their local machine's clock synchronized by NTP. The default setting for
the HybridClock time source (`--time_source=system`) is backward-compatible,
requiring the local machine's clock to be synchronized by the kernel's NTP
discipline.

* The `kudu cluster rebalance` tool now supports moving replicas away from
specific tablet servers by supplying the `--ignored_tservers` and
`--move_replicas_from_ignored_tservers` arguments (see
link:https://issues.apache.org/jira/browse/KUDU-2914[KUDU-2914] for more
details).

* The `kudu table create` tool is added to allow users to specify table
creation options using JSON.

* Kudu now supports DATE and VARCHAR data types. See the
link:http://kudu.apache.org/docs/schema_design.html[schema design documentation]
for more details.


[[rn_1.12.0_improvements]]
== Optimizations and improvements

* Write Ahead Log file segments and index chunks are now managed by Kudu’s file
cache. With that, all long-lived file descriptors used by Kudu are managed by
the file cache, and there’s no longer a need for capacity planning of file
descriptor usage.

* Kudu no longer requires the running of `kudu fs update_dirs` to change a
directory configuration or recover from a disk failure
(see link:https://issues.apache.org/jira/browse/KUDU-2993[KUDU-2993]).

* Kudu tablet servers and masters now expose a tablet-level metric
`num_raft_leaders` for the number of Raft leaders hosted on the server.

* Kudu's maintenance operation scheduling has been updated to prioritize
reducing WAL retention under memory pressure. Kudu would previously prioritize
operations that yielded high-memory reduction, which could result in high WAL
disk usage in workloads that contained updates
(see link:https://issues.apache.org/jira/browse/KUDU-3002[KUDU-3002]).

* A new maintenance operation is introduced to remove rowsets that have had all
of their rows deleted and whose newest delete operations are considered
ancient (see link:https://issues.apache.org/jira/browse/KUDU-1625[KUDU-1625]).

* The built-in NTP client is now fully supported as the time source for Kudu's
HybridTime clock, i.e. it's no longer marked as experimental. To switch the
time source from the existing `system` time source (which is the default)
to the built-in NTP client, use `--time_source=builtin`.

* Introduced additional metrics for the built-in NTP client
(see link:https://issues.apache.org/jira/browse/KUDU-3048[KUDU-3048]).

* Updated `/config` page of masters' and tablet servers' web UI to display
configured and effective time source. In addition, the effective list of
reference servers for the built-in NTP client is shown there as well,
if applicable.

* `chronyd` (version 3.4 and newer) is now supported as NTP server for
synchronizing the local machine's clock in a Kudu cluster. It's important to
have the `rtcsync` option enabled in the configuration of the `chronyd` NTP
daemon (see link:https://issues.apache.org/jira/browse/KUDU-2573[KUDU-2573]).

* Kudu now supports building and running on RHEL/CentOS 8. This has been tested
with CentOS 8.1.

* The processing of Raft consensus vote requests has been improved to be more
robust during high contention scenarios like election storms.

* Added a validator to enforce consistency between the maximum size of an RPC
and the maximum size of tablet transaction memory, controlled by
`--rpc_max_message_size` and `--tablet_transaction_memory` flags
correspondingly.  In prior releases, if the limit on the size of RPC requests
is increased and the limit on tablet transaction memory size is kept with the
default setting, certain Raft transactions could be committed but not applied
(see link:https://issues.apache.org/jira/browse/KUDU-3023[KUDU-3023]).

* The metrics endpoint now supports filtering metrics by a metric severity level.
See the link:https://kudu.apache.org/docs/administration.html#_collecting_metrics_via_http[documentation]
for more details.

* Many `kudu local_replica` tools are updated to not open the block manager,
which significantly reduces the amount of IO done when running them (see
link:https://issues.apache.org/jira/browse/KUDU-3070[KUDU-3070] for more
details).

* The Kudu Java client now exposes a way to get the resource metrics associated
with a given scanner (see
link:https://issues.apache.org/jira/browse/KUDU-2162[KUDU-2162] for more
details).

* Scan predicates are pushed down to RLE decoders, improving
predicate-evaluation-efficiency in some workloads (see
link:https://issues.apache.org/jira/browse/KUDU-2852[KUDU-2852] for more
details).

* The log block manager will now attempt to use multiple threads to open blocks
in each data directory, in some tests reducing startup time by up to 20% (see
link:https://issues.apache.org/jira/browse/KUDU-2977[KUDU-2977] and
link:https://issues.apache.org/jira/browse/KUDU-3001[KUDU-3001] for more
details).

* Kudu's tablet server web UI scans page is updated to show the number of round
trips per scanner.

* Kudu's master and tablet server web UIs are updated to show critical
partition information, including tablet count and on-disk size.

* Kudu servers now expose the `last_read_elapsed_seconds` and
`last_write_elapsed_seconds` tablet-level metrics that indicate how long ago
the most recent read and write operations to a given tablet were.

* Kudu servers now expose the `transaction_memory_limit_rejections`
tablet-level metric that tracks the number of transactions rejected because a
given tablet's transactional memory limit was reached (see
link:https://issues.apache.org/jira/browse/KUDU-3021[KUDU-3021] for more
details).

[[rn_1.12.0_fixed_issues]]
== Fixed Issues

* Fixed a bug in which Kudu would not schedule compactions if a server were
under memory pressure
(see link:https://issues.apache.org/jira/browse/KUDU-2929[KUDU-2929]).

* Fixed a bug where DDL operations like ALTER TABLE on tables with huge
number of partitions might result in a DoS situation for Kudu masters
(see link:https://issues.apache.org/jira/browse/KUDU-3036[KUDU-3036]).

* Fixed a bug where Kudu Java client cannot negotiate a secure connection
with Kudu masters and tablet servers if using BouncyCastle JCE provider
(see link:https://issues.apache.org/jira/browse/KUDU-3106[KUDU-3106]).

* Kudu masters will now crash immediately upon hitting a disk failure (see
link:https://issues.apache.org/jira/browse/KUDU-2904[KUDU-2904] for more details).

* Fixed an issue in the Kudu master in which delays in receiving tablet server
heartbeats could result in an excess amount of RPC traffic between the
masters and tablet servers (see
link:https://issues.apache.org/jira/browse/KUDU-2992[KUDU-2992] for more
details).

* Fixed an issue with Kudu's location placement policy that would place all
replicas in one location when two locations were available (see
link:https://issues.apache.org/jira/browse/KUDU-3008[KUDU-3008] for more
details).

* The Java client will now correctly propagate timestamps when sending write
batches (see link:https://issues.apache.org/jira/browse/KUDU-3035[KUDU-3035]
for more detail).

* Fixed an issue with the Kudu backup Spark jobs in which Kudu would return
with a non-zero exit if the job succeeded but backed up no rows (see
link:https://issues.apache.org/jira/browse/KUDU-3099[KUDU-3099] for more
details).

* The `raft_term` and `time_since_last_leader_heartbeat` aggregated table
metrics will now return the maximum metric reported instead of the sum.

[[rn_1.12.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.12.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.12 clients may connect to servers running Kudu 1.0 or later. If the client uses
features that are not available on the target server, an error will be returned.
* Rolling upgrade between Kudu 1.11 and Kudu 1.12 servers is believed to be possible
though has not been sufficiently tested. Users are encouraged to shut down all nodes
in the cluster, upgrade the software, and then restart the daemons on the new version.
* Kudu 1.0 clients may connect to servers running Kudu 1.12 with the exception of the
below-mentioned restrictions regarding secure clusters.

The authentication features introduced in Kudu 1.3 place the following limitations
on wire compatibility between Kudu 1.12 and versions earlier than 1.3:

* If a Kudu 1.12 cluster is configured with authentication or encryption set to "required",
clients older than Kudu 1.3 will be unable to connect.
* If a Kudu 1.12 cluster is configured with authentication and encryption set to "optional"
or "disabled", older clients will still be able to connect.

[[rn_1.12.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.12.0


[[rn_1.12.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.12 Java client library is API- and ABI-compatible with Kudu 1.11. Applications
written against Kudu 1.11 will compile and run against the Kudu 1.12 client library and
vice-versa.

* The Kudu 1.12 {cpp} client is API- and ABI-forward-compatible with Kudu 1.11.
Applications written and compiled against the Kudu 1.11 client library will run without
modification against the Kudu 1.12 client library. Applications written and compiled
against the Kudu 1.12 client library will run without modification against the Kudu 1.11
client library.

* The Kudu 1.12 Python client is API-compatible with Kudu 1.11. Applications
written against Kudu 1.11 will continue to run against the Kudu 1.12 client
and vice-versa.

[[rn_1.12.0_known_issues]]
== Known Issues and Limitations

Please refer to the link:known_issues.html[Known Issues and Limitations] section of the
documentation.

[[rn_1.12.0_contributors]]
== Contributors

Kudu 1.12 includes contributions from 33 people, including 8 first-time
contributors:

* Andy Singer
* Michele Milesi
* Ning Wang
* Renhai Zhao
* Sheng Liu
* Thomas D'Silva
* Tianhua Huang
* Waleed Fateem

Thank you for your help in making Kudu even better!

[[rn_1.11.1]]
Apache Kudu 1.11.1 is a bug-fix release which fixes one critical licensing
issue in Kudu 1.11.0.

[[rn_1.11.1_upgrade_notes]]
== Upgrade Notes
When upgrading from earlier versions of Kudu, if support for Kudu's NVM
(non-volatile memory) block cache is desired, install the `memkind` library
of version 1.8.0 or newer as documented in link:installation.html[Kudu
Installation] for corresponding platform. This is a mandatory step for existing
users of the NVM block cache (i.e. those who set `--block_cache_type=NVM`
for `kudu-master` and `kudu-tserver`): they must install `memkind`, otherwise
their Kudu processes will crash at startup.

[[rn_1.11.1_fixed_issues]]
== Fixed Issues
* Fixed an issue with distributing `libnuma` dynamic library with `kudu-binary`
  JAR artifact. Also, fixed the issue of statically compiling in `libnuma.a`
  into `kudu-master` and `kudu-tserver` binaries when building Kudu
  from source in release mode. The fix removes both `numactl` and `memkind`
  projects from Kudu's thirdparty dependencies and makes the dependency on the
  `libmemkind` library optional, opening the library using `dlopen()` and
  resolving required symbols via `dlsym()`
  (see link:https://issues.apache.org/jira/browse/KUDU-2990[KUDU-2990]).

* Fixed an issue with `kudu cluster rebalancer` CLI tool crashing when running
  against a location-aware cluster if a tablet server in one location doesn't
  contain a single tablet replica
  (see link:https://issues.apache.org/jira/browse/KUDU-2987[KUDU-2987]).

* Fixed an issue with connection negotiation using SASL mechanism when server
  FQDN is longer than 64 characters
  (see link:https://issues.apache.org/jira/browse/KUDU-2989[KUDU-2989]).

* Fixed an issue in the test harness of the kudu-binary JAR artifact. With this
  fix, `kudu-master` and `kudu-tserver` processes of the mini-cluster's test
  harness no longer rely on the test NTP server to synchronize their built-in
  NTP client. Instead, the test harness relies on the local machine clock
  synchronized by the system NTP daemon
  (see link:https://issues.apache.org/jira/browse/KUDU-2994[KUDU-2994]).

[[rn_1.11.0]]
= Apache Kudu 1.11.0 Release Notes

[[rn_1.11.0_upgrade_notes]]
== Upgrade Notes

* Since link:https://issues.apache.org/jira/browse/KUDU-2625[KUDU-2625] is
  addressed, tablet servers now reject individual write operations which
  violate schema constraints in a batch of write operations. In prior versions
  the behavior was to reject the whole batch of write operations if a violation
  of the schema constraints is detected even for a single row. It's recommended
  to revise applications which relied on the behavior mentioned above
  upon upgrading to Kudu 1.11.0.

[[rn_1.11.0_deprecations]]
== Deprecations

* The Kudu Flume integration is deprecated and may be removed in the
  next minor release. The integration will be moved to the Apache Flume
  project going forward
  (see link:https://issues.apache.org/jira/browse/FLUME-3345[FLUME-3345]).

[[rn_1.11.0_new_features]]
== New features

* Kudu now supports putting tablet servers into maintenance. While in this
  mode, the tablet server's replicas will not be re-replicated if it fails.
  Only upon exiting maintenance will re-replication be triggered for any
  remaining under-replicated tablets. The `kudu tserver state enter_maintenance`
  and `kudu tserver state exit_maintenance` tools are added to orchestrate
  tablet server maintenance, and the `kudu tserver list` tool is amended with
  a "state" column option to display current state of each tablet server
  (see link:https://issues.apache.org/jira/browse/KUDU-2069[KUDU-2069]).

* Kudu now has a built-in NTP client which maintains the internal wallclock
  time used for generation of HybridTime timestamps. When enabled, system clock
  synchronization for nodes running Kudu is no longer necessary. This is useful
  for containerized deployments and in other cases when it's troublesome
  to maintain properly configured system NTP service at each node of a Kudu
  cluster. The list of NTP servers to synchronize against is specified with the
  `--builtin_ntp_servers` flag. By default, Kudu masters and tablet servers use
  public servers hosted by the NTP Pool project. To use the built-in NTP
  client, set `--time_source=builtin` and reconfigure `--builtin_ntp_servers`
  if necessary
  (see link:https://issues.apache.org/jira/browse/KUDU-2935[KUDU-2935]).

* Aggregated table statistics are now available to Kudu clients via
  `KuduClient.getTableStatistics()` and `KuduTable.getTableStatistics()`
  methods in the Kudu Java client and `KuduClient.GetTableStatistics()`
  in the Kudu {cpp} client. This allows for various query optimizations.
  For example, Spark now uses it to perform join optimizations.
  The statistics are available via the API of both {cpp} and Java Kudu clients.
  In addition, per-table statistics are available via `kudu table statistics`
  CLI tool. The statistics are also available via master's Web UI at
  `master:8051/metrics` and `master:8051/table?id=<uuid>` URIs
  (see link:https://issues.apache.org/jira/browse/KUDU-2797[KUDU-2797] and
   link:https://issues.apache.org/jira/browse/KUDU-2921[KUDU-2921]).

* The `kudu` CLI tool now supports altering table columns. Use the newly
  introduced sub-commands such as `kudu table column_set_default`,
  `kudu table column_remove_default`, `kudu table column_set_compression`,
  `kudu table column_set_encoding`, and `kudu table column_set_block_size`
  to alter a column of the specified table.

* The `kudu` CLI tool now supports dropping table columns. Use the newly
  introduced `kudu table delete_column` sub-command to drop a column of the
  specified table.

* The `kudu` CLI tool now supports getting and setting extra
  configuration properties for a table. Use `kudu table get_extra_configs`
  and `kudu table set_extra_config` sub-commands to perform the corresponding
  operations
  (see link:https://issues.apache.org/jira/browse/KUDU-2514[KUDU-2514]).

* The `kudu` CLI tool now supports creating and dropping range partitions
  for a table. Use `kudu table add_range_partition` and
  `kudu table drop_range_partition` sub-commands to perform the corresponding
  operations
  (see link:https://issues.apache.org/jira/browse/KUDU-2881[KUDU-2881]).

[[rn_1.11.0_improvements]]
== Optimizations and improvements

* The `kudu fs dump uuid` CLI tool is now significantly faster and consumes
  significantly less IO.

* The memory consumed by CFileReaders and BloomFileReaders is factored out and
  accounted separately by the tablet server memory tracking. The stats are
  available via Web UI as "CFileReaders" and "BloomFileReaders" entries.

* `KuduScanBatch::const_iterator` in Kudu {cpp} client now supports
  `operator->()`
  (see link:https://issues.apache.org/jira/browse/KUDU-1561[KUDU-1561]).

* Master server Web UI now supports sorting the list of tables by the columns
  of "Table Name", "Create Time", and "Last Alter Time".

* Tablet servers now expand a tablet's data directory group with available
  healthy directories when all directories of the group are full
  (see link:https://issues.apache.org/jira/browse/KUDU-2907[KUDU-2907]).

* For scan operations run with `CLOSEST_REPLICA` selection mode, the Kudu Java
  client now picks a random available replica in case no replica is located at
  the same node with the client that initiated the scan operation. This helps
  to spread the load generated by multiple scan requests to the same tablet
  among all available replicas. In prior releases, all such scan requests might
  end up fetching data from the same tablet replica
  (see link:https://issues.apache.org/jira/browse/KUDU-2348[KUDU-2348]).

* The serialization of in-memory rows to Kudu's wire format has been optimized
  to be more CPU efficient
  (see link:https://issues.apache.org/jira/browse/KUDU-2847[KUDU-2847]).

* Tablet servers and masters can now aggregate metrics by the same attribute.
  For example, it's now possible to fetch aggregated metrics from a tablet
  server by retrieving data from URLs of form
  `http://<host>:<port>/metrics?merge_rules=tablet|table|table_name`

* Introduced Docker image for Python Kudu client
  (see link:https://issues.apache.org/jira/browse/KUDU-2849[KUDU-2849]).

* Tablet servers now consider available disk space when choosing a set of data
  directories for a tablet's data directory group, and when deciding in which
  data directory a new block should be written
  (see link:https://issues.apache.org/jira/browse/KUDU-2901[KUDU-2901]).

* Added a quick-start example of using Apache Spark to load, query, and modify
  a real data set stored in Kudu.

* Added a quick-start example of using Apache Nifi to ingest data into Kudu.

* Tablet servers now reject individual write operations which violate schema
  constraints in a batch of write operations received from a client. The
  previous behavior was to reject the whole batch of write operations
  if a violation of the schema constraints is detected even for a single row
  (see link:https://issues.apache.org/jira/browse/KUDU-2625[KUDU-2625]).

* Tablet replicas can now be optionally placed in accordance with a
  dimension-based placement policy. To specify a dimension label for a table,
  use the `KuduTableCreator::dimension_label()` and
  `CreateTableOptions.setDimensionLabel()` methods of the {cpp} and Java Kudu
  clients. To add a partition with a dimension label, use the
  `KuduTableAlterer::AddRangePartitionWithDimension()` and
  `AlterTableOptions.addRangePartition()` methods of the {cpp} and Java Kudu
  clients
  (see link:https://issues.apache.org/jira/browse/KUDU-2823[KUDU-2823]).

* Kudu RPC now enables TCP keepalive for all outbound connections for faster
  detection of no-longer-reachable nodes
  (see link:https://issues.apache.org/jira/browse/KUDU-2192[KUDU-2192]).

* The `kudu table scan` and `kudu table copy` CLI tools now fail gracefully
  rather than crashing upon hitting an error
  (see link:https://issues.apache.org/jira/browse/KUDU-2851[KUDU-2851]).

* Optimized decoding of deltas' timestamps
  (see link:https://issues.apache.org/jira/browse/KUDU-2867[KUDU-2867]).

* Optimized the initialization of DeltaMemStore for the case when no matching
  deltas are present
  (see link:https://issues.apache.org/jira/browse/KUDU-2381[KUDU-2381]).

* Improved the rehydration of scan tokens. Now a scan token created
  before renaming a column can be used even after the column has been renamed.

* The memory reserved by tcmalloc is now released to OS periodically to avoid
  potential OOM issues in the case of read-only workloads
  (see link:https://issues.apache.org/jira/browse/KUDU-2836[KUDU-2836]).

* Optimized evaluation of predicates on columns of primitive types and
  `NULL`/`NOT NULL` predicates to leverage SIMD instructions
  (see link:https://issues.apache.org/jira/browse/KUDU-2846[KUDU-2846]).

[[rn_1.11.0_fixed_issues]]
== Fixed Issues

* Fixed an issue of fault-tolerant scan operation failing for a projection
  with key columns specified in other than the table schema's order
  (see link:https://issues.apache.org/jira/browse/KUDU-2980[KUDU-2980]).

* Fixed an issue that would cause frequent leader elections in case when
  persisting Raft transactions to the WAL took longer than the leader
  election timeout. The issue was contributing to election storms
  (see link:https://issues.apache.org/jira/browse/KUDU-2947[KUDU-2947]).

* Fixed a tablet server crash in cases where blocks were not removed due to IO
  error. This issue may have surfaced after recovering from a disk failure
  (see link:https://issues.apache.org/jira/browse/KUDU-2635[KUDU-2635]).

* Fixed a crash in master and tablet server by validating the size of default
  values when de-serializing `ColumnSchemaPB`
  (see link:https://issues.apache.org/jira/browse/KUDU-2622[KUDU-2622]).

* Fixed RPC negotiation failure in the case when TLS v1.3 is supported at
  both the client and the server side. This is a temporary workaround before
  the connection negotiation code is properly updated to support 1.5-RTT
  handshake used in TLS v1.3. The issue affected Linux distributions shipped
  or updated with OpenSSL version 1.0.2 and newer
  (see link:https://issues.apache.org/jira/browse/KUDU-2871[KUDU-2871]).

* Fixed a race between `GetTabletLocations()` and tablet report processing.
  The race could crash the Kudu master
  (see link:https://issues.apache.org/jira/browse/KUDU-2842[KUDU-2842]).

* Fixed a bug in `AlterSchemaTransactionState::ToString()` that led to a crash
  of tablet server when removing a tablet replica with a pending `AlterSchema`
  transaction.

[[rn_1.11.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.11.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.11 clients may connect to servers running Kudu 1.0 or later. If the client uses
  features that are not available on the target server, an error will be returned.
* Rolling upgrade between Kudu 1.10 and Kudu 1.11 servers is believed to be possible
  though has not been sufficiently tested. Users are encouraged to shut down all nodes
  in the cluster, upgrade the software, and then restart the daemons on the new version.
* Kudu 1.0 clients may connect to servers running Kudu 1.11 with the exception of the
  below-mentioned restrictions regarding secure clusters.

The authentication features introduced in Kudu 1.3 place the following limitations
on wire compatibility between Kudu 1.11 and versions earlier than 1.3:

* If a Kudu 1.11 cluster is configured with authentication or encryption set to "required",
  clients older than Kudu 1.3 will be unable to connect.
* If a Kudu 1.11 cluster is configured with authentication and encryption set to "optional"
  or "disabled", older clients will still be able to connect.

[[rn_1.11.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.11 Java client library is API- and ABI-compatible with Kudu 1.10. Applications
  written against Kudu 1.10 will compile and run against the Kudu 1.11 client library and
  vice-versa.

* The Kudu 1.11 {cpp} client is API- and ABI-forward-compatible with Kudu 1.10.
  Applications written and compiled against the Kudu 1.10 client library will run without
  modification against the Kudu 1.11 client library. Applications written and compiled
  against the Kudu 1.11 client library will run without modification against the Kudu 1.10
  client library.

* The Kudu 1.11 Python client is API-compatible with Kudu 1.10. Applications
  written against Kudu 1.10 will continue to run against the Kudu 1.11 client
  and vice-versa.

[[rn_1.11.0_known_issues]]
== Known Issues and Limitations

Please refer to the link:known_issues.html[Known Issues and Limitations] section of the
documentation.

[[rn_1.11.0_contributors]]
== Contributors
Kudu 1.11 includes contributions from 24 people, including 8 first-time
contributors:

* Hannah Nguyen
* lingbin
* Ritwik Yadav
* Scott Reynolds
* Volodymyr Verovkin
* Xiaokai Wang
* Xin He
* Yao Wang

Thank you for your help in making Kudu even better!

[[rn_1.10.1]]
Apache Kudu 1.10.1 is a bug-fix release which fixes one critical licensing
issue in Kudu 1.10.0.

[[rn_1.10.1_upgrade_notes]]
== Upgrade Notes
When upgrading from earlier versions of Kudu, if support for Kudu's NVM
(non-volatile memory) block cache is desired, install the `memkind` library
of version 1.6.0 or newer as documented in link:installation.html[Kudu
Installation] for corresponding platform. This is a mandatory step for existing
users of the NVM block cache (i.e. those who set `--block_cache_type=NVM`
for `kudu-master` and `kudu-tserver`): they must install `memkind`, otherwise
their Kudu processes will crash at startup.

[[rn_1.10.1_fixed_issues]]
== Fixed Issues
* Fixed an issue with distributing `libnuma` dynamic library with `kudu-binary`
  JAR artifact. Also, fixed the issue of statically compiling in `libnuma.a`
  into `kudu-master` and `kudu-tserver` binaries when building Kudu
  from source in release mode. The fix removes both `numactl` and `memkind`
  projects from Kudu's thirdparty dependencies and makes the dependency on the
  `libmemkind` library optional, opening the library using `dlopen()` and
  resolving required symbols via `dlsym()`
  (see link:https://issues.apache.org/jira/browse/KUDU-2990[KUDU-2990]).

[[rn_1.10.0]]
== Release Notes Specific to 1.10.0

[[rn_1.10.0_upgrade_notes]]
== Upgrade Notes

* The default tablet history retention time has been raised from 15 minutes to
  7 days to better support touchless incremental backups
  (see link:https://issues.apache.org/jira/browse/KUDU-2677[KUDU-2677]).

[[rn_1.10.0_obsoletions]]
== Obsoletions


[[rn_1.10.0_deprecations]]
== Deprecations


[[rn_1.10.0_new_features]]
== New features

* Kudu now supports both full and incremental table backups via a job
  implemented using Apache Spark. Additionally it supports restoring
  tables from full and incremental backups via a restore job implemented using
  Apache Spark. See the link:administration.html#backup[backup documentation]
  for more details.

* Kudu can now synchronize its internal catalog with the Apache Hive Metastore,
  automatically updating Hive Metastore table entries upon table creation,
  deletion, and alterations in Kudu. See the
  link:hive_metastore.html#metadata_sync[HMS synchronization documentation]
  for more details.

* Kudu now supports native fine-grained authorization via integration with
  Apache Sentry. Kudu may now enforce access control policies defined for Kudu
  tables and columns, as well as policies defined on Hive servers and databases
  that may store Kudu tables. See the
  link:security.html#fine_grained_authz[authorization documentation] for more
  details.

* Kudu’s web UI now supports SPNEGO, a protocol for securing HTTP requests with
  Kerberos by passing negotiation through HTTP headers. To enable, set the
  `--webserver_require_spnego` command line flag.

* Column comments can now be stored in Kudu tables, and can be updated using
  the AlterTable API
  (see link:https://issues.apache.org/jira/browse/KUDU-1711[KUDU-1711]).

* The Java scan token builder can now create multiple tokens per tablet.
  To use this functionality, call `setSplitSizeBytes()` to specify how many bytes
  of data each token should scan. The same API is also available in Kudu’s
  Spark integration, where it can be used to spawn multiple Spark tasks per
  scanned tablet
  (see link:https://issues.apache.org/jira/browse/KUDU-2670[KUDU-2670]).

* Experimental Kudu Docker images are now published on
  link:https://hub.docker.com/r/apache/kudu[Docker Hub].

* Kudu now has an experimental Kubernetes StatefulSet manifest and Helm chart,
  which can be used to define and provision Kudu clusters using Kubernetes
  (see link:https://issues.apache.org/jira/browse/KUDU-2398[KUDU-2398]).

* The Kudu CLI now has rudimentary YAML-based configuration file support,
  which can be used to provide cluster connection information via cluster name
  instead of keying in comma-separated lists of master addresses.
  See the link:https://kudu.apache.org/docs/administration.html#using_cluster_names_in_kudu_tool[cluster name documentation]
  for more details.

* `kudu perf table_scan` scans a table and displays a table’s row count as well
  as the time it took to run the scan.

* `kudu table copy` copies data from one table to another, within the same
  cluster or across clusters. Note, this implementation leverages a single client,
  therefore it may not be suitable for large tables.

* Tablet history retention time can now be configured on a table-by-table basis.
  (see link:https://issues.apache.org/jira/browse/KUDU-2514[KUDU-2514]).

[[rn_1.10.0_improvements]]
== Optimizations and improvements

* The performance of mutations (i.e. UPDATE, DELETE, and re-INSERT) to
  not-yet-flushed Kudu data has been significantly optimized
  (see link:https://issues.apache.org/jira/browse/KUDU-2826[KUDU-2826] and
  link:https://github.com/apache/kudu/commit/f9f9526d3[f9f9526d3]).

* Predicate performance for primitive columns has been optimized
  (see link:https://issues.apache.org/jira/browse/KUDU-2846[KUDU-2846]).

* IS NULL and IS NOT NULL predicate performance has been optimized
  (see link:https://issues.apache.org/jira/browse/KUDU-2846[KUDU-2846]).

* Optimized the performance of fetching tablet locations from the master for
  tables with large numbers of partitions. This can improve the performance of
  short-running Spark or Impala queries as well as user applications which make
  use of short-lived client instances
  (see link:https://issues.apache.org/jira/browse/KUDU-2711[KUDU-2711]).

* The `tableExists()` (Java) and `TableExists()` (C++) APIs are now more performant
  (see link:https://issues.apache.org/jira/browse/KUDU-2802[KUDU-2802]).

* Fault tolerant scans are now much more performant and consume far less memory
  (see link:https://issues.apache.org/jira/browse/KUDU-2466[KUDU-2466]).

* `kudu cluster ksck` now sends more requests in parallel, which should result
  in a speed-up when running against clusters with many tables or when there’s
  high latency between the node running the CLI and the cluster nodes.

* Kudu’s block manager now deletes spent block containers when needed instead of
  just at server startup. This should reduce server startup times somewhat
  (see link:https://issues.apache.org/jira/browse/KUDU-2636[KUDU-2636]).

* DNS resolutions are now cached by Kudu masters, tablet servers, and
  Kudu C++ clients. The TTL for a resolved DNS entry in the cache is 15 seconds
  by default
  (see link:https://issues.apache.org/jira/browse/KUDU-2791[KUDU-2791]).

* Tables created in Kudu 1.10.0 or later will show their creation time as well
  as their last alteration time in the web UI
  (see link:https://issues.apache.org/jira/browse/KUDU-2750[KUDU-2750]).

* The Kudu CLI and C++ client now support overriding the local username using
  the ‘KUDU_USER_NAME’ environment variable. This allows operating against a
  Kudu cluster using an identity which differs from the local Unix user on the
  client. Note that this has no effect on secure clusters, where client identity
  is determined by Kerberos authentication
  (see link:https://issues.apache.org/jira/browse/KUDU-2717[KUDU-2717]).

* Kudu C++ client now performs stricter verification on the input data of
  INSERT and UPSERT operations w.r.t. table schema constraints. This helps
  spotting schema violations before sending the data to a tablet server.

* The `KuduScanner` in the Java client is now iterable. Additionally the
  `KuduScannerIterator` will automatically make scanner keep alive calls to
  ensure scanners do not time out while iterating.

* A `KuduPartitioner` API was added to the Java client. The `KuduPartitioner`
  API allows a client to determine which partition a row falls into without
  actually writing that row. For example, the `KuduPartitioner` is used in the
  Spark integration to optionally repartition and pre-sort the data before
  writing to Kudu
  (see link:https://issues.apache.org/jira/browse/KUDU-2674[KUDU-2674] and
  link:https://issues.apache.org/jira/browse/KUDU-2672[KUDU-2672]).

* The `PartialRow` and `RowResult` Java API have new methods that accept and return
  Java Objects. These methods are useful when you don't care about autoboxing
  and your existing type handling logic is based on Java types. See the javadoc
  for more details.

* The Kudu Java client now logs RPC trace summaries instead of full RPC traces when
  the log level is `INFO` or higher. This reduces log noise and makes RPC issues
  more visible in a more compact format
  (see link:https://issues.apache.org/jira/browse/KUDU-2830[KUDU-2830]).

* Kudu servers now display the time at which they were started in their web UIs.

* Kudu tablet servers now display a table’s total column count in the web UI.

* The `/metrics` web UI endpoint now supports filtering on entity types,
  entity IDs, entity attributes, and metric names. This can be used to more
  efficiently collect important metrics when there is a large number of tablets
  on a tablet server.

* The Kudu rebalancer now accepts the `--ignored_tservers` command line
  argument, which can be used to ignore the health status of specific tablet
  servers (i.e. if they are down) when deciding whether or not it’s safe to
  rebalance the cluster.

* `kudu master list` now displays the Raft consensus role of each master in the
  cluster (i.e. LEADER or FOLLOWER)
  (see link:https://issues.apache.org/jira/browse/KUDU-2825[KUDU-2825]).

* `kudu table scan` no longer interleaves its output, and now projects all
  columns without having to manually list the column names.

* `kudu perf loadgen` now supports creating empty tables. The semantics of the
  special value of 0 for `--num_rows_per_thread` flag has changed. A value of 0
  now indicates that no rows should be generated, and a value of -1 indicates
  there should be no limit to the number of rows generated.

* Running `make install` after building Kudu from source will now install the
  Kudu binaries into appropriate locations.
  (see link:https://issues.apache.org/jira/browse/KUDU-1344[KUDU-1344]).

[[rn_1.10.0_fixed_issues]]
== Fixed Issues

* Fixed an issue where the Java client would fail scans that took a very long
  time to return a single block of rows, such as highly selective scans over a
  large amount of data
  (see link:https://issues.apache.org/jira/browse/KUDU-1868[KUDU-1868]).

* Fixed the handling of SERVICE_UNAVAILABLE errors that caused the Java client
  to do unnecessary master lookups.

* Kudu scan tokens now work correctly when the target table is renamed between
  when the scan token is created and when it is rehydrated into a scanner.

* Kudu’s “NTP synchronization wait” behavior at startup now works properly when
  Kudu is run in a containerized environment.

* Fixed a crash when a flush or compaction overlapped with another compaction
  (see link:https://issues.apache.org/jira/browse/KUDU-2807[KUDU-2807]).

* Fixed a rare race at startup where the leader master would fruitlessly try to
  tablet copy to a healthy follower master, causing the cluster to operate as if
  it had two masters until master leadership changed
  (see link:https://issues.apache.org/jira/browse/KUDU-2748[KUDU-2748]).

* Under rare circumstances, it was possible for Kudu to crash in libkrb5 when
  negotiating multiple TLS connections concurrently. This crash has been fixed
  (see link:https://issues.apache.org/jira/browse/KUDU-2706[KUDU-2706]).

* Kudu no longer crashes at startup on machines with disabled CPUs
  (see link:https://issues.apache.org/jira/browse/KUDU-2721[KUDU-2721]).

[[rn_1.10.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.10.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.10 clients may connect to servers running Kudu 1.0 or later. If the client uses
  features that are not available on the target server, an error will be returned.
* Rolling upgrade between Kudu 1.9 and Kudu 1.10 servers is believed to be possible
  though has not been sufficiently tested. Users are encouraged to shut down all nodes
  in the cluster, upgrade the software, and then restart the daemons on the new version.
* Kudu 1.0 clients may connect to servers running Kudu 1.10 with the exception of the
  below-mentioned restrictions regarding secure clusters.

The authentication features introduced in Kudu 1.3 place the following limitations
on wire compatibility between Kudu 1.10 and versions earlier than 1.3:

* If a Kudu 1.10 cluster is configured with authentication or encryption set to "required",
  clients older than Kudu 1.3 will be unable to connect.
* If a Kudu 1.10 cluster is configured with authentication and encryption set to "optional"
  or "disabled", older clients will still be able to connect.

[[rn_1.10.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.10.0

* Support for building and running with Java 7 has been dropped in this release.
  It had been deprecated since Kudu 1.5.0.
  (see link:https://issues.apache.org/jira/browse/KUDU-2099[KUDU-2099]).

[[rn_1.10.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.10 Java client library is API- and ABI-compatible with Kudu 1.9. Applications
  written against Kudu 1.9 will compile and run against the Kudu 1.10 client library and
  vice-versa.

* The Kudu 1.10 {cpp} client is API- and ABI-forward-compatible with Kudu 1.9.
  Applications written and compiled against the Kudu 1.9 client library will run without
  modification against the Kudu 1.10 client library. Applications written and compiled
  against the Kudu 1.10 client library will run without modification against the Kudu 1.9
  client library.

* The Kudu 1.10 Python client is API-compatible with Kudu 1.9. Applications
  written against Kudu 1.9 will continue to run against the Kudu 1.10 client
  and vice-versa.

[[rn_1.10.0_known_issues]]
== Known Issues and Limitations

Please refer to the link:known_issues.html[Known Issues and Limitations] section of the
documentation.

[[rn_1.10.0_contributors]]
== Contributors

Kudu 1.10 includes contributions from 27 people, including 6 first-time contributors:

* Csaba Fulop
* Florentino Sainz
* Guangchao Deng
* Jia Hongchao
* Ye Yuqiang
* Yifan Zhang

Thank you for your help in making Kudu even better!

[[rn_1.9.0]]
== Release Notes Specific to 1.9.0

[[rn_1.9.0_upgrade_notes]]
== Upgrade Notes

* Flume 1.8+ requires Java 8 at runtime even though the Kudu Flume integration
  is Java 7 compatible. Flume 1.9 is the default dependency version as of
  Kudu 1.9.0.

* Hadoop 3.0+ requires Java 8 at runtime even though the Kudu Hadoop integration
  is Java 7 compatible. Hadoop 3.2 is the default dependency version as of
  Kudu 1.9.0.

[[rn_1.9.0_obsoletions]]
== Obsoletions


[[rn_1.9.0_deprecations]]
== Deprecations

* Support for Java 7 has been deprecated since Kudu 1.5.0 and may be removed in
  the next major release.

[[rn_1.9.0_new_features]]
== New features
* Kudu now supports location awareness. When configured, Kudu will make a best
  effort to avoid placing a majority of replicas for a given tablet at the same
  location. The `kudu cluster rebalance` tool has been updated to act in
  accordance with the placement policy of a location-aware Kudu. The
  link:https://kudu.apache.org/releases/1.9.0/docs/administration.html#rack_awareness[administrative
  documentation] has been updated to detail the usage of this feature.

* Docker scripts have been introduced to build and run Kudu on various operating
  systems. See the `/docker` subdirectory of the source repository for more
  details. An link:https://hub.docker.com/r/apache/kudu[official repository] has
  been created for Apache Kudu Docker artifacts.

* Developers integrating with Kudu can now write Java tests that start a Kudu
  mini cluster without having to first locally build and install Kudu. This is
  made possible by the Kudu team providing platform-specific binaries available
  to Gradle or Maven for download and install at test time. More information on
  this feature can be found <<developing.adoc#,here>>. This binary test
  artifact is currently considered to be experimental.

[[rn_1.9.0_improvements]]
== Optimizations and improvements
* When creating a table, the master now enforces a restriction on the total
  number of replicas rather than the total number of partitions. If manually
  overriding `--max_create_tablets_per_ts`, the maximum size of a new table
  has effectively been cut by a factor of its replication factor. Note that
  partitions can still be added after table creation.

* The compaction policy has been updated to favor reducing the number of
  rowsets. This can lead to faster scans and lower bootup times, particularly
  in the face of a “trickling inserts” workload, where rows are inserted slowly
  in primary key order (see
  link:https://issues.apache.org/jira/browse/KUDU-1400[KUDU-1400]).

* A tablet-level metric `average_diskrowset_height` has been added to indicate
  how much a replica needs to be compacted, as indicated by the average number
  of rowsets per unit of keyspace.

* Scans which read multiple columns of tables undergoing a heavy `UPDATE`
  workload are now more CPU efficient. In some cases, scan performance of such
  tables may be several times faster upon upgrading to this release.

* Kudu-Spark users can now provide the short “kudu” format alias to Spark. This
  enables using `.format(“kudu”)` in places where you would have needed to
  provide the fully qualified name like `.format(“org.apache.kudu.spark.kudu")`
  or imported `org.apache.kudu.spark.kudu._` and used the implicit `.kudu`
  functions. The
  link:https://kudu.apache.org/releases/1.9.0/docs/developing.html#_kudu_integration_with_spark[Spark
  integration documentation] has been updated to reflect this improvement.

* The `KuduSink` class has been added to the Spark integration as a
  `StreamSinkProvider`, allowing structured streaming writes into Kudu (see
  link:https://issues.apache.org/jira/browse/KUDU-2640[KUDU-2640]).

* The amount of server-side logging has been greatly reduced for Kudu's
  consensus implementation and background processes. This logging was determined
  to be not useful and unnecessarily verbose.

* The web UI now more obviously depicts which columns are a part of the primary
  key (see link:https://issues.apache.org/jira/browse/KUDU-2477[KUDU-2477]).

* The `kudu table describe` tool has been added to support describing table
  attributes, including schema, partitioning, replication factor, column
  encodings, compressions, and default values.

* The `kudu table scan` tool has been added to scan rows from a table,
  supporting comparison, in-list, and is-null predicates.

* The `kudu locate_row` tool has been added to allow users to determine what
  tablet a given primary key belongs to, and whether a row exists for that
  primary key.

* The `kudu diagnose dump_mem_trackers` tool is added to allow users to output
  the contents of the `/mem-trackers` web UI page in a CSV format.

[[rn_1.9.0_fixed_issues]]
== Fixed Issues
* To avoid glitches and undefined behavior, the Kudu Python client now
  detects and reports on conflicting/incorrect initialization of the OpenSSL
  library.

* Fixed a crash caused by a race between altering tablet schemas and deleting
  tablet replicas (see
  link:https://issues.apache.org/jira/browse/KUDU-1678[KUDU-1678]).

* Fixed an issue that would prevent the `kudu fs update_dirs` tool from
  removing directories in the presence of tablet tombstones (see
  link:https://issues.apache.org/jira/browse/KUDU-2680[KUDU-2680]).

* The `--cmeta_force_fsync` flag may be used to fsync Kudu's consensus
  metadata more aggressively. Setting this to `true` may decrease Kudu's
  performance, but improve its durability in the face of power failures and
  forced shutdowns (see
  link:https://issues.apache.org/jira/browse/KUDU-2195[KUDU-2195]).

* Fixed an issue that would cause an excessive amount of RPC traffic from Kudu
  masters if the tablet servers were configured with duplicated master addresses
  (see link:https://issues.apache.org/jira/browse/KUDU-2684[KUDU-2684]).

* Fixed an issue that would cause the `kudu cluster rebalance` tool to run
  indefinitely in the case of tables with a replication factor of 2 (see
  link:https://issues.apache.org/jira/browse/KUDU-2688[KUDU-2688]).

* Fixed an issue that could lead to a failure to bootstrap tablet replicas
  that were a part of workloads with many alter table operations
  (see link:https://issues.apache.org/jira/browse/KUDU-2690[KUDU-2690]).

* Fixed an issue with the Java scanner's `keepAlive` that could lead to a
  permanent hang in the scanner (see
  link:https://issues.apache.org/jira/browse/KUDU-2710[KUDU-2710]).

* Fixed an issue that would cause undefined behavior upon connecting to a
  secure cluster concurrently from multiple C++ clients (see
  link:https://issues.apache.org/jira/browse/KUDU-2706[KUDU-2706]).

[[rn_1.9.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.9.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.9 clients may connect to servers running Kudu 1.0 or later. If the client uses
  features that are not available on the target server, an error will be returned.
* Rolling upgrade between Kudu 1.8 and Kudu 1.9 servers is believed to be possible
  though has not been sufficiently tested. Users are encouraged to shut down all nodes
  in the cluster, upgrade the software, and then restart the daemons on the new version.
* Kudu 1.0 clients may connect to servers running Kudu 1.9 with the exception of the
  below-mentioned restrictions regarding secure clusters.

The authentication features introduced in Kudu 1.3 place the following limitations
on wire compatibility between Kudu 1.9 and versions earlier than 1.3:

* If a Kudu 1.9 cluster is configured with authentication or encryption set to "required",
  clients older than Kudu 1.3 will be unable to connect.
* If a Kudu 1.9 cluster is configured with authentication and encryption set to "optional"
  or "disabled", older clients will still be able to connect.

[[rn_1.9.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.9.0


[[rn_1.9.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.9 Java client library is API- and ABI-compatible with Kudu 1.8. Applications
  written against Kudu 1.8 will compile and run against the Kudu 1.9 client library and
  vice-versa.

* The Kudu 1.9 {cpp} client is API- and ABI-forward-compatible with Kudu 1.8.
  Applications written and compiled against the Kudu 1.8 client library will run without
  modification against the Kudu 1.9 client library. Applications written and compiled
  against the Kudu 1.9 client library will run without modification against the Kudu 1.8
  client library.

* The Kudu 1.9 Python client is API-compatible with Kudu 1.8. Applications
  written against Kudu 1.8 will continue to run against the Kudu 1.9 client
  and vice-versa.

[[rn_1.9.0_known_issues]]
== Known Issues and Limitations

Please refer to the link:known_issues.html[Known Issues and Limitations] section of the
documentation.

[[rn_1.9.0_contributors]]
== Contributors
Kudu 1.9 includes contributions from 24 people, including 5 first-time contributors:

* Bankim Bhavsar
* Mike Parker
* Mitch Barnett
* Tim Armstrong
* Yingchun Lai

Thank you for your help in making Kudu even better!

[[rn_1.8.0]]
== Release Notes Specific to 1.8.0

[[rn_1.8.0_upgrade_notes]]
== Upgrade Notes

- Upgrading directly from Kudu 1.7.0 is supported and no special upgrade steps are
  required. A rolling upgrade may work, however it has not been tested. When upgrading
  Kudu, it is recommended to first shut down all Kudu processes across the cluster, then
  upgrade the software on all servers, then restart the Kudu processes on all servers in
  the cluster.

- Kudu Flume Sink released with Kudu 1.8.0 is compiled against Apache Flume 1.8 and might
  not function with earlier versions of Flume. Note that Flume 1.8 requires Java 1.8 or
  higher.

- Hadoop 3.0+ requires Java 8 at runtime even though the Kudu Hadoop integration is Java 7
  compatible. Hadoop 3.1 is the default dependency version as of Kudu 1.8.0, used by
  certain features in the Java client.

[[rn_1.8.0_obsoletions]]
== Obsoletions

- The `-table_num_buckets` configuration option of the `kudu perf loadgen` tool is now
  removed in favor of `-table_num_hash_partitions` and `-table_num_range_partitions`
  (see link:https://issues.apache.org/jira/browse/KUDU-1861[KUDU-1861]).

[[rn_1.8.0_deprecations]]
== Deprecations

- Support for Java 7 has been deprecated since Kudu 1.5.0 and may be removed in the next
  major release.

- The `producer.skipMissingColumn`, `producer.skipBadColumnValue`, and
  `producer.warnUnmatchedRows` Kudu Flume sink configuration parameters have been
  deprecated in favor of `producer.missingColumnPolicy`, `producer.badColumnValuePolicy`,
  and `producer.unmatchedRowPolicy` respectively (see
  link:https://issues.apache.org/jira/browse/KUDU-1882[KUDU-1882]).

[[rn_1.8.0_new_features]]
== New features

- Examples showcasing functionality in {cpp}, Java, and Python, previously
  hosted in a separate repository have been added. They can be found in the
  `link:https://github.com/apache/kudu/tree/master/examples[examples/]`
  top-level subdirectory.

- Added `kudu diagnose parse_stacks`, a tool to parse sampled stack traces out of a
  diagnostics log (see link:https://issues.apache.org/jira/browse/KUDU-2353[KUDU-2353]).

- Added support for `IS NULL` and `IS NOT NULL` predicates to the Kudu Python client (see
  link:https://issues.apache.org/jira/browse/KUDU-2399[KUDU-2399]).

- Introduced <<administration.adoc#rebalancer_tool,manual data rebalancer>> into the kudu
  CLI tool. The rebalancer can be used to redistribute table replicas among tablet
  servers. The rebalancer can be run via `kudu cluster rebalance` sub-command. Using the
  new tool, it's possible to rebalance Kudu clusters of version 1.4.0 and newer.

- Added `kudu tserver get_flags` and `kudu master get_flags`, two tools that allow
  superusers to retrieve all the values of command line flags from remote Kudu processes.
  The `get_flags` tools support filtering the returned flags by tag, and by default will
  return only flags that were explicitly set.

- Added `kudu tablet unsafe_replace_tablet`, a tool to replace a tablet with a new one.
  This tool is meant to be used to recover a table when one of its tablets has permanently
  lost all replicas. The data in the tablet that is replaced is lost, so this tool should
  only be used as a last resort (see
  link:https://issues.apache.org/jira/browse/KUDU-2290[KUDU-2290]).

[[rn_1.8.0_improvements]]
== Optimizations and improvements

- There is a new metric for each tablet replica tracking the number of election failures
  since the last successful election attempt and the time since the last heartbeat from
  the leader (see link:https://issues.apache.org/jira/browse/KUDU-2287[KUDU-2287]).

- Kudu now supports building and running on Ubuntu 18.04 (“Bionic Beaver”) (see
  link:https://issues.apache.org/jira/browse/KUDU-2427[KUDU-2427]).

- Kudu now supports building and running against OpenSSL 1.1 (see
  link:https://issues.apache.org/jira/browse/KUDU-1889[KUDU-1889]).

- Added Kerberos support to the Kudu Flume sink (see
  link:https://issues.apache.org/jira/browse/KUDU-2012[KUDU-2012]).

- The Kudu Spark connector now supports Spark Streaming DataFrames (see
  link:https://issues.apache.org/jira/browse/KUDU-2539[KUDU-2539]).

- Added `-tables` filtering argument to `kudu table list` (see
  link:https://issues.apache.org/jira/browse/KUDU-2529[KUDU-2529]).

- Clients now support setting a limit on the number of returned rows in scans (see
  link:https://issues.apache.org/jira/browse/KUDU-16[KUDU-16]).

- Added Pandas support to the Python client (see
  link:https://issues.apache.org/jira/browse/KUDU-1276[KUDU-1276]).

- Enabled configuration of mutation buffer in the Python client (see
  link:https://issues.apache.org/jira/browse/KUDU-2441[KUDU-2441]).

- Added a `keepAlive` API call to the `KuduScanner` and `AsyncKuduScanner` in the Java
  client.  This API can be used to keep the scanners alive on the server when processing
  of messages will take longer than the scanner TTL (see
  link:https://issues.apache.org/jira/browse/KUDU-2095[KUDU-2095]).

- The Kudu Spark integration now uses the keepAlive API when reading data. By default it
  will call keepAlive on a scanner with a period of 15 seconds. This will ensure that
  Spark jobs with large batch sizes or slow processing times do not fail with scanner not
  found errors (see link:https://issues.apache.org/jira/browse/KUDU-2563[KUDU-2563]).

- Number of reactor threads in the {cpp} client is now configurable (see
  link:https://issues.apache.org/jira/browse/KUDU-2368[KUDU-2368]).

- Added an optimization to reduce CPU consumption when performing hot metadata lookups in
  the {cpp} client (see link:https://issues.apache.org/jira/browse/KUDU-1977[KUDU-1977]).

- Added an optimization to avoid bottlenecks on `getpwuid_r()` in libnss during a Raft
  leader election storm (see
  link:https://issues.apache.org/jira/browse/KUDU-2395[KUDU-2395]).

- Improved rowset tree pruning making scans with open-ended intervals on primary key (see
  link:https://issues.apache.org/jira/browse/KUDU-2566[KUDU-2566]).

- The `kudu perf loadgen` tool now supports generating range-partitioned tables. The
  `-table_num_buckets` configuration is now removed in favor of
  `-table_num_hash_partitions` and `-table_num_range_partitions` (see
  link:https://issues.apache.org/jira/browse/KUDU-1861[KUDU-1861]).

- CFile checksum failures will now cause the affected tablet replicas to be failed and
  re-replicated elsewhere (see
  link:https://issues.apache.org/jira/browse/KUDU-2469[KUDU-2469]).

- Servers are now able to start up with data directories missing on disk (see
  link:https://issues.apache.org/jira/browse/KUDU-2359[KUDU-2359]).

- The `kudu perf loadgen` tool now creates tables with a period-separated database name,
  for example `default.loadgen_auto_abc123`. This new behavior does not take effect if the
  `--table` flag is provided. The database of the table can be changed using a new
  `--auto_database` flag. This change is made in anticipation of an eventual Kudu/HMS
  integration (see link:https://jira.apache.org/jira/browse/KUDU-2191[KUDU-2191]).

- Introduced `FAILED_UNRECOVERABLE` replica health status. This is to mark replicas which
  are not able to catch up with the leader due to GC-collected segments of WAL and other
  unrecoverable cases like disk failure. With that, the replica management scheme becomes
  hybrid: the system evicts replicas with `FAILED_UNRECOVERABLE` health status before
  adding a replacement if it anticipates that it can commit the transaction, while in
  other cases it first adds a non-voter replica and removes the failed one only after
  promoting a newly added replica to voter role.

- Two additional configuration parameters, `socketReadTimeoutMs`  and `scanRequestTimeout`
  have been added to the Spark connector to allow better tuning to avoid scan timeouts
  under high load.

- The `kudu table` tool now supports two new options to rename tables and columns,
  `rename_table` and `rename_column` respectively.

- Kudu will now wait for the clock to become synchronized at startup, controlled by a new
  flag `-ntp_initial_sync_wait_secs` (see
  link:https://issues.apache.org/jira/browse/KUDU-2242[KUDU-2242]).

- Tablet deletions are now throttled, which will help Kudu clusters remain stable even
  when many tablets are deleted at once. The number of tablets that a tablet server will
  delete at once is controlled by the new flag `-num_tablets_to_delete_simultaneously`
  (see link:https://issues.apache.org/jira/browse/KUDU-2289[KUDU-2289]).

- The `kudu cluster ksck` tool has been significantly enhanced. It now checks master
  health and consensus status, displays any unsafe or hidden flags set in the cluster, and
  produces a summary of the Kudu versions running on the master and tablet servers. In
  addition, it now supports JSON output, both in pretty-printed and compact form. The
  output format is controlled by the `-ksck_format` flag.

[[rn_1.8.0_fixed_issues]]
== Fixed Issues

- When a tablet server was wiped and recreated with the same RPC address, `ksck` listed it
  twice, both as healthy, even though only one of them was there. This bug is now fixed by
  verifying the UUID of the server (see
  link:https://issues.apache.org/jira/browse/KUDU-2364[KUDU-2364]).

- Fixed an issue preventing Kudu from starting when using Vormetric's encrypted filesystem
  (secfs2) on ext4 (see link:https://issues.apache.org/jira/browse/KUDU-2406[KUDU-2406]).

- Fixed an issue where Kudu's block cache memory tracking (as seen on the `/mem-trackers`
  web UI page) wasn’t accounting for all of the overhead of the cache itself (see
  link:https://issues.apache.org/jira/browse/KUDU-972[KUDU-972]).

- Fixed an issue where the {cpp} client would fail to reopen an expired scanner; instead,
  the client would retry in a tight loop and eventually timeout (see
  link:https://issues.apache.org/jira/browse/KUDU-2414[KUDU-2414]).

- When a tablet is deleted, its write-ahead log recovery directory is also deleted, if it
  exists (see link:https://issues.apache.org/jira/browse/KUDU-1038[KUDU-1038]).

- Fixed a tablet server crash when a tablet is scanned with two predicates on its primary
  key and the predicates do not overlap (see
  link:https://issues.apache.org/jira/browse/KUDU-2447[KUDU-2447]).

- Fixed an issue where the Kudu MapReduce connector's `KuduTableInputFormat` may exhaust
  its scan too early (see
  link:https://issues.apache.org/jira/browse/KUDU-2525[KUDU-2525]).

- Fixed an issue with failed tablet copies that would cause subsequent tablet copies to
  crash the tablet server (see
  link:https://issues.apache.org/jira/browse/KUDU-2293[KUDU-2293]).

- Fixed a bug in which incorrect results would be returned in scans following a
  server restart (see
  link:https://issues.apache.org/jira/browse/KUDU-2463[KUDU-2463]).

- Fixed a bug causing a tablet server crash when a write batch request from a client
  failed coarse-grained authorization (see
  link:https://issues.apache.org/jira/browse/KUDU-2540[KUDU-2540]).

- Fixed use-after-free in case of WAL replay error (see
  link:https://issues.apache.org/jira/browse/KUDU-2509[KUDU-2509]).

- Fixed authentication token reacquisition in the {cpp} client (see
  link:https://issues.apache.org/jira/browse/KUDU-2580[KUDU-2580]).

- Fixed a bug where leader logged excessively when the followers fell behind (see
  link:https://issues.apache.org/jira/browse/KUDU-2322[KUDU-2322]).

- Fixed reporting of leader health during lifecycle transitions (see
  link:https://issues.apache.org/jira/browse/KUDU-2335[KUDU-2335]).

- Fixed moving single-replica tablets (see
  link:https://issues.apache.org/jira/browse/KUDU-2443[KUDU-2443]).

- Fixed an error that would cause the kudu CLI tool to unexpectedly exit when the
  connection to the master or tserver was abruptly closed.

- Fixed a rare issue where system failure could leave unexpected null bytes at the end of
  metadata files, causing Kudu to be unable to restart (see
  link:https://issues.apache.org/jira/browse/KUDU-2260[KUDU-2260]).

- Fixed an issue where `kudu cluster ksck` running a snapshot checksum scan would use a
  single snapshot timestamp for all tablets. This caused the checksum process to fail if
  the checksum process took a long time and the number of tablets was sufficiently large.
  The tool should now be able to checksum tables even if the process takes many hours.
  (see link:https://issues.apache.org/jira/browse/KUDU-2179[KUDU-2179]).

[[rn_1.8.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.8.0 is wire-compatible with previous versions of Kudu:

- Kudu 1.8 clients may connect to servers running Kudu 1.0 or later. If the client uses
  features that are not available on the target server, an error will be returned.

- Kudu 1.0 clients may connect to servers running Kudu 1.8 with the exception of the
  below-mentioned restrictions regarding secure clusters.

The authentication features introduced in Kudu 1.3 place the following limitations on wire
compatibility between Kudu 1.8 and versions earlier than 1.3:

- If a Kudu 1.8 cluster is configured with authentication or encryption set to "required",
  clients older than Kudu 1.3 will be unable to connect.

- If a Kudu 1.8 cluster is configured with authentication and encryption set to "optional"
  or "disabled", older clients will still be able to connect.

[[rn_1.8.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.8.0


[[rn_1.8.0_client_compatibility]]
=== Client Library Compatibility

- The Kudu 1.8 Java client library is API- and ABI-compatible with Kudu 1.7. Applications
  written against Kudu 1.7 will compile and run against the Kudu 1.8 client library and
  vice-versa.

- The Kudu 1.8 {cpp} client is API- and ABI-forward-compatible with Kudu 1.7.
  Applications written and compiled against the Kudu 1.7 client library will run without
  modification against the Kudu 1.8 client library. Applications written and compiled
  against the Kudu 1.8 client library will run without modification against the Kudu 1.7
  client library.

- The Kudu 1.8 Python client is API-compatible with Kudu 1.7. Applications written against
  Kudu 1.7 will continue to run against the Kudu 1.8 client and vice-versa.

[[rn_1.8.0_known_issues]]
== Known Issues and Limitations

Please refer to the link:known_issues.html[Known Issues and Limitations] section of the
documentation.

[[rn_1.8.0_contributors]]
== Contributors

Kudu 1.8 includes contributions from 40 people, including 15 first-time contributors:

- Anupama Gupta
- Attila Piros
- Brian McDevitt
- Fengling Wang
- Ferenc Szabó
- Greg Solovyev
- Kiyoshi Mizumaru
- Shriya Gupta
- Thomas Tauber-Marshall
- Tigerquoll
- Yao Xu
- ZhangYao
- helifu
- jinxing64
- qqchang2nd

Thank you for helping to make Kudu even better!

[[rn_1.7.1]]
== Release Notes Specific to 1.7.1

[[rn_1.7.1_fixed_issues]]
== Fixed Issues

Apache Kudu 1.7.1 is a bug-fix release which fixes critical issues in Kudu 1.7.0.

* Fixed and issue where a leader replica could report a follower's health status
  as FAILED instead of FAILED_UNRECOVERABLE. In configurations where the tablet
  replication factor equals to the total number of tablet servers in the cluster,
  that lead to situations where the tablet could not be automatically recovered
  until a new leader was elected or corresponding tablet servers were restarted.
  (see link:https://issues.apache.org/jira/browse/KUDU-2367[KUDU-2367]).

* Fixed an issue where Kudu would fail to start if RLIMIT_NPROC was set to -1.
  (see link:https://issues.apache.org/jira/browse/KUDU-2377[KUDU-2377]).

* Fixed an issue where `kudu-spark` was unable to connect to secure clusters.
  (see link:https://issues.apache.org/jira/browse/KUDU-2379[KUDU-2379]).

* Fixed an issue where the `kudu-python` client would not compile in environments
  where `__int128` is not supported. This was most commonly el6 environments.
  (see link:https://issues.apache.org/jira/browse/KUDU-2412[KUDU-2412]).

* Fixed an issue where unaligned loads of `__int128` integers could result
  in a crash.
  (see link:https://issues.apache.org/jira/browse/KUDU-2378[KUDU-2378]).

* Fixed a bug in `PartialRow.setMin` that could lead to incorrect partition
  pruning when a `decimal` column is part of the tables range partition but
  not a part of the query predicate.
  (see link:https://issues.apache.org/jira/browse/KUDU-2416[KUDU-2416]).

* Fixed an equality check on `decimal` column predicates that could result
  in pruning that is too conservative.

[[rn_1.7.0]]
== Release notes specific to 1.7.0

[[rn_1.7.0_upgrade_notes]]
== Upgrade Notes

* Upgrading directly from Kudu 1.6.0 is supported and no special upgrade steps
  are required. A rolling upgrade of the server side will _not_ work because
  the default replica management scheme changed, and running masters and tablet
  servers with different replica management schemes is not supported, see
  <<rn_1.7.0_incompatible_changes>> for details. However, mixing client and
  server sides of different versions is not a problem. You can still
  update your clients before your servers or vice versa.
  When upgrading to Kudu 1.7, it is required to first shut down all Kudu processes
  across the cluster, then upgrade the software on all servers, then restart
  the Kudu processes on all servers in the cluster.

[[rn_1.7.0_obsoletions]]
== Obsoletions

* The `tcmalloc_contention_time` metric, which previously tracked the amount
  of time spent in memory allocator lock contention, has been removed.

[[rn_1.7.0_deprecations]]
== Deprecations

* Support for Java 7 has been deprecated since Kudu 1.5.0 and may be removed in
  the next major release.

[[rn_1.7.0_new_features]]
== New features

* Kudu now supports the decimal column type. The decimal type is a numeric data type
  with fixed scale and precision suitable for financial and other arithmetic
  calculations where the imprecise representation and rounding behavior of float and
  double make those types impractical. The decimal type is also useful for integers
  larger than int64 and cases with fractional values in a primary key.
  See <<schema_design.adoc#decimal,Decimal Type>> for more details.

* The strategy Kudu uses for automatically healing tablets which have lost a
  replica due to server or disk failures has been improved. The new re-replication
  strategy, or replica management scheme, first adds a replacement tablet replica
  before evicting the failed one. With the previous replica management scheme,
  the system first evicts the failed replica and then adds a replacement. The new
  replica management scheme allows for much faster recovery of tablets in
  scenarios where one tablet server goes down and then returns back shortly after
  5 minutes or so. The new scheme also provides substantially better overall
  stability on clusters with frequent server failures.
  (see link:https://issues.apache.org/jira/browse/KUDU-1097[KUDU-1097]).

* The `kudu fs update_dirs` tool now supports removing directories. Unless the
  `--force` flag is specified, Kudu will not allow the removal of a directory
  across which tablets are configured to spread data. If specified, all tablet
  replicas configured to use that directory will fail upon starting up and be
  replicated elsewhere, provided a majority exists elsewhere.

* Users can use the new `--fs_metadata_dir` to specify the directory in which
  to place tablet-specific metadata. It is recommended, although not
  necessary, that this be placed on a high-performance drive with high
  bandwidth and low latency, e.g. a solid-state drive. If not specified,
  metadata will be placed in the directory specified by `--fs_wal_dir`, or in
  the directory specified by the first entry of `--fs_data_dirs` if metadata
  already exists there from a pre-Kudu 1.7 deployment. Kudu will not
  automatically move existing metadata based on this configuration.

* Kudu 1.7 introduces a new scan read mode READ_YOUR_WRITES. Users can specify
  READ_YOUR_WRITES when creating a new scanner in C++, Java and Python clients.
  If this mode is used, the client will perform a read such that it follows all
  previously known writes and reads from this client. Reads in this mode ensure
  read-your-writes and read-your-reads session guarantees, while minimizing
  latency caused by waiting for outstanding write transactions to complete.
  Note that this is still an experimental feature which may be stabilized in
  future releases.

* The tablet server web UI scans dashboard (/scans) has been improved with
  several new features, including: showing the most recently completed scans,
  a pseudo-SQL scan descriptor that concisely shows the selected columns and
  applied predicates, and more complete and better documented scan statistics.

* Kudu daemons now expose a web page `/stacks` which dumps the current stack
  trace of every thread running in the server. This information can be helpful
  when diagnosing performance issues.

== Optimizations and improvements

* By default, each tablet replica will now stripe data blocks across 3 data
  directories instead of all data directories. This decreases the likelihood
  that any given tablet will be affected in the event of a single disk failure.
  No substantial performance impact is expected due to this feature based on
  link:https://github.com/apache/kudu/commit/60276c54a221d554287c6645df7df542fe6d6443[performance testing].
  This change only affects new replicas created after upgrading to Kudu 1.7.

* Kudu servers previously offered the ability to enable a separate metrics log
  which stores periodic snapshots of all metrics available on a server. This
  functionality is now available as part of a more general “diagnostics log”
  which is enabled by default. The diagnostics log includes periodic dumps of
  server metrics as well as collections of thread stack traces. The default
  configuration ensures that no more than 640MB of diagnostics logs are retained,
  and typically the space consumption is significantly less due to compression.
  The format and contents of this log file are documented in the
  link:administration.html[Administration guide].

* The handling of errors in the synchronous Java client has been improved so that,
  when an exception is thrown, the stack trace indicates the correct location
  where the client function was invoked rather than a call stack of an internal
  worker thread. The original call stack from the worker thread is available as
  a “suppressed exception”.

* The logging of errors in the Java client has been improved to exclude exception
  stack traces for expected scenarios such as failure to connect to a server in a
  cluster. Instead, only a single line informational message will be logged in
  such cases to aid in debugging.

* The Java client now uses a predefined prioritized list of TLS ciphers when
  establishing an encrypted connection to Kudu servers. This cipher list matches
  the list of ciphers preferred for server-to-server communication and ensures
  that the most efficient and secure ciphers are preferred. When the Kudu client
  is running on Java 8 or newer, this provides a substantial speed-up to read
  and write performance.

* Reporting for the `kudu cluster ksck` tool has been updated so tablets and
  tables with on-going tablet copies are shown as "recovering". Additional
  reporting changes have been made to make various common scenarios,
  particularly tablet copies, less alarming.

* The performance of inserting rows containing many string or binary columns has
  been improved, especially in the case of highly concurrent write workloads.

* By default, Spark tasks that scan Kudu will now be able to scan non-leader
  replicas. This allows Spark to more easily schedule kudu-spark tasks local to
  the data. Users can disable this behavior by passing 'leader_only' to the
  'kudu.scanLocality' option."

* The number of OS threads used in the steady state and during bursts of
  activity (such as in Raft leader elections triggered by a node failure) has
  been drastically reduced and should no longer exceed the value of `ulimit -u`.
  As such, it should no longer be necessary to increase the value of `ulimit -u`
  (or of /proc/sys/kernel/threads-max) in order to run a Kudu tablet server in
  most cases.
  (see link:https://issues.apache.org/jira/browse/KUDU-1913[KUDU-1913]).

* An issue where sparse column predicates could cause excessive data-block reads
  has been fixed. Previously in certain scans with sparsely matching predicates
  on multiple columns, Kudu would read and decode the same data blocks many times.
  The improvement typically results in a 5-10x performance increase for the
  affected scans.
  (see link:https://issues.apache.org/jira/browse/KUDU-2231[KUDU-2231]).

* The efficiency and on-disk size of large updated values has been improved.
  This will improve update-heavy workloads which overwrite large (1KiB+) values.
  (see link:https://issues.apache.org/jira/browse/KUDU-2253[KUDU-2253]).


[[rn_1.7.0_fixed_issues]]
== Fixed Issues

* Fixed a scenario where the on-disk data of a tablet server was completely
  erased and and a new tablet server was started on the same host. This issue
  could prevent tablet replicas previously hosted on the server from being
  evicted and re-replicated.
  Tablets now immediately evict replicas that respond with a different server
  UUID than expected.
  (see link:https://issues.apache.org/jira/browse/KUDU-1613[KUDU-1613]).

* Fixed a rare race condition when connecting to masters during their
  startup which might cause a client to get a response without a CA certificate
  and/or authentication token. This would cause the client to fail to authenticate
  with other servers in the cluster. The leader master now always sends a CA
  certificate and an authentication token (when applicable) to a Kudu client
  with a successful ConnectToMaster response.
  (see link:https://issues.apache.org/jira/browse/KUDU-1927[KUDU-1927]).

* The Kudu Java client now will retry a connection if no master is discovered as a
  leader, and the user has a valid authentication token. This avoids failure
  in recoverable cases when masters are in the process of the very first leader
  election after starting up.
  (see link:https://issues.apache.org/jira/browse/KUDU-2262[KUDU-2262]).

* The Java client will now automatically attempt to re-acquire Kerberos
  credentials from the ticket cache when the prior credentials are about to
  expire. This allows client instances to persist longer than the expiration
  time of a single Kerberos ticket so long as some other process renews the
  credentials in the ticket cache. Documentation on interacting with Kerberos
  authentication has been added to the Javadoc for the `AsyncKuduClient` class.
  (see link:https://issues.apache.org/jira/browse/KUDU-2264[KUDU-2264]).

* Follower masters are now able to verify authentication tokens even if they have never
  been a leader. Prior to this fix, if a follower master had never been a leader,
  clients would be unable to authenticate to that master, resulting in spurious
  error messages being logged.
  (see link:https://issues.apache.org/jira/browse/KUDU-2265[KUDU-2265]).

* Fixed a tablet server crash when a tablet replica is deleted during a scan.
  (see link:https://issues.apache.org/jira/browse/KUDU-2295[KUDU-2295]).

* The evaluation order of predicates in scans with multiple predicates has been
  made deterministic. Due to a bug, this was not necessarily the case previously.
  Predicates are applied in most to least selective order, with ties broken by
  column index. The evaluation order may change in the future, particularly when
  better column statistics are made available internally.
  (see link:https://issues.apache.org/jira/browse/KUDU-2312[KUDU-2312]).

* Previously, the `kudu tablet change_config move_replica` tool required all
  tablet servers in the cluster to be available when performing a move. This
  restriction has been relaxed: only the tablet server that will receive a replica
  of the tablet being moved and the hosts of the tablet's existing replicas need to be
  available for the move to occur.
  (see link:https://issues.apache.org/jira/browse/KUDU-2331[KUDU-2331]).

* Fixed a bug in the Java client which prevented the client from locating the
  new leader master after a leader failover in the case that the previous leader
  either remained online or restarted quickly. This bug resulted in the client
  timing out operations with errors indicating that there was no leader master.
  (see link:https://issues.apache.org/jira/browse/KUDU-2343[KUDU-2343]).

* The Unix process username of the client is now included inside the exported
  security credentials, so that the effective username of clients who import
  credentials and subsequently use unauthenticated (SASL PLAIN) connections
  matches the client who exported the security credentials. For example, this is
  useful to let the Spark executors know which username to use if the Spark
  driver has no authentication token. This change only affects clusters with
  encryption disabled using `--rpc_encryption=disabled`.
  (see link:https://issues.apache.org/jira/browse/KUDU-2259[KUDU-2259]).

[[rn_1.7.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.7.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.7 clients may connect to servers running Kudu 1.0 or later. If the client uses
  features that are not available on the target server, an error will be returned.
* Rolling upgrade between Kudu 1.6 and Kudu 1.7 servers is believed to be possible
  though has not been sufficiently tested. Users are encouraged to shut down all nodes
  in the cluster, upgrade the software, and then restart the daemons on the new version.
* Kudu 1.0 clients may connect to servers running Kudu 1.7 with the exception of the
  below-mentioned restrictions regarding secure clusters.

The authentication features introduced in Kudu 1.3 place the following limitations
on wire compatibility between Kudu 1.7 and versions earlier than 1.3:

* If a Kudu 1.7 cluster is configured with authentication or encryption set to "required",
  clients older than Kudu 1.3 will be unable to connect.
* If a Kudu 1.7 cluster is configured with authentication and encryption set to "optional"
  or "disabled", older clients will still be able to connect.

[[rn_1.7.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.7.0

* The newly introduced replica management scheme is not compatible with the
  old scheme, so it's not possible to run pre-1.7 Kudu masters with
  1.7 Kudu tablet servers or vice versa. This is a server-side
  incompatibility only and it does not affect client compatibility. In other words,
  Kudu clients of prior versions are compatible with upgraded Kudu clusters.

**  Kudu masters of 1.7 version will not register Kudu tablet servers of 1.6
    and prior versions.
**  Kudu tablet servers of 1.7 version will not work with Kudu masters of 1.6
    and prior versions.

* The format of the previously-optional metrics log has changed to include a
  human-readable timestamp on each line. The path of the log file has also
  changed with the word “diagnostics” replacing the word “metrics” in the file
  name. The metrics log has been optimized to only include those metrics which
  have changed in between successive samples, and to not include entity attributes
  such as tablet partition information in the log.
  (see link:https://issues.apache.org/jira/browse/KUDU-2297[KUDU-2297]).

[[rn_1.7.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.7 Java client library is API- and ABI-compatible with Kudu 1.6. Applications
  written against Kudu 1.6 will compile and run against the Kudu 1.7 client library and
  vice-versa.

* The Kudu 1.7 {cpp} client is API- and ABI-forward-compatible with Kudu 1.6.
  Applications written and compiled against the Kudu 1.6 client library will run without
  modification against the Kudu 1.7 client library. Applications written and compiled
  against the Kudu 1.7 client library will run without modification against the Kudu 1.6
  client library.

* The Kudu 1.7 Python client is API-compatible with Kudu 1.6. Applications
  written against Kudu 1.6 will continue to run against the Kudu 1.7 client
  and vice-versa.

* Kudu 1.7 clients that attempt to create a table with a decimal column on a
  target server running Kudu 1.6 or earlier will receive an error response.
  Similarly Kudu clients running Kudu 1.6 or earlier will result in an error
  when attempting to access any table containing containing a decimal
  column.

[[rn_1.6.0]]
== Release Notes Specific to 1.6.0

[[rn_1.6.0_upgrade_notes]]
== Upgrade Notes

* Upgrading directly from Kudu 1.5.0 is supported and no special upgrade steps
  are required. A rolling upgrade may work, however it has not been tested.
  When upgrading Kudu, it is recommended to first shut down all Kudu processes
  across the cluster, then upgrade the software on all servers, then restart
  the Kudu processes on all servers in the cluster.

[[rn_1.6.0_obsoletions]]
== Obsoletions

* Support for Spark 1 (kudu-spark_2.10) has been **removed** in Kudu 1.6.0 and
  now only Spark 2 is supported. Spark 1 support was deprecated in Kudu 1.5.0.

[[rn_1.6.0_deprecations]]
== Deprecations

* Support for Java 7 has been deprecated since Kudu 1.5.0 and may be removed in
  the next major release.

[[rn_1.6.0_new_features]]
== New features

* Tablet servers' tolerance of disk failures is now enabled by default and has
  been extended to handle data directory failures at runtime. In the event of
  a disk failure at runtime, any tablets with data on a failed disk will be
  shut down and restarted on another tablet server. There is a configurable
  tradeoff between a newly added tablet's tolerance to disk failures and its
  ability to parallelize reads via the experimental
  `--fs_target_data_dirs_per_tablet` flag. Tablets that are spread across fewer
  disks are less likely to be affected by a disk failure, at the cost of
  reduced parallelism. By default, tablets are striped across all available
  disks. Note that the first configured data directory and the WAL directory
  cannot currently tolerate disk failures. This will be further improved in
  future Kudu releases.

* Kudu servers can now adopt new data directories via the new
  `kudu fs update_dirs` tool. The new directory will be used by new tablet
  replicas only. Note that removing directories is not yet supported
  (see link:https://issues.apache.org/jira/browse/KUDU-2202[KUDU-2202]).

* Kudu servers have two new flags to control webui TLS/HTTPS
  settings: `--webserver_tls_ciphers` and `--webserver_tls_min_protocol`.
  These flags allow the advertised TLS ciphers and TLS protocol versions to be
  configured. Additionally, the webserver now excludes insecure legacy ciphers
  by default
  (see link:https://issues.apache.org/jira/browse/KUDU-2190[KUDU-2190]).

== Optimizations and improvements

* Kudu servers can now tolerate short interruptions in NTP clock
  synchronization. NTP synchronization is still required when any Kudu daemon
  starts up. If NTP synchronization is not available, diagnostic information
  is now logged to help pinpoint the issue
  (see link:https://issues.apache.org/jira/browse/KUDU-1578[KUDU-1578]).

* Tablet server startup time has been improved significantly on servers
  containing large numbers of blocks.

* The log block manager now performs disk data deletion in batches. This
  optimization can significantly reduce the time taken to delete data on a tablet.

* The usage of sensitive data redaction flag has been slightly changed. By
  setting `--redact=log` flag, redaction will be disabled in the web UI but
  retained for server logs. Alternatively, `--redact=none` can be used to
  disable redaction completely.

* The Spark DataSource integration now can take advantage of scan locality
  for better scan performance, the scan will take place at the closest replica
  instead of going to the leader.

* Various optimizations were made to reduce the 99th percentile latency of
  writes on the tablet server. This can also improve throughput on certain
  write workloads, particularly on larger clusters.

* Kudu may now be configured to ignore system-wide auth_to_local mappings
  configured in /etc/krb5.conf by setting the configuration flag
  `--use_system_auth_to_local=false`
  (see link:https://issues.apache.org/jira/browse/KUDU-2198[KUDU-2198]).

* The performance of the compaction scheduler has been improved. In
  previous versions, certain types of time series workloads were found to
  cause compaction scheduling to take tens of seconds. These workloads now
  schedule compactions an order of magnitude more efficiently.

* The compaction scheduler has been improved to avoid running a compaction
  when the benefit of that compaction is extremely small.

* Tablet servers now consider the health of all replicas of a tablet before
  deciding to evict one. This can improve stability of the Kudu cluster after
  experiencing multiple simultaneous daemon failures
  (see link:https://issues.apache.org/jira/browse/KUDU-2048[KUDU-2048]).

* Several performance improvements have been made to the Kudu master,
  particularly in concurrency of clients opening tables. This should improve
  performance in highly concurrent workloads.

* The on-disk size metric for a tablet now includes all data and metadata.
  Previously, it excluded WAL segments and consensus metadata
  (see link:https://issues.apache.org/jira/browse/KUDU-1755[KUDU-1755]).

* Added verbose mode for the 'kudu cluster ksck' command to enable output
  of detailed information on the cluster's metadata, even when no errors are
  detected.

[[rn_1.6.0_fixed_issues]]
== Fixed Issues

* HybridTime timestamp propagation now works in the Java client when using scan
  tokens (see link:https://issues.apache.org/jira/browse/KUDU-1411[KUDU-1411]).

* Fixed an error message commonly found in tablet server logs indicating that
  operations were being read "from the future"
  (see link:https://issues.apache.org/jira/browse/KUDU-1078[KUDU-1078]).

* Tombstoned tablets no longer report metrics
  (see link:https://issues.apache.org/jira/browse/KUDU-2044[KUDU-2044]).

* Fixed a bug in the C++ client which could cause tablets to be erroneously
  pruned, or skipped, during certain scans, resulting in fewer results than
  expected being returned from queries. The bug only affected tables whose range
  partition columns are a proper prefix of the primary key
  (see link:https://issues.apache.org/jira/browse/KUDU-2173[KUDU-2173]).

* Published Kudu Java artifacts are now fully compatible with JRE 7 and JRE 8.
  There was previously a bug in the release process which made them compatible
  only with JRE 8
  (see link:https://issues.apache.org/jira/browse/KUDU-2188[KUDU-2188]).

* Fixed a typo in the list of default TLS ciphers used by Kudu servers. As a
  result, two additional cipher suites are now available:
** ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128)  Mac=SHA256
** AES256-GCM-SHA384       TLSv1.2 Kx=RSA  Au=RSA Enc=AESGCM(256) Mac=AEAD

[[rn_1.6.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.6.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.6 clients may connect to servers running Kudu 1.0 or later. If the client uses
  features that are not available on the target server, an error will be returned.
* Rolling upgrade between Kudu 1.5 and Kudu 1.6 servers is believed to be possible
  though has not been sufficiently tested. Users are encouraged to shut down all nodes
  in the cluster, upgrade the software, and then restart the daemons on the new version.
* Kudu 1.0 clients may connect to servers running Kudu 1.6 with the exception of the
  below-mentioned restrictions regarding secure clusters.

The authentication features introduced in Kudu 1.3 place the following limitations
on wire compatibility between Kudu 1.6 and versions earlier than 1.3:

* If a Kudu 1.6 cluster is configured with authentication or encryption set to "required",
  clients older than Kudu 1.3 will be unable to connect.
* If a Kudu 1.6 cluster is configured with authentication and encryption set to "optional"
  or "disabled", older clients will still be able to connect.

[[rn_1.6.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.6.0

[[rn_1.6.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.6 Java client library is API- and ABI-compatible with Kudu 1.5. Applications
  written against Kudu 1.5 will compile and run against the Kudu 1.6 client library and
  vice-versa.

* The Kudu 1.6 {cpp} client is API- and ABI-forward-compatible with Kudu 1.5.
  Applications written and compiled against the Kudu 1.5 client library will run without
  modification against the Kudu 1.6 client library. Applications written and compiled
  against the Kudu 1.6 client library will run without modification against the Kudu 1.5
  client library.

* The Kudu 1.6 Python client is API-compatible with Kudu 1.5. Applications
  written against Kudu 1.5 will continue to run against the Kudu 1.6 client
  and vice-versa.

[[rn_1.5.0]]
== Release notes specific to 1.5.0

[[rn_1.5.0_upgrade_notes]]
== Upgrade Notes

* Kudu 1.5 now enables the optional ability to compute, store, and verify
  checksums on all pieces of data stored on a server by default. Due to
  storage format changes, downgrading to versions 1.3 or earlier is not
  supported and will result in an error.

* Spark 2.2+ requires Java 8 at runtime even though Kudu Spark 2.x integration
  is Java 7 compatible. Spark 2.2 is the default dependency version as of
  Kudu 1.5.0.

* The kudu-spark-tools module has been renamed to kudu-spark2-tools_2.11 in
  order to include the Spark and Scala base versions. This matches the pattern
  used in the kudu-spark module and artifacts.

* To improve security, world-readable Kerberos keytab files are no longer
  accepted by default. Set `--allow_world_readable_credentials=true` to override
  this behavior. See
  link:https://issues.apache.org/jira/browse/KUDU-1955[KUDU-1955] for additional
  details.

[[rn_1.5.0_deprecations]]
== Deprecations

* Support for Java 7 is deprecated as of Kudu 1.5.0 and may be removed in the
  next major release.

* Support for Spark 1 (kudu-spark_2.10) is deprecated as of Kudu 1.5.0 and may
  be removed in the next minor release.

[[rn_1.5.0_new_features]]
== New features

* Tablet servers are now optionally able to tolerate disk failures at
  startup. This feature is experimental; by default, Kudu will crash if it
  experiences a disk failure. When enabled, tablets with any data on the failed
  disk will not be opened and will be replicated as needed. To enable this, set
  the `--crash_on_eio` flag to `false`. Additionally, there is a configurable
  tradeoff between a newly added tablet's tolerance to disk failures and its
  parallelization of I/O via the `--fs_target_data_dirs_per_tablet` flag.
  Tablets that are spread across fewer disks are less likely to be affected by a
  disk failure, at the cost of reduced parallelism. Note that the first
  configured data directory and the WAL directory cannot currently tolerate disk
  failures, and disk failures during run-time are still fatal.

* Kudu server web UIs have a new configuration dashboard (/config) which
  provides a high level summary of important security configuration values, such
  as whether RPC authentication is required, or web server HTTPS encryption is
  enabled. Other types of configuration will be added in future releases.

* The `kudu` command line tool has two new features: `kudu tablet change_config
  move_replica` and `kudu local_replica data_size`. The 'tablet change_config
  move_replica' tool moves a tablet replica from one tablet server to another,
  under the condition that the tablet is healthy. An operator can use this tool to
  rebalance tablet replicas between tablet servers. The 'local_replica data size'
  tool summarizes the space usage of a tablet, breaking it down by type of file,
  column, and rowset.

* kudu-client-tools now supports exporting CSV files and importing
  Apache Parquet files. This feature is unstable and may change APIs and
  functionality in future releases.

* kudu-spark-tools now supports importing and exporting CSV, Apache Avro and
  Apache Parquet files. This feature is unstable and may change APIs and
  functionality in future releases.

[[rn_1.5.0_optimizations_improvements]]
== Optimizations and improvements

* The log block manager now performs disk synchronization in batches.
  This optimization can significantly reduce the time taken to copy tablet data
  from one server to another; in one case tablet copy time is reduced by 35%.
  It also improves the general performance of flushes and compactions.

* A new feature referred to as "tombstoned voting" is added to the Raft
  consensus subsystem to allow tablet replicas in the `TABLET_DATA_TOMBSTONED`
  state to vote in tablet leader elections. This feature increases Kudu's
  stability and availability by improving the likelihood that Kudu will be able
  to self-heal in more edge-case scenarios, such as when tablet copy operations
  fail. See link:https://issues.apache.org/jira/browse/KUDU-871[KUDU-871] for
  details.

* The tablet on-disk size metric has been made more accurate. Previously, the
  metric included only REDO deltas; it now counts all deltas. Additionally, the
  metric includes the size of bloomfiles, ad hoc indexes, and the tablet
  superblock. WAL segments and consensus metadata are still not counted. The
  latter is very small compared to the size of data, but the former may be
  significant depending on the workload (this will be resolved in a future
  release).

* The number of threads used by the Kudu tablet server has been further reduced.
  Previously, each follower tablet replica used a dedicated thread to detect
  leader tablet replica failures, and each leader replica used one dedicated
  thread per follower to send Raft heartbeats to that follower. The work
  performed by these dedicated threads has been reassigned to other threads.
  Other improvements were made to facilitate better thread sharing by tablets.
  For the purpose of capacity planning, expect the Kudu tablet server to create
  one thread for every five "cold" (i.e. those not servicing writes) tablets,
  and an additional three threads for every "hot" tablet. This will be further
  improved upon in future Kudu releases.

[[rn_1.5.0_fixed_issues]]
== Fixed Issues

* The Java Kudu client now automatically requests new authentication tokens
  after expiration. As a result, long-lived Java clients are now supported. See
  link:https://issues.apache.org/jira/browse/KUDU-2013[KUDU-2013] for more
  details.

* Multiple Kerberos compatibility bugs have been fixed, including support
  for environments with disabled reverse DNS, FreeIPA compatibility, principal
  names including uppercase characters, and hosts without a FQDN.

* A bug in the binary prefix decoder which could cause a tablet server 'check'
  assertion crash has been fixed. The crash could only be triggered in very
  specific scenarios; see
  link:https://issues.apache.org/jira/browse/KUDU-2085[KUDU-2085] for additional
  details.

[[rn_1.5.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.5.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.5 clients may connect to servers running Kudu 1.0 or later. If the client uses
  features that are not available on the target server, an error will be returned.
* Rolling upgrade between Kudu 1.4 and Kudu 1.5 servers is believed to be possible
  though has not been sufficiently tested. Users are encouraged to shut down all nodes
  in the cluster, upgrade the software, and then restart the daemons on the new version.
* Kudu 1.0 clients may connect to servers running Kudu 1.5 with the exception of the
  below-mentioned restrictions regarding secure clusters.

The authentication features introduced in Kudu 1.3 place the following limitations
on wire compatibility between Kudu 1.5 and versions earlier than 1.3:

* If a Kudu 1.5 cluster is configured with authentication or encryption set to "required",
  clients older than Kudu 1.3 will be unable to connect.
* If a Kudu 1.5 cluster is configured with authentication and encryption set to "optional"
  or "disabled", older clients will still be able to connect.

[[rn_1.5.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.5.0

[[rn_1.5.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.5 Java client library is API- and ABI-compatible with Kudu 1.4. Applications
  written against Kudu 1.4 will compile and run against the Kudu 1.5 client library and
  vice-versa, unless one of the following newly added APIs is used:

* The Kudu 1.5 {cpp} client is API- and ABI-forward-compatible with Kudu 1.4.
  Applications written and compiled against the Kudu 1.4 client library will run without
  modification against the Kudu 1.5 client library. Applications written and compiled
  against the Kudu 1.5 client library will run without modification against the Kudu 1.4
  client library.

* The Kudu 1.5 Python client is API-compatible with Kudu 1.4. Applications
  written against Kudu 1.4 will continue to run against the Kudu 1.5 client
  and vice-versa.

[[rn_1.4.0]]
== Release notes specific to 1.4.0

[[rn_1.4.0_upgrade_notes]]
== Upgrade Notes

* The Maintenance Manager now fully uses the threads it's given (see the improvements
  described further below), so it's now able to generate a lot more IO by flushing and
  compacting more often. Generally, the recommended ratio of MM threads to data
  directories is 1:3; operators of clusters above that ratio should be mindful of
  this when upgrading.

[[rn_1.4.0_new_features]]
== New features

* The C++ and Java client libraries now support the ability to alter the
  storage attributes (e.g. encoding and compression) and default value
  of existing columns. Additionally, it is now possible to rename
  a column which is part of a table's primary key.

* The C++ client library now includes an experimental `KuduPartitioner` API which may
  be used to efficiently map rows to their associated partitions and hosts.
  This may be used to achieve better locality or distribution of writes
  in client applications.

* The Java client library now supports enabling fault tolerance on scanners.
  Fault tolerant scanners are able to transparently recover from concurrent
  server crashes at the cost of some performance overhead. See the Java
  API documentation for more details on usage.

* The `kudu` command line tool now includes a new advanced administrative
  command `kudu remote_replica unsafe_change_config`. This command may be used
  to force a tablet to perform an unsafe change of its Raft replication
  configuration. This can be used to recover from scenarios such as a loss
  of a majority of replicas, at the risk of losing edits.

* The `kudu` command line tool now includes the `kudu fs check` command
  which performs various offline consistency checks on the local on-disk
  storage of a Kudu Tablet Server or Master. In addition to detecting
  various inconsistencies or corruptions, it can also detect and remove
  data blocks that are no longer referenced by any tablet but were not
  fully removed from disk due to a crash or a bug in prior versions of Kudu.

* The `kudu` command line tool can now be used to list the addresses and
  identifiers of the servers in the cluster using either `kudu master list`
  or `kudu tserver list`.

* Kudu 1.4 now includes the optional ability to compute, store, and verify
  checksums on all pieces of data stored on a server. Prior versions only
  performed checksums on certain portions of the stored data. This feature
  is not enabled by default since it makes a backward-incompatible change
  to the on-disk formats and thus prevent downgrades. Kudu 1.5 will enable
  the feature by default.

== Optimizations and improvements

* `kudu cluster ksck` now detects and reports new classes of
  inconsistencies and issues. In particular, it is better able to
  detect cases where a configuration change such as a replica eviction
  or addition is pending but is unable to be committed. It also now
  properly detects and reports cases where a tablet has no elected
  leader.

* The default size for Write Ahead Log (WAL) segments has been reduced
  from 64MB to 8MB. Additionally, in the case that all replicas of a
  tablet are fully up to date and data has been flushed from memory,
  servers will now retain only a single WAL segment rather than
  two. These changes are expected to reduce the average consumption of
  disk space on the configured WAL disk by 16x, as well as improve the
  startup speed of tablet servers by reducing the number and size of
  WAL segments that need to be re-read.

* The default on-disk storage system used by Kudu servers (Log Block Manager)
  has been improved to compact its metadata and remove dead containers.
  This compaction and garbage collection occurs only at startup. Thus, the
  first startup after upgrade is expected to be longer than usual, and
  subsequent restarts should be shorter.

* The usability of the Kudu web interfaces has been improved,
  particularly for the case where a server hosts many tablets or a
  table has many partitions. Pages that list tablets now include
  a top-level summary of tablet status and show the complete list
  under a toggleable section.

* The Maintenance Manager has been improved to improve utilization of the
  configured maintenance threads. Previously, maintenance work would
  only be scheduled a maximum of 4 times per second, but now maintenance
  work will be scheduled immediately whenever any configured thread is
  available. This can improve the throughput of write-heavy workloads.

* The Maintenance Manager will now aggressively schedule flushes of
  in-memory data when memory consumption crosses 60% of the configured
  process-wide memory limit. The backpressure mechanism which begins
  to throttle client writes has been accordingly adjusted to not begin
  throttling until reaching 80% of the configured limit. These two
  changes together result in improved write throughput, more consistent
  latency, and fewer timeouts due to memory exhaustion.

* Many performance improvements were made to write performance. Applications
  which send large batches of writes to Kudu should see substantially
  improved throughput in Kudu 1.4.

* Several improvements were made to reduce the memory consumption of
  Kudu Tablet Servers which hold large volumes of data. The specific
  amount of memory saved varies depending on workload, but the expectation
  is that approximately 350MB of excess peak memory usage has been eliminated
  per TB of data stored.

* The number of threads used by the Kudu Tablet Server has been reduced.
  Previously, each tablet used a dedicated thread to append to its WAL.
  Those threads now automatically stop running if there is no activity
  on a given tablet for a short period of time.

[[rn_1.4.0_fixed_issues]]
== Fixed Issues

* link:https://issues.apache.org/jira/browse/KUDU-2020[KUDU-2020]
  Fixed an issue where re-replication after a failure would proceed
  significantly slower than expected. This bug caused many tablets
  to be unnecessarily copied multiple times before successfully
  being considered re-replicated, resulting in significantly more
  network and IO bandwidth usage than expected. Mean time to recovery
  on clusters with large amounts of data is improved by up to 10x by this
  fix.

* link:https://issues.apache.org/jira/browse/KUDU-1982[KUDU-1982]
  Fixed an issue where the Java client would call `NetworkInterface.getByInetAddress`
  very often, causing performance problems particularly on Windows
  where this function can be quite slow.

* link:https://issues.apache.org/jira/browse/KUDU-1755[KUDU-1755]
  Improved the accuracy of the `on_disk_size` replica metrics to
  include the size consumed by bloom filters, primary key indexes,
  and superblock metadata, and delta files. Note that, because the size
  metric is now more accurate, the reported values are expected to
  increase after upgrading to Kudu 1.4. This does not indicate that
  replicas are using more space after the upgrade; rather, it is
  now accurately reporting the amount of space that has always been
  used.

* link:https://issues.apache.org/jira/browse/KUDU-1192[KUDU-1192]
  Kudu servers will now periodically flush their log messages to disk
  even if no `WARNING`-level messages have been logged. This makes it
  easier to tail the logs to see progress output during normal startup.

* link:https://issues.apache.org/jira/browse/KUDU-1999[KUDU-1999]
  Fixed the ability to run Spark jobs in "cluster" mode against
  Kudu clusters secured by Kerberos.


[[rn_1.4.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.4.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.4 clients may connect to servers running Kudu 1.0 or later. If the client uses
  features that are not available on the target server, an error will be returned.
* Kudu 1.0 clients may connect to servers running Kudu 1.4 with the exception of the
  below-mentioned restrictions regarding secure clusters.
* Rolling upgrade between Kudu 1.3 and Kudu 1.4 servers is believed to be possible
  though has not been sufficiently tested. Users are encouraged to shut down all nodes
  in the cluster, upgrade the software, and then restart the daemons on the new version.

The authentication features introduced in Kudu 1.3 place the following limitations
on wire compatibility between Kudu 1.4 and versions earlier than 1.3:

* If a Kudu 1.4 cluster is configured with authentication or encryption set to "required",
  clients older than Kudu 1.3 will be unable to connect.
* If a Kudu 1.4 cluster is configured with authentication and encryption set to "optional"
  or "disabled", older clients will still be able to connect.

[[rn_1.4.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.4.0

* Kudu servers, by default, will now only allow unencrypted or unauthenticated connections
  from trusted subnets, which are private networks (127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,
  192.168.0.0/16,169.254.0.0/16) and local subnets of all local network interfaces.
  Unencrypted or unauthenticated connections from publicly routable IPs will be rejected,
  even if encryption and authentication are not configured.
+
The trusted subnets can be configured using the `--trusted_subnets` flag, which can be set
   to IP blocks represented in CIDR notation separated by comma. Set it to '0.0.0.0/0' to
   allow unauthenticated connections from all remote IP addresses. However, if network access
   is not otherwise restricted by a firewall, malicious users may be able to gain unauthorized
   access. This can be mitigated if authentication and encryption are configured to be
   required.

[[rn_1.4.0_client_compatibility]]
=== Client Library Compatibility
* The Kudu 1.4 Java client library is API- and ABI-compatible with Kudu 1.3. Applications
  written against Kudu 1.3 will compile and run against the Kudu 1.4 client library and
  vice-versa, unless one of the following newly added APIs is used:
** `[Async]KuduScannerBuilder.setFaultTolerant(...)`
** New methods in `AlterTableOptions`: `removeDefault`, `changeDefault`, `changeDesiredBlockSize`,
   `changeEncoding`, `changeCompressionAlgorithm`
** `KuduClient.updateLastPropagatedTimestamp`
** `KuduClient.getLastPropagatedTimestamp`
** New getters in `PartialRow`: `getBoolean`, `getByte`, `getShort`, `getInt`, `getLong`,
   `getFloat`, `getDouble`, `getString`, `getBinaryCopy`, `getBinary`, `isNull`,
   `isSet`.


* The Kudu 1.4 {cpp} client is API- and ABI-forward-compatible with Kudu 1.3.
  Applications written and compiled against the Kudu 1.3 client library will run without
  modification against the Kudu 1.4 client library. Applications written and compiled
  against the Kudu 1.4 client library will run without modification against the Kudu 1.3
  client library unless they use one of the following new APIs:
** `KuduPartitionerBuilder`
** `KuduPartitioner
** `KuduScanner::SetRowFormatFlags` (unstable API)
** `KuduScanBatch::direct_data`, `KuduScanBatch::indirect_data` (unstable API)

* The Kudu 1.4 Python client is API-compatible with Kudu 1.3. Applications
  written against Kudu 1.3 will continue to run against the Kudu 1.4 client
  and vice-versa.

[[rn_1.3.0]]
== Release notes specific to 1.3.0

[[rn_1.3.0_new_features]]
== New features

* Kudu 1.3 adds support for strong authentication based on Kerberos. This optional feature
  allows users to authenticate themselves using Kerberos tickets, and also provides
  mutual authentication of servers using Kerberos credentials stored in keytabs. This
  feature is optional, but recommended for deployments requiring security.

* Kudu 1.3 adds support for encryption of data on the network using Transport Layer Security
  (TLS). Kudu will now use TLS to encrypt all network traffic between clients and servers as
  well as any internal traffic among servers, with the exception of traffic determined to
  be within a localhost network connection. Encryption is enabled by default whenever it can
  be determined that both the client and server support the feature.

* Kudu 1.3 adds coarse-grained service-level authorization of access to the cluster.
  The operator may set up lists of permitted users who may act as administrators and
  as clients of the cluster. Combined with the strong authentication feature described
  above, this can enable a secure environment for some use cases. Note that fine-grained
  access control (e.g. table-level or column-level) is not yet supported.

* Kudu 1.3 adds a background task to tablet servers which removes historical versions of
  data which have fallen behind the configured data retention time. This reduces disk space
  usage in all workloads, but particularly in those with a higher volume of updates or
  upserts.

* Kudu now incorporates Google Breakpad, a library which writes crash reports in
  the case of a server crash. These reports can be found within the configured log directory,
  and can be useful during bug diagnosis.


== Optimizations and improvements

* Kudu servers will now change the file permissions of data directories and contained
  data files based on a new configuration flag `--umask`. As a result, after upgrading,
  permissions on disk may be more restrictive than in previous versions. The new default
  configuration improves data security.

* Kudu's web UI will now redact strings which may include sensitive user data. For example,
  the monitoring page which shows in-progress scans no longer includes the scanner predicate
  values. The tracing and RPC diagnostics endpoints no longer include contents of RPCs which
  may include table data.

* By default, Kudu now reserves 1% of each configured data volume as free space. If a volume
  is seen to have less than 1% of disk space free, Kudu will stop writing to that volume
  to avoid completely filling up the disk.

* The default encoding for numeric columns (int, float, and double) has been changed
  to `BIT_SHUFFLE`. The default encoding for binary and string columns has been
  changed to `DICT_ENCODING`. Dictionary encoding automatically falls back to the old
  default (`PLAIN`) when cardinality is too high to be effectively encoded.
+
These new defaults match the default behavior of other storage mechanisms such as
  Apache Parquet and are likely to perform better out of the box.

* Kudu now uses `LZ4` compression when writing its Write Ahead Log (WAL). This improves
  write performance and stability for many use cases.

* Kudu now uses `LZ4` compression when writing delta files. This can improve both
  read and write performance as well as save substantial disk usage, especially
  for workloads involving a high number of updates or upserts containing compressible
  data.

* The Kudu API now supports the ability to express `IS NULL` and `IS NOT NULL` predicates
  on scanners. The Spark DataSource integration will take advantage of these new
  predicates when possible.

* Both {cpp} and Java clients have been optimized to prune partitions more effectively
  when performing scans using the `IN (...)` predicate.

* The exception messages produced by the Java client are now truncated to a maximum length
  of 32KB.


[[rn_1.3.0_fixed_issues]]
== Fixed Issues

* link:https://issues.apache.org/jira/browse/KUDU-1893[KUDU-1893]
  Fixed a critical bug in which wrong results would be returned when evaluating
  predicates applied to columns added using the `ALTER TABLE` operation.

* link:https://issues.apache.org/jira/browse/KUDU-1905[KUDU-1905]
  Fixed a crash after inserting a row sharing a primary key with a recently-deleted
  row in tables where the primary key is comprised of all of the columns.

* link:https://issues.apache.org/jira/browse/KUDU-1899[KUDU-1899]
  Fixed a crash after inserting a row with an empty string as the single-column
  primary key.

* link:https://issues.apache.org/jira/browse/KUDU-1904[KUDU-1904]
  Fixed a potential crash when performing random reads against a column using RLE
  encoding and containing long runs of NULL values.

* link:https://issues.apache.org/jira/browse/KUDU-1853[KUDU-1853]
  Fixed an issue where disk space could be leaked on servers which experienced an error
  during the process of copying tablet data from another server.

* link:https://issues.apache.org/jira/browse/KUDU-1856[KUDU-1856]
  Fixed an issue in which disk space could be leaked by Kudu servers storing data on
  partitions using the XFS file system. Any leaked disk space will be automatically
  recovered upon upgrade.

* link:https://issues.apache.org/jira/browse/KUDU-1888[KUDU-1888],
  link:https://issues.apache.org/jira/browse/KUDU-1906[KUDU-1906]
  Fixed multiple issues in the Java client where operation callbacks would never be
  triggered, causing the client to hang.


[[rn_1.3.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.3.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.3 clients may connect to servers running Kudu 1.0. If the client uses features
  that are not available on the target server, an error will be returned.
* Kudu 1.0 clients may connect to servers running Kudu 1.3 with the exception of the
  below-mentioned restrictions regarding secure clusters.
* Rolling upgrade between Kudu 1.2 and Kudu 1.3 servers is believed to be possible
  though has not been sufficiently tested. Users are encouraged to shut down all nodes
  in the cluster, upgrade the software, and then restart the daemons on the new version.

The authentication features newly introduced in Kudu 1.3 place the following limitations
on wire compatibility with older versions:

* If a Kudu 1.3 cluster is configured with authentication or encryption set to "required",
  older clients will be unable to connect.
* If a Kudu 1.3 cluster is configured with authentication and encryption set to "optional"
  or "disabled", older clients will still be able to connect.


[[rn_1.3.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.3.0

* Due to storage format changes in Kudu 1.3, downgrade from Kudu 1.3 to earlier versions
  is not supported. After upgrading to Kudu 1.3, attempting to restart with an earlier
  version will result in an error.

* In order to support running MapReduce and Spark jobs on secure clusters, these
  frameworks now connect to the cluster at job submission time to retrieve authentication
  credentials which can later be used by the tasks to be spawned. This means that
  the process submitting jobs to Kudu clusters must have direct access to that cluster.

* The embedded web servers in Kudu processes now specify the `X-Frame-Options: DENY` HTTP
  header which prevents embedding Kudu web pages in HTML `iframe` elements.

[[rn_1.3.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.3 Java client library is API- and ABI-compatible with Kudu 1.2. Applications
  written against Kudu 1.2 will compile and run against the Kudu 1.3 client library and
  vice-versa, unless one of the following newly added APIs is used:
** `[Async]KuduClient.exportAuthenticationCredentials(...)` (unstable API)
** `[Async]KuduClient.importAuthenticationCredentials(...)` (unstable API)
** `[Async]KuduClient.getMasterAddressesAsString()`
** `KuduPredicate.newIsNotNullPredicate()`
** `KuduPredicate.newIsNullPredicate()`

* The Kudu 1.3 {cpp} client is API- and ABI-forward-compatible with Kudu 1.2.
  Applications written and compiled against the Kudu 1.2 client library will run without
  modification against the Kudu 1.3 client library. Applications written and compiled
  against the Kudu 1.3 client library will run without modification against the Kudu 1.2
  client library unless they use one of the following new APIs:
** `kudu::DisableOpenSSLInitialization()`
** `KuduClientBuilder::import_authentication_credentials(...)`
** `KuduClient::ExportAuthenticationCredentials(...)`
** `KuduClient::NewIsNotNullPredicate(...)`
** `KuduClient::NewIsNullPredicate(...)`

* The Kudu 1.3 Python client is API-compatible with Kudu 1.2. Applications
  written against Kudu 1.2 will continue to run against the Kudu 1.3 client
  and vice-versa.


[[rn_1.2.0]]
== Release notes specific to 1.2.0

[[rn_1.2.0_new_features]]
== New features

* Kudu clients and servers now redact user data such as cell values
  from log messages, Java exception messages, and `Status` strings.
  User metadata such as table names, column names, and partition
  bounds are not redacted.
+
Redaction is enabled by default, but may be disabled by setting the new
`log_redact_user_data` flag to `false`.

* Kudu's ability to provide consistency guarantees has been substantially
improved:

** Replicas now correctly track their "safe timestamp". This timestamp
   is the maximum timestamp at which reads are guaranteed to be
   repeatable.

** A scan created using the `SCAN_AT_SNAPSHOT` mode will now
   either wait for the requested snapshot to be "safe" at the replica
   being scanned, or be re-routed to a replica where the requested
   snapshot is "safe". This ensures that all such scans are repeatable.

** Kudu Tablet Servers now properly retain historical data when a row
   with a given primary key is inserted and deleted, followed by the
   insertion of a new row with the same key. Previous versions of Kudu
   would not retain history in such situations. This allows the server
   to return correct results for snapshot scans with a timestamp in the
   past, even in the presence of such "reinsertion" scenarios.

** The Kudu clients now automatically retain the timestamp of their latest
   successful read or write operation. Scans using the `READ_AT_SNAPSHOT` mode
   without a client-provided timestamp automatically assign a timestamp
   higher than the timestamp of their most recent write. Writes also propagate
   the timestamp, ensuring that sequences of operations with causal dependencies
   between them are assigned increasing timestamps. Together, these changes
   allow clients to achieve read-your-writes consistency, and also ensure
   that snapshot scans performed by other clients return causally-consistent
   results.

* Kudu servers now automatically limit the number of log files.
  The number of log files retained can be configured using the
  `max_log_files` flag. By default, 10 log files will be retained
  at each severity level.

== Optimizations and improvements

* The logging in the Java and {cpp} clients has been substantially quieted.
  Clients no longer log messages in normal operation unless there
  is some kind of error.

* The {cpp} client now includes a `KuduSession::SetErrorBufferSpace`
  API which can limit the amount of memory used to buffer
  errors from asynchronous operations.

* The Java client now fetches tablet locations from the Kudu Master
  in batches of 1000, increased from batches of 10 in prior versions.
  This can substantially improve the performance of Spark and Impala
  queries running against Kudu tables with large numbers of tablets.

* Table metadata lock contention in the Kudu Master was substantially
  reduced. This improves the performance of tablet location lookups on
  large clusters with a high degree of concurrency.

* Lock contention in the Kudu Tablet Server during high-concurrency
  write workloads was also reduced. This can reduce CPU consumption and
  improve performance when a large number of concurrent clients are writing
  to a smaller number of a servers.

* Lock contention when writing log messages has been substantially reduced.
  This source of contention could cause high tail latencies on requests,
  and when under high load could contribute to cluster instability
  such as election storms and request timeouts.

* The `BITSHUFFLE` column encoding has been optimized to use the `AVX2`
  instruction set present on processors including Intel(R) Sandy Bridge
  and later. Scans on `BITSHUFFLE`-encoded columns are now up to 30% faster.

* The `kudu` tool now accepts hyphens as an alternative to underscores
  when specifying actions. For example, `kudu local-replica copy-from-remote`
  may be used as an alternative to `kudu local_replica copy_from_remote`.

[[rn_1.2.0_fixed_issues]]
== Fixed Issues

* link:https://issues.apache.org/jira/browse/KUDU-1508[KUDU-1508]
  Fixed a long-standing issue in which running Kudu on `ext4` file systems
  could cause file system corruption.

* link:https://issues.apache.org/jira/browse/KUDU-1399[KUDU-1399]
  Implemented an LRU cache for open files, which prevents running out of
  file descriptors on long-lived Kudu clusters. By default, Kudu will
  limit its file descriptor usage to half of its configured `ulimit`.

* link:http://gerrit.cloudera.org:8080/5192[Gerrit #5192]
  Fixed an issue which caused data corruption and crashes in the case that
  a table had a non-composite (single-column) primary key, and that column
  was specified to use `DICT_ENCODING` or `BITSHUFFLE` encodings. If a
  table with an affected schema was written in previous versions of Kudu,
  the corruption will not be automatically repaired; users are encouraged
  to re-insert such tables after upgrading to Kudu 1.2 or later.

* link:http://gerrit.cloudera.org:8080/5541[Gerrit #5541]
  Fixed a bug in the Spark `KuduRDD` implementation which could cause
  rows in the result set to be silently skipped in some cases.

* link:https://issues.apache.org/jira/browse/KUDU-1551[KUDU-1551]
  Fixed an issue in which the tablet server would crash on restart in the
  case that it had previously crashed during the process of allocating
  a new WAL segment.

* link:https://issues.apache.org/jira/browse/KUDU-1764[KUDU-1764]
  Fixed an issue where Kudu servers would leak approximately 16-32MB of disk
  space for every 10GB of data written to disk. After upgrading to Kudu
  1.2 or later, any disk space leaked in previous versions will be
  automatically recovered on startup.

* link:https://issues.apache.org/jira/browse/KUDU-1750[KUDU-1750]
  Fixed an issue where the API to drop a range partition would drop any
  partition with a matching lower _or_ upper bound, rather than any partition
  with matching lower _and_ upper bound.

* link:https://issues.apache.org/jira/browse/KUDU-1766[KUDU-1766]
  Fixed an issue in the Java client where equality predicates which compared
  an integer column to its maximum possible value (e.g. `Integer.MAX_VALUE`)
  would return incorrect results.

* link:https://issues.apache.org/jira/browse/KUDU-1780[KUDU-1780]
  Fixed the `kudu-client` Java artifact to properly shade classes in the
  `com.google.thirdparty` namespace. The lack of proper shading in prior
  releases could cause conflicts with certain versions of Google Guava.

* link:http://gerrit.cloudera.org:8080/5327[Gerrit #5327]
  Fixed shading issues in the `kudu-flume-sink` Java artifact. The sink
  now expects that Hadoop dependencies are provided by Flume, and properly
  shades the Kudu client's dependencies.

* Fixed a few issues using the Python client library from Python 3.


[[rn_1.2.0_wire_compatibility]]
== Wire Protocol compatibility

Kudu 1.2.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.2 clients may connect to servers running Kudu 1.0. If the client uses features
  that are not available on the target server, an error will be returned.
* Kudu 1.0 clients may connect to servers running Kudu 1.2 without limitations.
* Rolling upgrade between Kudu 1.1 and Kudu 1.2 servers is believed to be possible
  though has not been sufficiently tested. Users are encouraged to shut down all nodes
  in the cluster, upgrade the software, and then restart the daemons on the new version.

[[rn_1.2.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.2.0

* The replication factor of tables is now limited to a maximum of 7. In addition,
  it is no longer allowed to create a table with an even replication factor.

* The `GROUP_VARINT` encoding is now deprecated. Kudu servers have never supported
  this encoding, and now the client-side constant has been deprecated to match the
  server's capabilities.

=== New Restrictions on Data, Schemas, and Identifiers

Kudu 1.2.0 introduces several new restrictions on schemas, cell size, and identifiers:

Number of Columns:: By default, Kudu will not permit the creation of tables with
more than 300 columns. We recommend schema designs that use fewer columns for best
performance.

Size of Cells:: No individual cell may be larger than 64KB. The cells making up a
a composite key are limited to a total of 16KB after the internal composite-key encoding
done by Kudu. Inserting rows not conforming to these limitations will result in errors
being returned to the client.

Valid Identifiers:: Identifiers such as column and table names are now restricted to
be valid UTF-8 strings. Additionally, a maximum length of 256 characters is enforced.

[[rn_1.2.0_client_compatibility]]
=== Client Library Compatibility

* The Kudu 1.2 Java client is API- and ABI-compatible with Kudu 1.1. Applications
  written against Kudu 1.1 will compile and run against the Kudu 1.2 client and
  vice-versa.

* The Kudu 1.2 {cpp} client is API- and ABI-forward-compatible with Kudu 1.1.
  Applications written and compiled against the Kudu 1.1 client will run without
  modification against the Kudu 1.2 client. Applications written and compiled
  against the Kudu 1.2 client will run without modification against the Kudu 1.1
  client unless they use one of the following new APIs:
** `kudu::DisableSaslInitialization()`
** `KuduSession::SetErrorBufferSpace(...)`

* The Kudu 1.2 Python client is API-compatible with Kudu 1.1. Applications
  written against Kudu 1.1 will continue to run against the Kudu 1.2 client
  and vice-versa.


[[rn_1.1.0]]
== Release notes specific to 1.1.0

[[rn_1.1.0_new_features]]
== New features

* The Python client has been brought up to feature parity with the Java and {cpp} clients
  and as such the package version will be brought to 1.1 with this release (from 0.3). A
  list of the highlights can be found below.
    ** Improved Partial Row semantics
    ** Range partition support
    ** Scan Token API
    ** Enhanced predicate support
    ** Support for all Kudu data types (including a mapping of Python's `datetime.datetime` to
    `UNIXTIME_MICROS`)
    ** Alter table support
    ** Enabled Read at Snapshot for Scanners
    ** Enabled Scanner Replica Selection
    ** A few bug fixes for Python 3 in addition to various other improvements.

* IN LIST predicate pushdown support was added to allow optimized execution of filters which
  match on a set of column values. Support for Spark, Map Reduce and Impala queries utilizing
  IN LIST pushdown is not yet complete.

* The Java client now features client-side request tracing in order to help troubleshoot timeouts.
  Error messages are now augmented with traces that show which servers were contacted before the
  timeout occurred instead of just the last error. The traces also contain RPCs that were
  required to fulfill the client's request, such as contacting the master to discover a tablet's
  location. Note that the traces are not available for successful requests and are not
  programmatically queryable.

== Optimizations and improvements

* Kudu now publishes JAR files for Spark 2.0 compiled with Scala 2.11 along with the
  existing Spark 1.6 JAR compiled with Scala 2.10.

* The Java client now allows configuring scanners to read from the closest replica instead of
  the known leader replica. The default remains the latter. Use the relevant `ReplicaSelection`
  enum with the scanner's builder to change this behavior.

* Tablet servers use a new policy for retaining write-ahead log (WAL) segments.
  Previously, servers used the 'log_min_segments_to_retain' flag to prioritize
  any flushes which were retaining log segments past the configured value (default 2).
  This policy caused servers to flush in-memory data more frequently than necessary,
  limiting write performance.
+
The new policy introduces a new flag 'log_target_replay_size_mb' which
  determines the threshold at which write-ahead log retention will prioritize flushes.
  The new flag is considered experimental and users should not need to modify
  its value.
+
The improved policy has been seen to improve write performance in some use cases
  by a factor of 2x relative to the old policy.

* Kudu's implementation of the Raft consensus algorithm has been improved to include
  a "pre-election" phase. This can improve the stability of tablet leader election
  in high-load scenarios, especially if each server hosts a high number of tablets.

* Tablet server start-up time has been substantially improved in the case that
  the server contains a high number of tombstoned tablet replicas.

=== Command line tools

* The tool `kudu tablet leader_step_down` has been added to manually force a leader to step down.
* The tool `kudu remote_replica copy` has been added to manually copy a replica from
  one running tablet server to another.
* The tool `kudu local_replica delete` has been added to delete a replica of a tablet.
* The `kudu test loadgen` tool has been added to replace the obsoleted
  `insert-generated-rows` standalone binary. The new tool is enriched with
  additional functionality and can be used to run load generation tests against
  a Kudu cluster.

== Wire protocol compatibility

Kudu 1.1.0 is wire-compatible with previous versions of Kudu:

* Kudu 1.1 clients may connect to servers running Kudu 1.0. If the client uses the new
  'IN LIST' predicate type, an error will be returned.
* Kudu 1.0 clients may connect to servers running Kudu 1.1 without limitations.
* Rolling upgrade between Kudu 1.0 and Kudu 1.1 servers is believed to be possible
  though has not been sufficiently tested. Users are encouraged to shut down all nodes
  in the cluster, upgrade the software, and then restart the daemons on the new version.

[[rn_1.1.0_incompatible_changes]]
== Incompatible changes in Kudu 1.1.0

=== Client APIs ({cpp}/Java/Python)

* The {cpp} client no longer requires the
  link:https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html[old gcc5 ABI].
  Which ABI is actually used depends on the compiler configuration. Some new distros
  (e.g. Ubuntu 16.04) will use the new ABI. Your application must use the same ABI as is
  used by the client library; an easy way to guarantee this is to use the same compiler
  to build both.

* The {cpp} client's `KuduSession::CountBufferedOperations()` method is
  deprecated. Its behavior is inconsistent unless the session runs in the
  `MANUAL_FLUSH` mode. Instead, to get number of buffered operations, count
  invocations of the `KuduSession::Apply()` method since last
  `KuduSession::Flush()` call or, if using asynchronous flushing, since last
  invocation of the callback passed into `KuduSession::FlushAsync()`.

* The Java client's `OperationResponse.getWriteTimestamp` method was renamed to `getWriteTimestampRaw`
  to emphasize that it doesn't return milliseconds, unlike what its Javadoc indicated. The renamed
  method was also hidden from the public APIs and should not be used.

* The Java client's sync API (`KuduClient`, `KuduSession`, `KuduScanner`) used to throw either
  a `NonRecoverableException` or a `TimeoutException` for a timeout, and now it's only possible for the
  client to throw the former.

* The Java client's handling of errors in `KuduSession` was modified so that subclasses of
  `KuduException` are converted into RowErrors instead of being thrown.

[[rn_1.0.1]]
== Release notes specific to 1.0.1

Apache Kudu 1.0.1 is a bug fix release, with no new features or backwards
incompatible changes.

[[rn_1.0.1_fixed_issues]]
=== Fixed Issues

- link:https://issues.apache.org/jira/browse/KUDU-1681[KUDU-1681] Fixed a bug in
  the tablet server which could cause a crash when the DNS lookup during master
  heartbeat failed.

- link:https://issues.apache.org/jira/browse/KUDU-1660[KUDU-1660]: Fixed a bug
  which would cause the Kudu master and tablet server to fail to start on single
  CPU systems.

- link:https://issues.apache.org/jira/browse/KUDU-1651[KUDU-1652]: Fixed a bug
  that would cause the C++ client, tablet server, and Java client to crash or
  throw an exception when attempting to scan a table with a predicate which
  simplifies to `IS NOT NULL` on a non-nullable column. For instance, setting a
  `<= 127` predicate on an `INT8` column could trigger this bug, since the
  predicate only filters null values.

- link:https://issues.apache.org/jira/browse/KUDU-1651[KUDU-1651]: Fixed a bug
  that would cause the tablet server to crash when evaluating a scan with
  predicates over a dictionary encoded column containing an entire block of null
  values.

- link:https://issues.apache.org/jira/browse/KUDU-1623[KUDU-1623]: Fixed a bug
  that would cause the tablet server to crash when handling UPSERT operations
  that only set values for the primary key columns.

- link:http://gerrit.cloudera.org:8080/4488[Gerrit #4488] Fixed a bug in the
  Java client's KuduException class which could cause an unexpected
  NullPointerException to be thrown when the exception did not have an
  associated message.

- link:https://issues.apache.org/jira/browse/KUDU-1090[KUDU-1090] Fixed a bug in
  the memory tracker which could cause a rare crash during tablet server
  startup.

[[rn_1.0.0]]
== Release notes specific to 1.0.0

After approximately a year of beta releases, Apache Kudu has reached version 1.0.
This version number signifies that the development team feels that Kudu is stable
enough for usage in production environments.

If you are new to Kudu, check out its list of link:index.html[features and benefits].

[[rn_1.0.0_new_features]]
=== New features

Kudu 1.0.0 delivers a number of new features, bug fixes, and optimizations.

- Removal of multiversion concurrency control (MVCC) history is now supported.
  This is known as tablet history GC. This allows Kudu to reclaim disk space,
  where previously Kudu would keep a full history of all changes made to a
  given table since the beginning of time. Previously, the only way to reclaim
  disk space was to drop a table.
+
Kudu will still keep historical data, and the amount of history retained is
  controlled by setting the configuration flag `--tablet_history_max_age_sec`,
  which defaults to 15 minutes (expressed in seconds). The timestamp
  represented by the current time minus `tablet_history_max_age_sec` is known
  as the ancient history mark (AHM). When a compaction or flush occurs, Kudu
  will remove the history of changes made prior to the ancient history mark.
  This only affects historical data; currently-visible data will not be
  removed. A specialized maintenance manager background task to remove existing
  "cold" historical data that is not in a row affected by the normal compaction
  process will be added in a future release.

- Most of Kudu's command line tools have been consolidated under a new
  top-level `kudu` tool. This reduces the number of large binaries distributed
  with Kudu and also includes much-improved help output.

- The Kudu Flume Sink now supports processing events containing Avro-encoded
  records, using the new `AvroKuduOperationsProducer`.

- Administrative tools including `kudu cluster ksck` now support running
  against multi-master Kudu clusters.

- The output of the `ksck` tool is now colorized and much easier to read.

- The {cpp} client API now supports writing data in `AUTO_FLUSH_BACKGROUND` mode.
  This can provide higher throughput for ingest workloads.

=== Optimizations and improvements

- The performance of comparison predicates on dictionary-encoded columns has
  been substantially optimized. Users are encouraged to use dictionary encoding
  on any string or binary columns with low cardinality, especially if these
  columns will be filtered with predicates.

- The Java client is now able to prune partitions from scanners based on the
  provided predicates. For example, an equality predicate on a hash-partitioned
  column will now only access those tablets that could possibly contain matching
  data. This is expected to improve performance for the Spark integration as well
  as applications using the Java client API.

- The performance of compaction selection in the tablet server has been
  substantially improved. This can increase the efficiency of the background
  maintenance threads and improve overall throughput of heavy write workloads.

- The policy by which the tablet server retains write-ahead log (WAL) files has
  been improved so that it takes into account other replicas of the tablet.
  This should help mitigate the spurious eviction of tablet replicas on machines
  that temporarily lag behind the other replicas.

=== Wire protocol compatibility

Kudu 1.0.0 maintains client-server wire-compatibility with previous releases.
Applications using the Kudu client libraries may be upgraded either
before, at the same time, or after the Kudu servers.

Kudu 1.0.0 does _not_ maintain server-server wire compatibility with previous
releases. Therefore, rolling upgrades between earlier versions of Kudu and
Kudu 1.0.0 are not supported.

[[rn_1.0.0_incompatible_changes]]
=== Incompatible changes in Kudu 1.0.0

==== Command line tools

- The `kudu-pbc-dump` tool has been removed. The same functionality is now
  implemented as `kudu pbc dump`.

- The `kudu-ksck` tool has been removed. The same functionality is now
  implemented as `kudu cluster ksck`.

- The `cfile-dump` tool has been removed. The same functionality is now
  implemented as `kudu fs cfile dump`.

- The `log-dump` tool has been removed. The same functionality is now
  implemented as `kudu wal dump` and `kudu local_replica dump wals`.

- The `kudu-admin` tool has been removed. The same functionality is now
  implemented within `kudu table` and `kudu tablet`.

- The `kudu-fs_dump` tool has been removed. The same functionality is now
  implemented as `kudu fs dump`.

- The `kudu-ts-cli` tool has been removed. The same functionality is now
  implemented within `kudu master`, `kudu remote_replica`, and `kudu tserver`.

- The `kudu-fs_list` tool has been removed and some similar useful
  functionality has been moved under 'kudu local_replica'.

==== Configuration flags

- Some configuration flags are now marked as 'unsafe' and 'experimental'. Such flags
  are disallowed by default. Users may access these flags by enabling the additional
  flags `--unlock_unsafe_flags` and `--unlock_experimental_flags`. Usage of such flags
  is not recommended, as the flags may be removed or modified with no deprecation period
  and without notice in future Kudu releases.

==== Client APIs ({cpp}/Java/Python)

- The `TIMESTAMP` column type has been renamed to `UNIXTIME_MICROS` in order to
  reduce confusion between Kudu's timestamp support and the timestamps supported
  by other systems such as Apache Hive and Apache Impala (incubating). Existing
  tables will automatically be updated to use the new name for the type.
+
Clients upgrading to the new client libraries must move to the new name for
  the type.  Clients using old client libraries will continue to operate using
  the old type name, even when connected to clusters that have been
  upgraded. Similarly, if clients are upgraded before servers, existing
  timestamp columns will be available using the new type name.


- `KuduSession` methods in the {cpp} library are no longer advertised as thread-safe
  to have one set of semantics for both {cpp} and Java Kudu client libraries.

- The `KuduScanToken::TabletServers` method in the {cpp} library has been removed.
  The same information can now be found in the KuduScanToken::tablet method.

==== Apache Flume Integration

- The `KuduEventProducer` interface used to process Flume events into Kudu operations
  for the Kudu Flume Sink has changed, and has been renamed `KuduOperationsProducer`.
  The existing `KuduEventProducer`s have been updated for the new interface, and have
  been renamed similarly.

[[rn_0.10.0]]
== Release notes specific to 0.10.0

Kudu 0.10.0 delivers a number of new features, bug fixes, and optimizations,
detailed below.

Kudu 0.10.0 maintains wire-compatibility with previous releases, meaning
that applications using the Kudu client libraries may be upgraded either
before, at the same time, or after the Kudu servers. However, if you begin
using new features of Kudu 0.10.0 such as manually range-partitioned tables,
you must first upgrade all clients to this release.

This release does not maintain full Java API or ABI compatibility with
Kudu 0.9.x due to a package rename and some other small changes. See below for details.

See also +++<a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20KUDU%20AND%20status%20%3D%20Resolved
%20AND%20fixVersion%20%3D%200.10.0">JIRAs resolved
for Kudu 0.10.0</a>+++ and +++<a href="https://github.com/apache/kudu/compare/0.9.1...0.10.0">Git
changes between 0.9.1 and 0.10.0</a>+++.

[[rn_0.10.0_incompatible_changes]]
=== Incompatible changes and deprecated APIs in 0.10.0

- link:http://gerrit.cloudera.org:8080/3737[Gerrit #3737] The Java client has been repackaged
  under `org.apache.kudu` instead of `org.kududb`. Import statements for Kudu classes must
  be modified in order to compile against 0.10.0. Wire compatibility is maintained.

- link:https://gerrit.cloudera.org/#/c/3055/[Gerrit #3055] The Java client's
  synchronous API methods now throw `KuduException` instead of `Exception`.
  Existing code that catches `Exception` should still compile, but introspection of an
  exception's message may be impacted. This change was made to allow thrown exceptions to be
  queried more easily using `KuduException.getStatus` and calling one of `Status`'s methods.
  For example, an operation that tries to delete a table that doesn't exist would return a
  `Status` that returns true when queried on `isNotFound()`.

- The Java client's `KuduTable.getTabletsLocations` set of methods is now
  deprecated. Additionally, they now take an exclusive end partition key instead
  of an inclusive key. Applications are encouraged to use the scan tokens API
  instead of these methods in the future.

- The C++ API for specifying split points on range-partitioned tables has been improved
  to make it easier for callers to properly manage the ownership of the provided rows.
+
The `TableCreator::split_rows` API took a `vector<const KuduPartialRow*>`, which
  made it very difficult for the calling application to do proper error handling with
  cleanup when setting the fields of the `KuduPartialRow`. This API has been now been
  deprecated and replaced by a new method `TableCreator::add_range_split` which allows
  easier use of smart pointers for safe memory management.

- The Java client's internal buffering has been reworked. Previously, the number of
  buffered write operations was constrained on a per-tablet-server basis. Now, the configured
  maximum buffer size constrains the total number of buffered operations across all
  tablet servers in the cluster. This provides a more consistent bound on the memory
  usage of the client regardless of the size of the cluster to which it is writing.
+
This change can negatively affect the write performance of Java clients which rely on
  buffered writes. Consider using the `setMutationBufferSpace` API to increase a
  session's maximum buffer size if write performance seems to be degraded after upgrading
  to Kudu 0.10.0.

- The "remote bootstrap" process used to copy a tablet replica from one host to
  another has been renamed to "Tablet Copy". This resulted in the renaming of
  several RPC metrics. Any users previously explicitly fetching or monitoring metrics
  related to Remote Bootstrap should update their scripts to reflect the new names.

- The SparkSQL datasource for Kudu no longer supports mode `Overwrite`. Users should
  use the new `KuduContext.upsertRows` method instead. Additionally, inserts using the
  datasource are now upserts by default. The older behavior can be restored by setting
  the `operation` parameter to `insert`.

[[rn_0.10.0_new_features]]
=== New features

- Users may now manually manage the partitioning of a range-partitioned table.
  When a table is created, the user may specify a set of range partitions that
  do not cover the entire available key space. A user may add or drop range
  partitions to existing tables.
+
This feature can be particularly helpful with time series workloads in which
  new partitions can be created on an hourly or daily basis. Old partitions
  may be efficiently dropped if the application does not need to retain historical
  data past a certain point.
+
This feature is considered experimental for the 0.10 release. More details of
  the new feature can be found in the accompanying
  link:https://kudu.apache.org/2016/08/23/new-range-partitioning-features.html[blog post].

- Support for running Kudu clusters with multiple masters has been stabilized.
  Users may start a cluster with three or five masters to provide fault tolerance
  despite a failure of one or two masters, respectively.
+
Note that certain tools (e.g. `ksck`) are still lacking complete support for
  multiple masters. These deficiencies will be addressed in a following release.

- Kudu now supports the ability to reserve a certain amount of free disk space
  in each of its configured data directories. If a directory's free disk space
  drops to less than the configured minimum, Kudu will stop writing to that
  directory until space becomes available. If no space is available in any
  configured directory, Kudu will abort.
+
This feature may be configured using the `fs_data_dirs_reserved_bytes` and
  `fs_wal_dir_reserved_bytes` flags.

- The Spark integration's `KuduContext` now supports four new methods for writing to
  Kudu tables: `insertRows`, `upsertRows`, `updateRows`, and `deleteRows`. These are
  now the preferred way to write to Kudu tables from Spark.

[[rn_0.10.0_improvements]]
=== Improvements and optimizations

- link:https://issues.apache.org/jira/browse/KUDU-1516[KUDU-1516] The `kudu-ksck` tool
  has been improved and now detects problems such as when a tablet does not have
  a majority of replicas on live tablet servers, or if those replicas aren’t in a
  good state. Users who currently depend on the tool to detect inconsistencies may now see
  failures when before they wouldn't see any.

- link:https://gerrit.cloudera.org:8080/3477[Gerrit #3477] The way operations are buffered in
  the Java client has been reworked. Previously, the session's buffer size was set per tablet, meaning that a buffer
  size of 1,000 for 10 tablets being written to allowed for 10,000 operations to be buffered at the
  same time. With this change, all the tablets share one buffer, so users might need to set a
  bigger buffer size in order to reach the same level of performance as before.

- link:https://gerrit.cloudera.org/#/c/3674/[Gerrit #3674] Added LESS and GREATER options for
  column predicates.

- link:https://issues.apache.org/jira/browse/KUDU-1444[KUDU-1444] added support for passing
  back basic per-scan metrics (e.g cache hit rate) from the server to the C++ client. See the
  `KuduScanner::GetResourceMetrics()` API for detailed usage. This feature will be supported
  in the Java client API in a future release.

- link:https://issues.apache.org/jira/browse/KUDU-1446[KUDU-1446] improved the order in
  which the tablet server evaluates predicates, so that predicates on smaller columns
  are evaluated first. This may improve performance on queries which apply predicates
  on multiple columns of different sizes.

- link:https://issues.apache.org/jira/browse/KUDU-1398[KUDU-1398] improved the storage
  efficiency of Kudu's internal primary key indexes. This optimization should decrease space
  usage and improve random access performance, particularly for workloads with lengthy
  primary keys.

[[rn_0.10.0_fixed_issues]]
=== Fixed Issues

- link:https://gerrit.cloudera.org/#/c/3541/[Gerrit #3541] Fixed a problem in the Java client
  whereby an RPC could be dropped when a connection to a tablet server or master was forcefully
  closed on the server-side while RPCs to that server were in the process of being encoded.
  The effect was that the RPC would not be sent, and users of the synchronous API would receive
  a `TimeoutException`. Several other Java client bugs which could cause similar spurious timeouts
  were also fixed in this release.

- link:https://gerrit.cloudera.org/#/c/3724/[Gerrit #3724] Fixed a problem in the Java client
  whereby an RPC could be dropped when a socket timeout was fired while that RPC was being sent to
  a tablet server or master. This would manifest itself in the same way
  link:https://gerrit.cloudera.org/#/c/3541/[Gerrit #3541].

- link:https://issues.apache.org/jira/browse/KUDU-1538[KUDU-1538] fixed a bug in which recycled
  block identifiers could cause the tablet server to lose data. Following this bug fix, block
  identifiers will no longer be reused.

[[rn_0.10.0_changes]]
=== Other noteworthy changes

- This is the first release of Apache Kudu as a top-level (non-incubating)
  project!

- The default false positive rate for Bloom filters has been changed
  from 1% to 0.01%. This will increase the space consumption of Bloom
  filters by a factor of two (from approximately 10 bits per row to
  approximately 20 bits per row). This is expected to substantially
  improve the performance of random-write workloads at the cost of an
  incremental increase in disk space usage.

- The Kudu C++ client library now has Doxygen-based
  link:http://kudu.apache.org/cpp-client-api/[API documentation]
  available online.

- Kudu now
  link:http://kudu.apache.org/2016/06/17/raft-consensus-single-node.html[
  uses the Raft consensus algorithm even for unreplicated tables].
  This change simplifies code and will also allow administrators to enable
  replication on a previously-unreplicated table. This change is internal and
  should not be visible to users.

[[rn_0.9.1]]
== Release notes specific to 0.9.1

Kudu 0.9.1 delivers incremental bug fixes over Kudu 0.9.0. It is fully compatible with
Kudu 0.9.0.

See also +++<a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20KUDU%20AND%20status%20%3D%20Resolved
%20AND%20fixVersion%20%3D%200.9.1">JIRAs resolved
for Kudu 0.9.1</a>+++ and +++<a href="https://github.com/apache/kudu/compare/0.9.0...0.9.1">Git
changes between 0.9.0 and 0.9.1</a>+++.

[[rn_0.9.1_fixed_issues]]
=== Fixed Issues

- link:https://issues.apache.org/jira/browse/KUDU-1469[KUDU-1469] fixed a bug in
our Raft consensus implementation that could cause a tablet to stop making progress after a leader
election.

- link:https://gerrit.cloudera.org/#/c/3456/[Gerrit #3456] fixed a bug in which
servers under high load could store metric information in incorrect memory
locations, causing crashes or data corruption.

- link:https://gerrit.cloudera.org/#/c/3457/[Gerrit #3457] fixed a bug in which
errors from the Java client would carry an incorrect error message.

- Several other small bug fixes were backported to improve stability.

[[rn_0.9.0]]
== Release notes specific to 0.9.0

Kudu 0.9.0 delivers incremental features, improvements, and bug fixes over the previous versions.

See also +++<a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20KUDU%20AND%20status%20%3D%20Resolved
%20AND%20fixVersion%20%3D%200.9.0">JIRAs resolved
for Kudu 0.9.0</a>+++ and +++<a href="https://github.com/apache/kudu/compare/0.8.0...0.9.0">Git
changes between 0.8.0 and 0.9.0</a>+++.

[[rn_0.9.0_incompatible_changes]]
=== Incompatible changes

- The `KuduTableInputFormat` command has changed the way in which it handles
  scan predicates, including how it serializes predicates to the job configuration
  object. The new configuration key is `kudu.mapreduce.encoded.predicate`. Clients
  using the `TableInputFormatConfigurator` are not affected.

- The `kudu-spark` sub-project has been renamed to follow naming conventions for
  Scala. The new name is `kudu-spark_2.10`.

- Default table partitioning has been removed. All tables must now be created
  with explicit partitioning. Existing tables are unaffected. See the
  <<schema_design.adoc#no_default_partitioning,schema design guide>> for more
  details.

[[rn_0.9.0_new_features]]
=== New features
- link:https://issues.apache.org/jira/browse/KUDU-1002[KUDU-1002] Added support for
 `UPSERT` operations, whereby a row is inserted if it does not already exist, but
 updated if it does. Support for `UPSERT` is included in Java, C++, and Python APIs,
 but not in Impala.

- link:https://issues.apache.org/jira/browse/KUDU-1306[KUDU-1306] Scan token API
  for creating partition-aware scan descriptors. This API simplifies executing
  parallel scans for clients and query engines.

- link:http://gerrit.cloudera.org:8080/#/c/2848/[Gerrit 2848] Added a kudu datasource
  for Spark. This datasource uses the Kudu client directly instead of
  using the MapReduce API. Predicate pushdowns for `spark-sql` and Spark filters are
  included, as well as parallel retrieval for multiple tablets and column projections.
  See an example of link:developing.html#_kudu_integration_with_spark[Kudu integration with Spark].

- link:http://gerrit.cloudera.org:8080/#/c/2992/[Gerrit 2992] Added the ability
  to update and insert from Spark using a Kudu datasource.

[[rn_0.9.0_improvements]]
=== Improvements

- link:https://issues.apache.org/jira/browse/KUDU-1415[KUDU-1415] Added statistics in the Java
  client such as the number of bytes written and the number of operations applied.

- link:https://issues.apache.org/jira/browse/KUDU-1451[KUDU-1451] Improved tablet server restart
  time when the tablet server needs to clean up of a lot previously deleted tablets. Tablets are
  now cleaned up after they are deleted.

[[rn_0.9.0_fixed_issues]]
=== Fixed Issues

- link:https://issues.apache.org/jira/browse/KUDU-678[KUDU-678] Fixed a leak that happened during
  DiskRowSet compactions where tiny blocks were still written to disk even if there were no REDO
  records. With the default block manager, it usually resulted in block containers with thousands
  of tiny blocks.

- link:https://issues.apache.org/jira/browse/KUDU-1437[KUDU-1437] Fixed a data corruption issue
  that occured after compacting sequences of negative INT32 values in a column that
  was configured with RLE encoding.

[[rn_0.9.0_changes]]
=== Other noteworthy changes

All Kudu clients have longer default timeout values, as listed below.

.Java
- The default operation timeout and the default admin operation timeout
  are now set to 30 seconds instead of 10.
- The default socket read timeout is now 10 seconds instead of 5.

.C++
- The default admin timeout is now 30 seconds instead of 10.
- The default RPC timeout is now 10 seconds instead of 5.
- The default scan timeout is now 30 seconds instead of 15.

- Some default settings related to I/O behavior during flushes and compactions have been changed:
  The default for `flush_threshold_mb` has been increased from 64MB to 1000MB. The default
  `cfile_do_on_finish` has been changed from `close` to `flush`.
  link:http://getkudu.io/2016/04/26/ycsb.html[Experiments using YCSB] indicate that these
  values will provide better throughput for write-heavy applications on typical server hardware.


[[rn_0.8.0]]
== Release notes specific to 0.8.0

Kudu 0.8.0 delivers incremental features, improvements, and bug fixes over the previous versions.

See also +++<a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20KUDU%20AND%20status%20%3D%20Resolved
%20AND%20fixVersion%20%3D%200.8.0">JIRAs resolved
for Kudu 0.8.0</a>+++ and +++<a href="https://github.com/apache/kudu/compare/0.7.1...0.8.0">Git
changes between 0.7.1 and 0.8.0</a>+++.

To upgrade to Kudu 0.8.0, see link:installation.html#upgrade[Upgrade from 0.7.1 to 0.8.0].

[[rn_0.8.0_incompatible_changes]]
=== Incompatible changes

- 0.8.0 clients are not fully compatible with servers running Kudu 0.7.1 or lower.
In particular, scans that specify column predicates will fail. To work around this
issue, upgrade all Kudu servers before upgrading clients.

[[rn_0.8.0_new_features]]
=== New features

- link:https://issues.apache.org/jira/browse/KUDU-431[KUDU-431] A simple Flume
  sink has been implemented.

[[rn_0.8.0_improvements]]
=== Improvements

- link:https://issues.apache.org/jira/browse/KUDU-839[KUDU-839] Java RowError now uses an enum error code.

- link:http://gerrit.cloudera.org:8080/#/c/2138/[Gerrit 2138] The handling of
  column predicates has been re-implemented in the server and clients.

- link:https://issues.apache.org/jira/browse/KUDU-1379[KUDU-1379] Partition pruning
  has been implemented for C++ clients (but not yet for the Java client). This feature
  allows you to avoid reading a tablet if you know it does not serve the row keys you are querying.

- link:http://gerrit.cloudera.org:8080/#/c/2641[Gerrit 2641] Kudu now uses
  `earliest-deadline-first` RPC scheduling and rejection. This changes the behavior
  of the RPC service queue to prevent unfairness when processing a backlog of RPC
  threads and to increase the likelihood that an RPC will be processed before it
  can time out.


[[rn_0.8.0_fixed_issues]]
=== Fixed Issues

- link:https://issues.apache.org/jira/browse/KUDU-1337[KUDU-1337] Tablets from tables
  that were deleted might be unnecessarily re-bootstrapped when the leader gets the
  notification to delete itself after the replicas do.

- link:https://issues.apache.org/jira/browse/KUDU-969[KUDU-969] If a tablet server
  shuts down while compacting a rowset and receiving updates for it, it might immediately
  crash upon restart while bootstrapping that rowset's tablet.

- link:https://issues.apache.org/jira/browse/KUDU-1354[KUDU-1354] Due to a bug in Kudu's
  MVCC implementation where row locks were released before the MVCC commit happened,
  flushed data would include out-of-order transactions, triggering a crash on the
  next compaction.

- link:https://issues.apache.org/jira/browse/KUDU-1322[KUDU-1322] The C++ client
  now retries write operations if the tablet it is trying to reach has already been
  deleted.

- link:http://gerrit.cloudera.org:8080/#/c/2571/[Gerrit 2571] Due to a bug in the
  Java client, users were unable to close the `kudu-spark` shell because of
  lingering non-daemon threads.

[[rn_0.8.0_changes]]
=== Other noteworthy changes

- link:http://gerrit.cloudera.org:8080/#/c/2239/[Gerrit 2239] The concept of "feature flags"
  was introduced in order to manage compatibility between different
  Kudu versions. One case where this is helpful is if a newer client attempts to use
  a feature unsupported by the currently-running tablet server. Rather than receiving
  a cryptic error, the user gets an error message that is easier to interpret.
  This is an internal change for Kudu system developers and requires no action by
  users of the clients or API.

[[rn_0.7.1]]
== Release notes specific to 0.7.1

Kudu 0.7.1 is a bug fix release for 0.7.0.

[[rn_0.7.1_fixed_issues]]

=== Fixed Issues

- https://issues.apache.org/jira/browse/KUDU-1325[KUDU-1325] fixes a tablet server crash that could
occur during table deletion. In some cases, while a table was being deleted, other replicas would
attempt to re-replicate tablets to servers that had already processed the deletion. This could
trigger a race condition that caused a crash.

- https://issues.apache.org/jira/browse/KUDU-1341[KUDU-1341] fixes a potential data corruption and
crash that could happen shortly after tablet server restarts in workloads that repeatedly delete
and re-insert rows with the same primary key. In most cases, this corruption affected only a single
replica and could be repaired by re-replicating from another.

- https://issues.apache.org/jira/browse/KUDU-1343[KUDU-1343] fixes a bug in the Java client that
occurs when a scanner has to scan multiple batches from one tablet and then start scanning from
another. In particular, this would affect any scans using the Java client that read large numbers
of rows from multi-tablet tables.

- https://issues.apache.org/jira/browse/KUDU-1345[KUDU-1345] fixes a bug where in some cases the
hybrid clock could jump backwards, resulting in a crash followed by an inability to
restart the affected tablet server.

- https://issues.apache.org/jira/browse/KUDU-1360[KUDU-1360] fixes a bug in the kudu-spark module
which prevented reading rows with `NULL` values.

[[rn_0.7.0]]
== Release notes specific to 0.7.0

Kudu 0.7.0 is the first release done as part of the Apache Incubator and includes a number
of changes, new features, improvements, and fixes.

See also +++<a href="https://issues.apache.org/jira/issues/?jql=project%20%3D%20KUDU%20AND%20status%20in%20
(Resolved)%20AND%20fixVersion%20%3D%200.7.0%20ORDER%20BY%20key%20ASC">JIRAs resolved
for Kudu 0.7.0</a>+++ and +++<a href="https://github.com/apache/kudu/compare/branch-0.6.0...branch-0.7.0">Git
changes between 0.6.0 and 0.7.0</a>+++.

The upgrade instructions can be found at link:installation.html#upgrade[Upgrade from 0.6.0 to 0.7.0].

[[rn_0.7.0_incompatible_changes]]
=== Incompatible changes

- The C++ client includes a new API, `KuduScanBatch`, which performs better when a
large number of small rows are returned in a batch. The old API of `vector<KuduRowResult>`
is deprecated.
+
NOTE: This change is API-compatible but *not* ABI-compatible.

- The default replication factor has been changed from 1 to 3. Existing tables will
continue to use the replication factor they were created with. Applications that create
tables may not work properly if they assume a replication factor of 1 and fewer than
3 replicas are available. To use the previous default replication factor, start the
master with the configuration flag `--default_num_replicas=1`.

- The Python client has been completely rewritten, with a focus on improving code
quality and testing. The read path (scanners) has been improved by adding many of
the features already supported by the C++ and Java clients. The Python client is no
longer considered experimental.

[[rn_0.7.0_new_features]]
=== New features

- With the goal of Spark integration in mind, a new `kuduRDD` API has been added,
which wraps `newAPIHadoopRDD` and includes a default source for Spark SQL.

[[rn_0.7.0_improvements]]
=== Improvements

- The Java client includes new methods `countPendingErrors()` and
`getPendingErrors()` on `KuduSession`. These methods allow you to count and
retrieve outstanding row errors when configuring sessions with `AUTO_FLUSH_BACKGROUND`.

- New server-level metrics allow you to monitor CPU usage and context switching.

- Kudu now builds on RHEL 7, CentOS 7, and SLES 12. Extra instructions are included
for SLES 12.


[[rn_0.7.0_fixed_issues]]
=== Fixed Issues

- https://issues.apache.org/jira/browse/KUDU-1288[KUDU-1288] fixes a severe file descriptor
leak, which could previously only be resolved by restarting the tablet server.

- https://issues.apache.org/jira/browse/KUDU-1250[KUDU-1250] fixes a hang in the Java
client when processing an in-flight batch and the previous batch encountered an error.

[[rn_0.7.0_changes]]
=== Other noteworthy changes

- The file block manager's performance was improved, but it is still not recommended for
real-world use.

- The master now attempts to spread tablets more evenly across the cluster during
table creation. This has no impact on existing tables, but will improve the speed
at which under-replicated tablets are re-replicated after a tablet server failure.

- All licensing documents have been modified to adhere to ASF guidelines.

- Kudu now requires an out-of-tree build directory. Review the build instructions
for additional information.

- The `C++` client library is now explicitly built against the
link:https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html[old gcc5 ABI].
If you use gcc5 to build a Kudu application, your application must use the old ABI
as well. This is typically achieved by defining the `_GLIBCXX_USE_CXX11_ABI` macro
at compile-time when building your application. For more information, see the
previous link and link:http://developerblog.redhat.com/2015/02/05/gcc5-and-the-c11-abi/.

- The Python client is no longer considered experimental.


[[rn_0.6.0]]
== Release notes specific to 0.6.0

The 0.6.0 release contains incremental improvements and bug fixes. The most notable
changes are:

- The Java client's CreateTableBuilder and AlterTableBuilder classes have been renamed
to CreateTableOptions and AlterTableOptions. Their methods now also return `this` objects,
allowing them to be used as builders.
- The Java client's AbstractKuduScannerBuilder#maxNumBytes() setter is now called
batchSizeBytes as is the corresponding property in AsyncKuduScanner. This makes it
consistent with the C++ client.
- The "kudu-admin" tool can now list and delete tables via its new subcommands
"list_tables" and "delete_table <table_name>".
- OSX is now supported for single-host development. Please consult its specific installation
instructions in link:installation.html#osx_from_source[OS X].


[[rn_0.5.0]]
== Release Notes Specific to 0.5.0

Kudu 0.5.0 was the first public release. As such, no improvements or changes were
noted in its release notes.
