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

[[release_notes]]
= Apache Kudu 1.17.0 Release Notes

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

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


[[rn_1.17.0_obsoletions]]
== Obsoletions


[[rn_1.17.0_deprecations]]
== Deprecations

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

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


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


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


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

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

* Kudu 1.17 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.16 and Kudu 1.17 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.17 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.17 and versions earlier than 1.3:

* If a Kudu 1.17 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.17 cluster is configured with authentication and encryption set to "optional"
  or "disabled", older clients will still be able to connect.

[[rn_1.17.0_incompatible_changes]]
== Incompatible Changes in Kudu 1.17.0


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

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

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

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

[[rn_1.17.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.17.0_contributors]]
== Contributors

[[resources_and_next_steps]]
== Resources

- link:http://kudu.apache.org[Kudu Website]
- link:http://github.com/apache/kudu[Kudu GitHub Repository]
- link:index.html[Kudu Documentation]
- link:prior_release_notes.html[Release notes for older releases]

== Installation Options

For full installation details, see link:installation.html[Kudu Installation].

== Next Steps
- link:quickstart.html[Kudu Quickstart]
- link:installation.html[Installing Kudu]
- link:configuration.html[Configuring Kudu]
