blob: ab766bb144798f7982d37d32e3b6bc026a4030d0 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>Apache BookKeeper&trade; - Apache BookKeeper 4.5.0 Release Notes</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/normalize.css">
<link rel="stylesheet" href="/css/tippy.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="shortcut icon" href="/img/favicon.ico">
<script src="/js/tippy.min.js"></script>
<script type="text/javascript">
var shiftWindow = function() { scrollBy(0, -25); };
window.addEventListener("hashchange", shiftWindow);
window.addEventListener("pageshow", shiftWindow);
function load() { if (window.location.hash) shiftWindow(); }
</script>
</head>
<body class="body">
<main class="main">
<nav class="navbar bk-topnav">
<div class="navbar-brand">
<a class="navbar-item bk-brand" href="/">
Apache BookKeeper&trade;
</a>
<div class="navbar-burger burger" data-target="bkNav">
<span></span>
<span></span>
<span></span>
</div>
</div>
<div id="bkNav" class="navbar-menu">
<div class="navbar-start">
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">Documentation</a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/docs/latest/overview/overview">
Version 4.14.0-SNAPSHOT
<span class="tag is-warning">Development</span>
</a>
<a class="navbar-item" href="/docs/latest/api/javadoc">
<span class="icon bk-javadoc-icon">
<img src="/img/java-icon.svg">
</span>
Javadoc
</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/docs/4.13.0/overview/overview">
Release 4.13.0
</a>
<a class="navbar-item" href="/docs/4.12.1/overview/overview">
Release 4.12.1
</a>
<a class="navbar-item" href="/docs/4.12.0/overview/overview">
Release 4.12.0
</a>
<a class="navbar-item" href="/docs/4.11.1/overview/overview">
Release 4.11.1
<span class="tag is-success">Stable</span>
</a>
<a class="navbar-item" href="/docs/4.11.0/overview/overview">
Release 4.11.0
</a>
<a class="navbar-item" href="/docs/4.10.0/overview/overview">
Release 4.10.0
</a>
<a class="navbar-item" href="/archives/docs/r4.9.2">
Release 4.9.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.9.1">
Release 4.9.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.9.0">
Release 4.9.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.8.2">
Release 4.8.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.8.1">
Release 4.8.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.8.0">
Release 4.8.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.3">
Release 4.7.3
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.2">
Release 4.7.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.1">
Release 4.7.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.0">
Release 4.7.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.6.2">
Release 4.6.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.6.1">
Release 4.6.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.6.0">
Release 4.6.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.5.1">
Release 4.5.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.5.0">
Release 4.5.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.4.0">
Release 4.4.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.3.2">
Release 4.3.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.3.1">
Release 4.3.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.3.0">
Release 4.3.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.4">
Release 4.2.4
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.3">
Release 4.2.3
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.2">
Release 4.2.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.1">
Release 4.2.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.0">
Release 4.2.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.1.0">
Release 4.1.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.0.0">
Release 4.0.0
<span class="tag is-warning">EOL</span>
</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">Community</a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/community/mailing-lists">Mailing lists</a>
<a class="navbar-item" href="/community/slack">Slack</a>
<a class="navbar-item" href="https://github.com/apache/bookkeeper/issues">Github Issues</a>
<a class="navbar-item" href="/community/releases">Release Management</a>
<a class="navbar-item" href="/community/meeting">Community Meetings</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/community/contributing">Contribution Guide</a>
<a class="navbar-item" href="/community/coding_guide">Coding Guide</a>
<a class="navbar-item" href="/community/testing">Testing Guide</a>
<a class="navbar-item" href="/community/issue-report">Issue Report Guide</a>
<a class="navbar-item" href="/community/release_guide">Release Guide</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/community/presentations">Presentations</a>
<a class="navbar-item" href="/community/bookkeeper_proposals">BookKeeper Proposals</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">Project</a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/project/who">Who are we?</a>
<a class="navbar-item" href="/project/bylaws">Bylaws</a>
<a class="navbar-item" href="http://www.apache.org/licenses/">License</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/project/privacy">Privacy policy</a>
<a class="navbar-item" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
<a class="navbar-item" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
</div>
</div>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="field is-grouped">
<p class="control">
<a class="button bk-twitter" href="https://twitter.com/asfbookkeeper">
<span class="icon">
<i class="fa fa-twitter"></i>
</span>
<span>Twitter</span>
</a>
</p>
<p class="control">
<a class="button" href="https://github.com/apache/bookkeeper">
<span class="icon">
<i class="fa fa-github"></i>
</span>
<span>GitHub</span>
</a>
</p>
<p class="control">
<a class="button is-primary" href="/releases">
<span class="icon">
<i class="fa fa-download"></i>
</span>
<span>Download</span>
</a>
</p>
</div>
</div>
</div>
</div>
</nav>
<div class="bk-docs-container">
<div class="columns is-gapless">
<div class="column is-2 is-hidden-mobile">
<div class="container">
<aside class="sidebar">
<a class="button is-info">
Version: 4.5.0
</a>
<hr />
<p>
Getting started
</p>
<ul class="sidebar-items">
<li>
<a href="../../getting-started/installation">
Installation
</a>
</li>
<li>
<a href="../../getting-started/run-locally">
Run bookies locally
</a>
</li>
<li>
<a href="../../getting-started/concepts">
Concepts and architecture
</a>
</li>
</ul>
<p>
Deployment
</p>
<ul class="sidebar-items">
<li>
<a href="../../deployment/manual">
Manual deployment
</a>
</li>
<li>
<a href="../../deployment/dcos">
BookKeeper on DC/OS
</a>
</li>
<li>
<a href="../../deployment/kubernetes">
BookKeeper on Kubernetes
</a>
</li>
</ul>
<p>
Administration
</p>
<ul class="sidebar-items">
<li>
<a href="../../admin/bookies">
BookKeeper administration
</a>
</li>
<li>
<a href="../../admin/autorecovery">
AutoRecovery
</a>
</li>
<li>
<a href="../../admin/metrics">
Metric collection
</a>
</li>
<li>
<a href="../../admin/upgrade">
Upgrade
</a>
</li>
<li>
<a href="../../admin/http">
BookKeeper Admin REST API
</a>
</li>
<li>
<a href="../../admin/decomission">
Decommissioning Bookies
</a>
</li>
</ul>
<p>
API
</p>
<ul class="sidebar-items">
<li>
<a href="../../api/overview">
Overview
</a>
</li>
<li>
<a href="../../api/ledger-api">
Ledger API
</a>
</li>
<li>
<a href="../../api/ledger-adv-api">
Advanced Ledger API
</a>
</li>
<li>
<a href="../../api/distributedlog-api">
DistributedLog
</a>
</li>
<li>
<a href="../../api/javadoc">
Java API Docs
</a>
</li>
</ul>
<p>
Security
</p>
<ul class="sidebar-items">
<li>
<a href="../../security/overview">
Overview
</a>
</li>
<li>
<a href="../../security/tls">
TLS Authentication
</a>
</li>
<li>
<a href="../../security/sasl">
SASL Authentication
</a>
</li>
<li>
<a href="../../security/zookeeper">
ZooKeeper Authentication
</a>
</li>
</ul>
<p>
Development
</p>
<ul class="sidebar-items">
<li>
<a href="../../development/protocol">
BookKeeper protocol
</a>
</li>
</ul>
<p>
Reference
</p>
<ul class="sidebar-items">
<li>
<a href="../../reference/config">
Configuration
</a>
</li>
<li>
<a href="../../reference/cli">
Command-line tools
</a>
</li>
<li>
<a href="../../reference/metrics">
Metrics
</a>
</li>
</ul>
</aside>
</div>
</div>
<div class="column is-8 bk-docs-block">
<header class="docs-title">
<nav class="level bk-level">
<div class="level-left">
<div class="level-item">
<h1 class="title">Apache BookKeeper 4.5.0 Release Notes</h1>
</div>
</div>
</nav>
</header>
<hr />
<div class="content">
<section class="bk-main-content">
<p>This is the fifth release of BookKeeper as an Apache Top Level Project!</p>
<p>The 4.5.0 release incorporates hundreds of new fixes, improvements, and features since previous major release, 4.4.0,
which was released over a year ago. It is a big milestone in Apache BookKeeper community, converging from three
main branches (Salesforce, Twitter and Yahoo).</p>
<p>Apache BookKeeper users are encouraged to upgrade to 4.5.0. The technical details of this release are summarized
below.</p>
<h2 id="highlights">Highlights</h2>
<p>The main features in 4.5.0 cover are around following areas:</p>
<ul>
<li>Dependencies Upgrade</li>
<li>Security</li>
<li>Public API</li>
<li>Performance</li>
<li>Operations</li>
</ul>
<h3 id="dependencies-upgrade">Dependencies Upgrade</h3>
<p>Here is a list of dependencies upgraded in 4.5.0:</p>
<ul>
<li>Moved the developement from Java 7 to Java 8.</li>
<li>Upgrade Protobuf to <code class="highlighter-rouge">2.6</code>.</li>
<li>Upgrade ZooKeeper from <code class="highlighter-rouge">3.4</code> to <code class="highlighter-rouge">3.5</code>.</li>
<li>Upgrade Netty to <code class="highlighter-rouge">4.1</code>.</li>
<li>Upgrade Guava to <code class="highlighter-rouge">20.0</code>.</li>
<li>Upgrade SLF4J to <code class="highlighter-rouge">1.7.25</code>.</li>
<li>Upgrade Codahale to <code class="highlighter-rouge">3.1.0</code>.</li>
</ul>
<h3 id="security">Security</h3>
<p>Prior to this release, Apache BookKeeper only supports simple <code class="highlighter-rouge">DIGEST-MD5</code> type authentication.</p>
<p>With this release of Apache BookKeeper, a number of feature are introduced that can be used, together of separately,
to secure a BookKeeper cluster.</p>
<p>The following security features are currently supported.</p>
<ul>
<li>Authentication of connections to bookies from clients, using either <code class="highlighter-rouge">TLS</code> or `SASL (Kerberos).</li>
<li>Authentication of connections from clients, bookies, autorecovery daemons to <code class="highlighter-rouge">ZooKeeper</code>, when using zookeeper
based ledger managers.</li>
<li>Encryption of data transferred between bookies and clients, between bookies and autorecovery daemons using <code class="highlighter-rouge">TLS</code>.</li>
</ul>
<p>It’s worth noting that those security features are optional - non-secured clusters are supported, as well as a mix
of authenticated, unauthenticated, encrypted and non-encrypted clients.</p>
<p>For more details, have a look at <a href="../../security/overview">BookKeeper Security</a>.</p>
<h3 id="public-api">Public API</h3>
<p>There are multiple new client features introduced in 4.5.0.</p>
<h4 id="ledgerhandleadv">LedgerHandleAdv</h4>
<p>The [Ledger API] is the low level API provides by BookKeeper for interacting with <code class="highlighter-rouge">ledgers</code> in a bookkeeper cluster.
It is simple but not flexible on ledger id or entry id generation. Apache BookKeeper introduces <code class="highlighter-rouge">LedgerHandleAdv</code>
as an extension of existing <code class="highlighter-rouge">LedgerHandle</code> for advanced usage. The new <code class="highlighter-rouge">LedgerHandleAdv</code> allows applications providing
its own <code class="highlighter-rouge">ledger-id</code> and assigning <code class="highlighter-rouge">entry-id</code> on adding entries.</p>
<p>See <a href="../../api/ledger-adv-api">Ledger Advanced API</a> for more details.</p>
<h4 id="long-poll">Long Poll</h4>
<p><code class="highlighter-rouge">Long Poll</code> is a main feature that <a href="https://distributedlog.io">DistributedLog</a> uses to achieve low-latency tailing.
This big feature has been merged back in 4.5.0 and available to BookKeeper users.</p>
<p>This feature includes two main changes, one is <code class="highlighter-rouge">LastAddConfirmed</code> piggyback, while the other one is a new <code class="highlighter-rouge">long poll</code> read API.</p>
<p>The first change piggyback the latest <code class="highlighter-rouge">LastAddConfirm</code> along with the read response, so your <code class="highlighter-rouge">LastAddConfirmed</code> will be automatically advanced
when your read traffic continues. It significantly reduces the traffic to explicitly polling <code class="highlighter-rouge">LastAddConfirmed</code> and hence reduces the end-to-end latency.</p>
<p>The second change provides a new <code class="highlighter-rouge">long poll</code> read API, allowing tailing-reads without polling <code class="highlighter-rouge">LastAddConfirmed</code> everytime after readers exhaust known entries.
Although <code class="highlighter-rouge">long poll</code> API brings great latency improvements on tailing reads, it is still a very low-level primitive.
It is still recommended to use high level API (e.g. <a href="../../api/distributedlog-api">DistributedLog API</a>) for tailing and streaming use cases.</p>
<p>See <a href="https://bookkeeper.apache.org/distributedlog/docs/latest/user_guide/design/main.html#streaming-reads">Streaming Reads</a> for more details.</p>
<h4 id="explicit-lac">Explicit LAC</h4>
<p>Prior to 4.5.0, the <code class="highlighter-rouge">LAC</code> is only advanced when subsequent entries are added. If there is no subsequent entries added,
the last entry written will not be visible to readers until the ledger is closed. High-level client (e.g. DistributedLog) or applications
has to work around this by writing some sort of <code class="highlighter-rouge">control records</code> to advance <code class="highlighter-rouge">LAC</code>.</p>
<p>In 4.5.0, a new <code class="highlighter-rouge">explicit lac</code> feature is introduced to periodically advance <code class="highlighter-rouge">LAC</code> if there are not subsequent entries added. This feature
can be enabled by setting <code class="highlighter-rouge">explicitLacInterval</code> to a positive value.</p>
<h3 id="performance">Performance</h3>
<p>There are a lot for performance related bug fixes and improvements in 4.5.0. These changes includes:</p>
<ul>
<li>Upgraded netty from 3.x to 4.x to leverage buffer pooling and reduce memory copies.</li>
<li>Moved developement from Java 7 to Java 8 to take advantage of Java 8 features.</li>
<li>A lot of improvements around scheduling and threading on <code class="highlighter-rouge">bookies</code>.</li>
<li>Delay ensemble change to improve tail latency.</li>
<li>Parallel ledger recovery to improve the recovery speed.</li>
<li></li>
</ul>
<p>We outlined following four changes as below. For a complete list of performance improvements, please checkout the <code class="highlighter-rouge">full list of changes</code> at the end.</p>
<h4 id="netty-4-upgrade">Netty 4 Upgrade</h4>
<p>The major performance improvement introduced in 4.5.0, is upgrading netty from 3.x to <a href="http://netty.io/wiki/new-and-noteworthy-in-4.0.html">4.x</a>.</p>
<p>For more details, please read <a href="../../admin/upgrade">upgrade guide</a> about the netty related tips when upgrading bookkeeper from 4.4.0 to 4.5.0.</p>
<h4 id="delay-ensemble-change">Delay Ensemble Change</h4>
<p><code class="highlighter-rouge">Ensemble Change</code> is a feature that Apache BookKeeper uses to achieve high availability. However it is an expensive metadata operation.
Especially when Apache BookKeeper is deployed in a multiple data-centers environment, losing a data center will cause churn of metadata
operations due to ensemble changes. <code class="highlighter-rouge">Delay Ensemble Change</code> is introduced in 4.5.0 to overcome this problem. Enabling this feature means
an <code class="highlighter-rouge">Ensemble Change</code> will only occur when clients can’t receive enough valid responses to satisfy <code class="highlighter-rouge">ack-quorum</code> constraint. This feature
improves the tail latency.</p>
<p>To enable this feature, please set <code class="highlighter-rouge">delayEnsembleChange</code> to <code class="highlighter-rouge">true</code> on your clients.</p>
<h4 id="parallel-ledger-recovery">Parallel Ledger Recovery</h4>
<p>BookKeeper clients recovers entries one-by-one during ledger recovery. If a ledger has very large volumn of traffic, it will have
large number of entries to recover when client failures occur. BookKeeper introduces <code class="highlighter-rouge">parallel ledger recovery</code> in 4.5.0 to allow
batch recovery to improve ledger recovery speed.</p>
<p>To enable this feature, please set <code class="highlighter-rouge">enableParallelRecoveryRead</code> to <code class="highlighter-rouge">true</code> on your clients. You can also set <code class="highlighter-rouge">recoveryReadBatchSize</code>
to control the batch size of recovery read.</p>
<h4 id="multiple-journals">Multiple Journals</h4>
<p>Prior to 4.5.0, bookies are only allowed to configure one journal device. If you want to have high write bandwidth, you can raid multiple
disks into one device and mount that device for jouranl directory. However because there is only one journal thread, this approach doesn’t
actually improve the write bandwidth.</p>
<p>BookKeeper introduces multiple journal directories support in 4.5.0. Users can configure multiple devices for journal directories.</p>
<p>To enable this feature, please use <code class="highlighter-rouge">journalDirectories</code> rather than <code class="highlighter-rouge">journalDirectory</code>.</p>
<h3 id="operations">Operations</h3>
<h4 id="longhierarchicalledgermanager">LongHierarchicalLedgerManager</h4>
<p>Apache BookKeeper supports pluggable metadata store. By default, it uses Apache ZooKeeper as its metadata store. Among the zookeeper-based
ledger manager implementations, <code class="highlighter-rouge">HierarchicalLedgerManager</code> is the most popular and widely adopted ledger manager. However it has a major
limitation, which it assumes <code class="highlighter-rouge">ledger-id</code> is a 32-bits integer. It limits the number of ledgers to <code class="highlighter-rouge">2^32</code>.</p>
<p><code class="highlighter-rouge">LongHierarchicalLedgerManager</code> is introduced to overcome this limitation.</p>
<p>See <a href="../../getting-started/concepts/#ledger-manager">Ledger Manager</a> for more details.</p>
<h4 id="weight-based-placement-policy">Weight-based placement policy</h4>
<p><code class="highlighter-rouge">Rack-Aware</code> and <code class="highlighter-rouge">Region-Aware</code> placement polices are the two available placement policies in BookKeeper client. It places ensembles based
on users’ configured network topology. However they both assume that all nodes are equal. <code class="highlighter-rouge">weight-based</code> placement is introduced in 4.5.0 to
improve the existing placement polices. <code class="highlighter-rouge">weight-based</code> placement was not built as separated polices. It is built in the existing placement policies.
If you are using <code class="highlighter-rouge">Rack-Aware</code> or <code class="highlighter-rouge">Region-Aware</code>, you can simply enable <code class="highlighter-rouge">weight-based</code> placement by setting <code class="highlighter-rouge">diskWeightBasedPlacementEnabled</code> to <code class="highlighter-rouge">true</code>.</p>
<h4 id="customized-ledger-metadata">Customized Ledger Metadata</h4>
<p>A <code class="highlighter-rouge">Map&lt;String, byte[]&gt;</code> is introduced in ledger metadata in 4.5.0. Clients now are allowed to pass in a key/value map when creating ledgers.
This customized ledger metadata can be later on used by user defined placement policy. This extends the flexibility of bookkeeper API.</p>
<h4 id="add-prometheus-stats-provider">Add Prometheus stats provider</h4>
<p>A new <a href="https://prometheus.io/">Prometheus</a> <a href="https://github.com/apache/bookkeeper/tree/master/bookkeeper-stats-providers/prometheus-metrics-provider">stats provider</a>
is introduce in 4.5.0. It simplies the metric collection when running bookkeeper on <a href="https://kubernetes.io/">kubernetes</a>.</p>
<h4 id="add-more-tools-in-bookieshell">Add more tools in BookieShell</h4>
<p><code class="highlighter-rouge">BookieShell</code> is the tool provided by Apache BooKeeper to operate clusters. There are multiple importants tools introduced in 4.5.0, for example, <code class="highlighter-rouge">decommissionbookie</code>,
<code class="highlighter-rouge">expandstorage</code>, <code class="highlighter-rouge">lostbookierecoverydelay</code>, <code class="highlighter-rouge">triggeraudit</code>.</p>
<p>For the complete list of commands in <code class="highlighter-rouge">BookieShell</code>, please read <a href="../../reference/cli">BookKeeper CLI tool reference</a>.</p>
<h2 id="full-list-of-changes">Full list of changes</h2>
<h3 id="jira">JIRA</h3>
<h4 id="sub-task">Sub-task</h4>
<ul>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-552">BOOKKEEPER-552</a>] - 64 Bits Ledger ID Generation
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-553">BOOKKEEPER-553</a>] - New LedgerManager for 64 Bits Ledger ID Management in ZooKeeper
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-588">BOOKKEEPER-588</a>] - SSL support
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-873">BOOKKEEPER-873</a>] - Enhance CreatedLedger API to accept ledgerId as input
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-949">BOOKKEEPER-949</a>] - Allow entryLog creation even when bookie is in RO mode for compaction
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-965">BOOKKEEPER-965</a>] - Long Poll: Changes to the Write Path
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-997">BOOKKEEPER-997</a>] - Wire protocol change for supporting long poll
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1017">BOOKKEEPER-1017</a>] - Create documentation for ZooKeeper ACLs
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1086">BOOKKEEPER-1086</a>] - Ledger Recovery - Refactor PendingReadOp
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1087">BOOKKEEPER-1087</a>] - Ledger Recovery - Add a parallel reading request in PendingReadOp
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1088">BOOKKEEPER-1088</a>] - Ledger Recovery - Add a ReadEntryListener to callback on individual request
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1089">BOOKKEEPER-1089</a>] - Ledger Recovery - allow batch reads in ledger recovery
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1092">BOOKKEEPER-1092</a>] - Ledger Recovery - Add Test Case for Parallel Ledger Recovery
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1093">BOOKKEEPER-1093</a>] - Piggyback LAC on ReadResponse
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1094">BOOKKEEPER-1094</a>] - Long Poll - Server and Client Side Changes
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1095">BOOKKEEPER-1095</a>] - Long Poll - Client side changes
</li>
</ul>
<h4 id="bug">Bug</h4>
<ul>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-852">BOOKKEEPER-852</a>] - Release LedgerDescriptor and master-key objects when not used anymore
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-903">BOOKKEEPER-903</a>] - MetaFormat BookieShell Command is not deleting UnderReplicatedLedgers list from the ZooKeeper
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-907">BOOKKEEPER-907</a>] - for ReadLedgerEntriesCmd, EntryFormatter should be configurable and HexDumpEntryFormatter should be one of them
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-908">BOOKKEEPER-908</a>] - Case to handle BKLedgerExistException
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-924">BOOKKEEPER-924</a>] - addEntry() is susceptible to spurious wakeups
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-927">BOOKKEEPER-927</a>] - Extend BOOKKEEPER-886 to LedgerHandleAdv too (BOOKKEEPER-886: Allow to disable ledgers operation throttling)
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-933">BOOKKEEPER-933</a>] - ClientConfiguration always inherits System properties
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-938">BOOKKEEPER-938</a>] - LedgerOpenOp should use digestType from metadata
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-939">BOOKKEEPER-939</a>] - Fix typo in bk-merge-pr.py
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-940">BOOKKEEPER-940</a>] - Fix findbugs warnings after bumping to java 8
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-952">BOOKKEEPER-952</a>] - Fix RegionAwarePlacementPolicy
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-955">BOOKKEEPER-955</a>] - in BookKeeperAdmin listLedgers method currentRange variable is not getting updated to next iterator when it has run out of elements
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-956">BOOKKEEPER-956</a>] - HierarchicalLedgerManager doesn&#39;t work for ledgerid of length 9 and 10 because of order issue in HierarchicalLedgerRangeIterator
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-958">BOOKKEEPER-958</a>] - ZeroBuffer readOnlyBuffer returns ByteBuffer with 0 remaining bytes for length &gt; 64k
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-959">BOOKKEEPER-959</a>] - ClientAuthProvider and BookieAuthProvider Public API used Protobuf Shaded classes
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-976">BOOKKEEPER-976</a>] - Fix license headers with &quot;Copyright 2016 The Apache Software Foundation&quot;
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-980">BOOKKEEPER-980</a>] - BookKeeper Tools doesn&#39;t process the argument correctly
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-981">BOOKKEEPER-981</a>] - NullPointerException in RackawareEnsemblePlacementPolicy while running in Docker Container
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-984">BOOKKEEPER-984</a>] - BookieClientTest.testWriteGaps tested
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-986">BOOKKEEPER-986</a>] - Handle Memtable flush failure
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-987">BOOKKEEPER-987</a>] - BookKeeper build is broken due to the shade plugin for commit ecbb053e6e
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-988">BOOKKEEPER-988</a>] - Missing license headers
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-989">BOOKKEEPER-989</a>] - Enable travis CI for bookkeeper git
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-999">BOOKKEEPER-999</a>] - BookKeeper client can leak threads
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1013">BOOKKEEPER-1013</a>] - Fix findbugs errors on latest master
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1018">BOOKKEEPER-1018</a>] - Allow client to select older V2 protocol (no protobuf)
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1020">BOOKKEEPER-1020</a>] - Fix Explicit LAC tests on master
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1021">BOOKKEEPER-1021</a>] - Improve the merge script to handle github reviews api
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1031">BOOKKEEPER-1031</a>] - ReplicationWorker.rereplicate fails to call close() on ReadOnlyLedgerHandle
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1044">BOOKKEEPER-1044</a>] - Entrylogger is not readding rolled logs back to the logChannelsToFlush list when exception happens while trying to flush rolled logs
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1047">BOOKKEEPER-1047</a>] - Add missing error code in ZK setData return path
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1058">BOOKKEEPER-1058</a>] - Ignore already deleted ledger on replication audit
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1061">BOOKKEEPER-1061</a>] - BookieWatcher should not do ZK blocking operations from ZK async callback thread
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1065">BOOKKEEPER-1065</a>] - OrderedSafeExecutor should only have 1 thread per bucket
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1071">BOOKKEEPER-1071</a>] - BookieRecoveryTest is failing due to a Netty4 IllegalReferenceCountException
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1072">BOOKKEEPER-1072</a>] - CompactionTest is flaky when disks are almost full
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1073">BOOKKEEPER-1073</a>] - Several stats provider related changes.
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1074">BOOKKEEPER-1074</a>] - Remove JMX Bean
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1075">BOOKKEEPER-1075</a>] - BK LedgerMetadata: more memory-efficient parsing of configs
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1076">BOOKKEEPER-1076</a>] - BookieShell should be able to read the &#39;FENCE&#39; entry in the log
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1077">BOOKKEEPER-1077</a>] - BookKeeper: Local Bookie Journal and ledger paths
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1079">BOOKKEEPER-1079</a>] - shell lastMark throws NPE
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1098">BOOKKEEPER-1098</a>] - ZkUnderreplicationManager can build up an unbounded number of watchers
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1101">BOOKKEEPER-1101</a>] - BookKeeper website menus not working under https
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1102">BOOKKEEPER-1102</a>] - org.apache.bookkeeper.client.BookKeeperDiskSpaceWeightedLedgerPlacementTest.testDiskSpaceWeightedBookieSelectionWithBookiesBeingAdded is unreliable
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1103">BOOKKEEPER-1103</a>] - LedgerMetadataCreateTest bug in ledger id generation causes intermittent hang
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1104">BOOKKEEPER-1104</a>] - BookieInitializationTest.testWithDiskFullAndAbilityToCreateNewIndexFile testcase is unreliable
</li>
</ul>
<h4 id="improvement">Improvement</h4>
<ul>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-612">BOOKKEEPER-612</a>] - RegionAwarePlacement Policy
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-748">BOOKKEEPER-748</a>] - Move fence requests out of read threads
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-757">BOOKKEEPER-757</a>] - Ledger Recovery Improvement
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-759">BOOKKEEPER-759</a>] - bookkeeper: delay ensemble change if it doesn&#39;t break ack quorum requirement
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-772">BOOKKEEPER-772</a>] - Reorder read sequnce
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-874">BOOKKEEPER-874</a>] - Explict LAC from Writer to Bookies
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-881">BOOKKEEPER-881</a>] - upgrade surefire plugin to 2.19
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-887">BOOKKEEPER-887</a>] - Allow to use multiple bookie journals
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-922">BOOKKEEPER-922</a>] - Create a generic (K,V) map to store ledger metadata
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-935">BOOKKEEPER-935</a>] - Publish sources and javadocs to Maven Central
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-937">BOOKKEEPER-937</a>] - Upgrade protobuf to 2.6
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-944">BOOKKEEPER-944</a>] - Multiple issues and improvements to BK Compaction.
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-945">BOOKKEEPER-945</a>] - Add counters to track the activity of auditor and replication workers
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-946">BOOKKEEPER-946</a>] - Provide an option to delay auto recovery of lost bookies
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-961">BOOKKEEPER-961</a>] - Assing read/write request for same ledger to a single thread
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-962">BOOKKEEPER-962</a>] - Add more journal timing stats
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-963">BOOKKEEPER-963</a>] - Allow to use multiple journals in bookie
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-964">BOOKKEEPER-964</a>] - Add concurrent maps and sets for primitive types
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-966">BOOKKEEPER-966</a>] - change the bookieServer cmdline to make conf-file and option co-exist
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-968">BOOKKEEPER-968</a>] - Entry log flushes happen on log rotation and cause long spikes in IO utilization
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-970">BOOKKEEPER-970</a>] - Bump zookeeper version to 3.5
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-971">BOOKKEEPER-971</a>] - update bk codahale stats provider version
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-998">BOOKKEEPER-998</a>] - Increased the max entry size to 5MB
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1001">BOOKKEEPER-1001</a>] - Make LocalBookiesRegistry.isLocalBookie() public
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1002">BOOKKEEPER-1002</a>] - BookieRecoveryTest can run out of file descriptors
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1003">BOOKKEEPER-1003</a>] - Fix TestDiskChecker so it can be used on /dev/shm
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1004">BOOKKEEPER-1004</a>] - Allow bookie garbage collection to be triggered manually from tests
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1007">BOOKKEEPER-1007</a>] - Explicit LAC: make the interval configurable in milliseconds instead of seconds
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1008">BOOKKEEPER-1008</a>] - Move to netty4
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1010">BOOKKEEPER-1010</a>] - Bump up Guava version to 20.0
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1022">BOOKKEEPER-1022</a>] - Make BookKeeperAdmin implement AutoCloseable
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1039">BOOKKEEPER-1039</a>] - bk-merge-pr.py ask to run findbugs and rat before merge
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1046">BOOKKEEPER-1046</a>] - Avoid long to Long conversion in OrderedSafeExecutor task submit
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1048">BOOKKEEPER-1048</a>] - Use ByteBuf in LedgerStorageInterface
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1050">BOOKKEEPER-1050</a>] - Cache journalFormatVersionToWrite when starting Journal
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1051">BOOKKEEPER-1051</a>] - Fast shutdown for GarbageCollectorThread
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1052">BOOKKEEPER-1052</a>] - Print autorecovery enabled or not in bookie shell
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1053">BOOKKEEPER-1053</a>] - Upgrade RAT maven version to 0.12 and ignore Eclipse project files
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1055">BOOKKEEPER-1055</a>] - Optimize handling of masterKey in case it is empty
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1056">BOOKKEEPER-1056</a>] - Removed PacketHeader serialization/deserialization allocation
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1063">BOOKKEEPER-1063</a>] - Use executure.execute() instead of submit() to avoid creation of unused FutureTask
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1066">BOOKKEEPER-1066</a>] - Introduce GrowableArrayBlockingQueue
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1068">BOOKKEEPER-1068</a>] - Expose ByteBuf in LedgerEntry to avoid data copy
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1069">BOOKKEEPER-1069</a>] - If client uses V2 proto, set the connection to always decode V2 messages
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1083">BOOKKEEPER-1083</a>] - Improvements on OrderedSafeExecutor
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1084">BOOKKEEPER-1084</a>] - Make variables finale if necessary
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1085">BOOKKEEPER-1085</a>] - Introduce the AlertStatsLogger
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1090">BOOKKEEPER-1090</a>] - Use LOG.isDebugEnabled() to avoid unexpected allocations
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1096">BOOKKEEPER-1096</a>] - When ledger is deleted, along with leaf node all the eligible branch nodes also should be deleted in ZooKeeper.
</li>
</ul>
<h4 id="new-feature">New Feature</h4>
<ul>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-390">BOOKKEEPER-390</a>] - Provide support for ZooKeeper authentication
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-391">BOOKKEEPER-391</a>] - Support Kerberos authentication of bookkeeper
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-575">BOOKKEEPER-575</a>] - Bookie SSL support
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-670">BOOKKEEPER-670</a>] - Longpoll Read &amp; Piggyback Support
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-912">BOOKKEEPER-912</a>] - Allow EnsemblePlacementPolicy to choose bookies using ledger custom data (multitenancy support)
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-928">BOOKKEEPER-928</a>] - Add custom client supplied metadata field to LedgerMetadata
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-930">BOOKKEEPER-930</a>] - Option to disable Bookie networking
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-941">BOOKKEEPER-941</a>] - Introduce Feature Switches For controlling client and server behavior
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-948">BOOKKEEPER-948</a>] - Provide an option to add more ledger/index directories to a bookie
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-950">BOOKKEEPER-950</a>] - Ledger placement policy to accomodate different storage capacity of bookies
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-969">BOOKKEEPER-969</a>] - Security Support
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-983">BOOKKEEPER-983</a>] - BookieShell Command for LedgerDelete
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-991">BOOKKEEPER-991</a>] - bk shell - Get a list of all on disk files
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-992">BOOKKEEPER-992</a>] - ReadLog Command Enhancement
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1019">BOOKKEEPER-1019</a>] - Support for reading entries after LAC (causal consistency driven by out-of-band communications)
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1034">BOOKKEEPER-1034</a>] - When all disks are full, start Bookie in RO mode if RO mode is enabled
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1067">BOOKKEEPER-1067</a>] - Add Prometheus stats provider
</li>
</ul>
<h4 id="story">Story</h4>
<ul>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-932">BOOKKEEPER-932</a>] - Move to JDK 8
</li>
</ul>
<h4 id="task">Task</h4>
<ul>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-931">BOOKKEEPER-931</a>] - Update the committers list on website
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-996">BOOKKEEPER-996</a>] - Apache Rat Check Failures
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1012">BOOKKEEPER-1012</a>] - Shade and relocate Guava
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1027">BOOKKEEPER-1027</a>] - Cleanup main README and main website page
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1038">BOOKKEEPER-1038</a>] - Fix findbugs warnings and upgrade to 3.0.4
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1043">BOOKKEEPER-1043</a>] - Upgrade Apache Parent Pom Reference to latest version
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1054">BOOKKEEPER-1054</a>] - Add gitignore file
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1059">BOOKKEEPER-1059</a>] - Upgrade to SLF4J-1.7.25
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1060">BOOKKEEPER-1060</a>] - Add utility to use SafeRunnable from Java8 Lambda
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1070">BOOKKEEPER-1070</a>] - bk-merge-pr.py use apache-rat:check goal instead of rat:rat
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1091">BOOKKEEPER-1091</a>] - Remove Hedwig from BookKeeper website page
</li>
</ul>
<h4 id="test">Test</h4>
<ul>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-967">BOOKKEEPER-967</a>] - Create new testsuite for testing RackAwareEnsemblePlacementPolicy using ScriptBasedMapping.
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1045">BOOKKEEPER-1045</a>] - Execute tests in different JVM processes
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1064">BOOKKEEPER-1064</a>] - ConcurrentModificationException in AuditorLedgerCheckerTest
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1078">BOOKKEEPER-1078</a>] - Local BookKeeper enhancements for testability
</li>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-1097">BOOKKEEPER-1097</a>] - GC test when no WritableDirs
</li>
</ul>
<h4 id="wish">Wish</h4>
<ul>
<li>[<a href="https://issues.apache.org/jira/browse/BOOKKEEPER-943">BOOKKEEPER-943</a>] - Reduce log level of AbstractZkLedgerManager for register/unregister ReadOnlyLedgerHandle
</li>
</ul>
<h3 id="github">Github</h3>
<ul>
<li><a href="https://github.com/apache/bookkeeper/milestone/1">https://github.com/apache/bookkeeper/milestone/1</a></li>
</ul>
</section>
</div>
</div>
<div class="column is-2 is-hidden-mobile">
<div class="toc">
<h2 class="title">Apache BookKeeper 4.5.0 Release Notes</h2>
<ul class="section-nav">
<li class="toc-entry toc-h2"><a href="#highlights">Highlights</a>
<ul>
<li class="toc-entry toc-h3"><a href="#dependencies-upgrade">Dependencies Upgrade</a></li>
<li class="toc-entry toc-h3"><a href="#security">Security</a></li>
<li class="toc-entry toc-h3"><a href="#public-api">Public API</a>
<ul>
<li class="toc-entry toc-h4"><a href="#ledgerhandleadv">LedgerHandleAdv</a></li>
<li class="toc-entry toc-h4"><a href="#long-poll">Long Poll</a></li>
<li class="toc-entry toc-h4"><a href="#explicit-lac">Explicit LAC</a></li>
</ul>
</li>
<li class="toc-entry toc-h3"><a href="#performance">Performance</a>
<ul>
<li class="toc-entry toc-h4"><a href="#netty-4-upgrade">Netty 4 Upgrade</a></li>
<li class="toc-entry toc-h4"><a href="#delay-ensemble-change">Delay Ensemble Change</a></li>
<li class="toc-entry toc-h4"><a href="#parallel-ledger-recovery">Parallel Ledger Recovery</a></li>
<li class="toc-entry toc-h4"><a href="#multiple-journals">Multiple Journals</a></li>
</ul>
</li>
<li class="toc-entry toc-h3"><a href="#operations">Operations</a>
<ul>
<li class="toc-entry toc-h4"><a href="#longhierarchicalledgermanager">LongHierarchicalLedgerManager</a></li>
<li class="toc-entry toc-h4"><a href="#weight-based-placement-policy">Weight-based placement policy</a></li>
<li class="toc-entry toc-h4"><a href="#customized-ledger-metadata">Customized Ledger Metadata</a></li>
<li class="toc-entry toc-h4"><a href="#add-prometheus-stats-provider">Add Prometheus stats provider</a></li>
<li class="toc-entry toc-h4"><a href="#add-more-tools-in-bookieshell">Add more tools in BookieShell</a></li>
</ul>
</li>
</ul>
</li>
<li class="toc-entry toc-h2"><a href="#full-list-of-changes">Full list of changes</a>
<ul>
<li class="toc-entry toc-h3"><a href="#jira">JIRA</a>
<ul>
<li class="toc-entry toc-h4"><a href="#sub-task">Sub-task</a></li>
<li class="toc-entry toc-h4"><a href="#bug">Bug</a></li>
<li class="toc-entry toc-h4"><a href="#improvement">Improvement</a></li>
<li class="toc-entry toc-h4"><a href="#new-feature">New Feature</a></li>
<li class="toc-entry toc-h4"><a href="#story">Story</a></li>
<li class="toc-entry toc-h4"><a href="#task">Task</a></li>
<li class="toc-entry toc-h4"><a href="#test">Test</a></li>
<li class="toc-entry toc-h4"><a href="#wish">Wish</a></li>
</ul>
</li>
<li class="toc-entry toc-h3"><a href="#github">Github</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
<div id="entry-popover-html" class="popover-template">
<p>An entry is a sequence of bytes (plus some metadata) written to a BookKeeper ledger. Entries are also known as records.</p>
</div>
<div id="ledger-popover-html" class="popover-template">
<p>A ledger is a sequence of entries written to BookKeeper. Entries are written sequentially to ledgers and at most once, giving ledgers append-only semantics.</p>
</div>
<div id="bookie-popover-html" class="popover-template">
<p>A bookie is an individual BookKeeper storage server.</p>
<p>Bookies store the content of ledgers and act as a distributed ensemble.</p>
</div>
<div id="rereplication-popover-html" class="popover-template">
<p>A subsystem that runs in the background on bookies to ensure that ledgers are fully replicated even if one bookie from the ensemble is down.</p>
</div>
<div id="striping-popover-html" class="popover-template">
<p>Striping is the process of distributing BookKeeper ledgers to sub-groups of bookies rather than to all bookies in a BookKeeper ensemble.</p>
<p>Striping is essential to ensuring fast performance.</p>
</div>
<div id="striped-popover-html" class="popover-template">
<p>Striping is the process of distributing BookKeeper ledgers to sub-groups of bookies rather than to all bookies in a BookKeeper ensemble.</p>
<p>Striping is essential to ensuring fast performance.</p>
</div>
<div id="journal-popover-html" class="popover-template">
<p>A journal file stores BookKeeper transaction logs.</p>
</div>
<div id="fencing-popover-html" class="popover-template">
<p>When a reader forces a ledger to close, preventing any further entries from being written to the ledger.</p>
</div>
<div id="record-popover-html" class="popover-template">
<p>A record is a sequence of bytes (plus some metadata) written to a BookKeeper ledger. Records are also known as entries.</p>
</div>
<script type="text/javascript">
tippy('#entry-popover', {
html: '#entry-popover-html',
arrow: true,
animation: 'fade'
});
tippy('#ledger-popover', {
html: '#ledger-popover-html',
arrow: true,
animation: 'fade'
});
tippy('#bookie-popover', {
html: '#bookie-popover-html',
arrow: true,
animation: 'fade'
});
tippy('#rereplication-popover', {
html: '#rereplication-popover-html',
arrow: true,
animation: 'fade'
});
tippy('#striping-popover', {
html: '#striping-popover-html',
arrow: true,
animation: 'fade'
});
tippy('#striped-popover', {
html: '#striped-popover-html',
arrow: true,
animation: 'fade'
});
tippy('#journal-popover', {
html: '#journal-popover-html',
arrow: true,
animation: 'fade'
});
tippy('#fencing-popover', {
html: '#fencing-popover-html',
arrow: true,
animation: 'fade'
});
tippy('#record-popover', {
html: '#record-popover-html',
arrow: true,
animation: 'fade'
});
</script>
</main>
<footer class="footer">
<div class="container">
<div class="content has-text-centered">
<p>
Copyright &copy; 2016 - 2021 <a href="https://www.apache.org/">The Apache Software Foundation</a>,<br /> licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, version 2.0</a>.
</p>
<p>
Apache BookKeeper, BookKeeper®, Apache®, the Apache feature logo, and the Apache BookKeeper logo are either registered trademarks or trademarks of The Apache Software Foundation.
</p>
</div>
</div>
</footer>
</body>
<script src="/js/app.js"></script>
<!--
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.
-->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-104419626-1', 'auto');
ga('send', 'pageview');
</script>
</html>