// 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.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.
