blob: 4c038a5d4d104ed18a675d7c2b48d187d1fc78fe [file] [log] [blame]
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Core Library Configuration &mdash; DistributedLog 1.0 documentation</title>
<link rel="stylesheet" href="../_static/override.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/bootstrap-3.1.0/css/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="../_static/bootstrap-3.1.0/css/bootstrap-theme.min.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/featherlight.min.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/docbird.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/docbird-xs.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/jquery.rateyo.min.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/selection-sharer.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<script type="text/javascript" src="../_static/bootstrap-3.1.0/js/bootstrap.min.js"></script>
<script type="text/javascript" src="../_static/js/bootstrap-docbird.js"></script>
<script type="text/javascript" src="../_static/js/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="../_static/js/jquery-fix.js"></script>
<script type="text/javascript" src="../_static/js/featherlight.min.js"></script>
<script type="text/javascript" src="../_static/js/ifvisible.js"></script>
<script type="text/javascript" src="../_static/js/timeme.js"></script>
<script type="text/javascript" src="../_static/js/jquery.rateyo.min.js"></script>
<script type="text/javascript" src="../_static/js/js.cookie.js"></script>
<link rel="shortcut icon" href="../_static/docbird.ico"/>
<link rel="top" title="DistributedLog 1.0 documentation" href="../index.html" />
<link rel="up" title="Configuration" href="main.html" />
<link rel="next" title="Write Proxy Configuration" href="proxy.html" />
<link rel="prev" title="Configuration" href="main.html" />
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
<meta name="apple-mobile-web-app-capable" content="yes">
<meta property="docbird:project" content="DistributedLog" />
</head>
<body>
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container-fluid">
<div class="row db-header">
<div class="col-sm-3 col-md-3 col-lg-3 hidden-xs db-header-controls">
<a href="/" alt="Back to Docbird">
<div class="db-home-button">
<span class="glyphicon glyphicon-home"></span>
</div>
</a>
<form action="../search.html" method="get" class="db-searchbox-form">
<div class="form-group">
<input type="text" name="q" class="form-control db-searchbox-input" placeholder="Search DistributedLog" />
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
<div class="col-sm-7 col-md-7 col-lg-7 col-xs-12 db-header-info">
<div class="visible-xs">
<a href="/" alt="Back to Docbird">
<div class="db-home-button">
<span class="glyphicon glyphicon-home"></span>
</div>
</a>
</div>
<div class="visible-xs db-xs-menu-button">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#db-xs-menu">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
</div>
<div class="db-header-projectname">
<h1><a href="../index.html">DistributedLog</a></h1>
</div>
</div>
</div>
<div class="row db-xs-menu hidden-sm hidden-md hidden-lg
collapse" id="db-xs-menu">
<form action="../search.html" method="get" class="db-searchbox-form">
<div class="form-group">
<input type="text" name="q" class="form-control db-searchbox-input" placeholder="Search DistributedLog" />
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<div class="db-toc" role="complementary">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../download.html">Releases</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../download.html#rc1">0.3.51-RC1</a></li>
<li class="toctree-l2"><a class="reference internal" href="../download.html#rc0">0.3.51-RC0</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../basics/main.html">Getting Started</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../basics/introduction.html">Introduction</a></li>
<li class="toctree-l2"><a class="reference internal" href="../basics/quickstart.html">Quick Start</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../api/main.html">API</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../api/core.html">Core Library API</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/proxy.html">Write Proxy Client API</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/practice.html">Best Practices</a></li>
</ul>
</li>
<li class="toctree-l1 current"><a class="reference internal" href="main.html">Configuration</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="">Core Library Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="proxy.html">Write Proxy Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="client.html">Client Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="perlog.html">Per Stream Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../considerations/main.html">Considerations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../considerations/main.html#consistency-durability-and-ordering">Consistency, Durability and Ordering</a></li>
<li class="toctree-l2"><a class="reference internal" href="../considerations/main.html#partitioning">Partitioning</a></li>
<li class="toctree-l2"><a class="reference internal" href="../considerations/main.html#processing-semantics">Processing Semantics</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../architecture/main.html">Architecture</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../architecture/main.html#data-model">Data Model</a></li>
<li class="toctree-l2"><a class="reference internal" href="../architecture/main.html#software-stack">Software Stack</a></li>
<li class="toctree-l2"><a class="reference internal" href="../architecture/main.html#lifecyle-of-records">Lifecyle of records</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../design/main.html">Detail Design</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../design/main.html#consistency">Consistency</a></li>
<li class="toctree-l2"><a class="reference internal" href="../design/main.html#streaming-reads">Streaming Reads</a></li>
<li class="toctree-l2"><a class="reference internal" href="../design/main.html#logsegment-lifecycle">LogSegment Lifecycle</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../globalreplicatedlog/main.html">Global Replicated Log</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../globalreplicatedlog/main.html#region-aware-data-placement-policy">Region Aware Data Placement Policy</a></li>
<li class="toctree-l2"><a class="reference internal" href="../globalreplicatedlog/main.html#cross-region-speculative-reads">Cross Region Speculative Reads</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../implementation/main.html">Implementation</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../implementation/storage.html">Storage</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../operations/main.html">Deployment &amp; Administration</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../operations/deployment.html">Cluster Setup &amp; Deployment</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/operations.html">DistributedLog Operations</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/performance.html">Performance Tuning</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/hardware.html">Hardware</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/monitoring.html">Monitoring</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/zookeeper.html">ZooKeeper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/bookkeeper.html">BookKeeper</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../performance/main.html">Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="../references/main.html">References</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../references/configuration.html">Configuration Settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../references/metrics.html">Metrics</a></li>
<li class="toctree-l2"><a class="reference internal" href="../references/features.html">Features</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../tutorials/main.html">Tutorials</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/main.html#basic">Basic</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/main.html#messaging">Messaging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/main.html#replicated-state-machines">Replicated State Machines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/main.html#analytics">Analytics</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../developer/main.html">Developer</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../developer/release.html">Release</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../faq.html">FAQ</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div style="z-index: 1" class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<style>
.overflow-container {
display: none;
}
.overflow-toggle {
text-decoration: none;
border-bottom: none;
border-radius: 4px;
border: 1px solid #eee;
padding: 1px 3px 3px;
color: #888;
font-weight: normal;
background-color: linen;
line-height: 1.85em;
cursor: pointer;
}
.overflow-toggle:hover {
color: #333;
border-color: #ccc;
background-color: beige;
}
</style>
<script>
$(function(){
$('.overflow-toggle').on('click', function(){
$(this).next().toggle();
});
});
</script>
<div class="db-project-header-container">
<div class="row">
<div class="db-project-info col-lg-12 col-md-12 col-sm-12 col-xs-12">
<h1>
<a href="../index.html">DistributedLog</a>
</h1>
<div class="db-code-link">
<a href="git@github.com:twitter/distributedlog.git/tree/master/" target="_blank">git@github.com:twitter/distributedlog.git/tree/master/</a>
</div>
</div>
</div>
<div class="row db-project-links-row">
<div class=" col-sm-3 col-md-3 col-lg-3 db-project-link-column">
<div class="db-hashtag-container">
<span class="db-project-link-label">OWNERS</span>
<em>None</em>
</div>
</div>
<div class="col-sm-3 col-md-3 col-lg-3 db-project-link-column">
<div class="db-hashtag-container">
<span class="db-project-link-label">TAGS</span>
<em><a class="db-hashtag" href="/?q=tags:%23uses_maven">#uses_maven</a></em>
</div>
</div>
<div class="col-sm-3 col-md-3 col-lg-3 db-project-link-column">
<span class="db-project-link-label">HEALTH</span>
<h3 style="margin-top: 0">
<!-- <a href="/techdocs/checklist.html" class="label label-success">-->
<a href="/report/distributedlog" class="">
9.0 / 10
<span style="margin-left: .25em" class="glyphicon glyphicon-ok"></span>
</a>
</h3>
</div>
<div class="col-sm-3 col-md-3 col-lg-3 db-project-link-column">
<span class="db-project-link-label">RATING</span>
<div id="rateYo"></div>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-sm-8 col-md-8 col-lg-8">
<div class="db-content-body">
<div class="section" id="core-library-configuration">
<h1>Core Library Configuration<a class="headerlink" href="#core-library-configuration" title="Permalink to this headline">¶</a></h1>
<p>This section describes the configuration settings used by DistributedLog Core Library.</p>
<p>All the core library settings are managed in <cite>DistributedLogConfiguration</cite>, which is
basically a properties based configuration, which extends from Apache commons
<cite>CompositeConfiguration</cite>. All the DL settings are in camel case and prefixed with a
meaningful component name. For example, <cite>zkSessionTimeoutSeconds</cite> means the session timeout
for component <cite>zk</cite> in seconds.</p>
<p>The default distributedlog configuration is constructed by instantiating an instance
of <cite>DistributedLogConfiguration</cite>. This distributedlog configuration will automatically load
the settings that specified via <cite>SystemConfiguration</cite>.</p>
<div class="highlight-python"><pre>DistributedLogConfiguration conf = new DistributedLogConfiguration();</pre>
<div style='display:none;' class='raw-code'><pre>DistributedLogConfiguration conf = new DistributedLogConfiguration();</pre>
</div></div>
<p>The recommended way is to load configuration from URL that points to a configuration file
(<cite>#loadConf(URL)</cite>).</p>
<div class="highlight-python"><pre>String configFile = "/path/to/distributedlog/conf/file";
DistributedLogConfiguration conf = new DistributedLogConfiguration();
conf.loadConf(new File(configFile).toURI().toURL());</pre>
<div style='display:none;' class='raw-code'><pre>String configFile = "/path/to/distributedlog/conf/file";
DistributedLogConfiguration conf = new DistributedLogConfiguration();
conf.loadConf(new File(configFile).toURI().toURL());</pre>
</div></div>
<div class="section" id="zookeeper-settings">
<h2>ZooKeeper Settings<a class="headerlink" href="#zookeeper-settings" title="Permalink to this headline">¶</a></h2>
<p>A distributedlog namespace usually creates two zookeeper client instances: one is used
for DL metadata operations, while the other one is used by bookkeeper. All the zookeeper
clients are <em>retryable</em> clients, which they would reconnect when session is expired.</p>
<div class="section" id="dl-zookeeper-settings">
<h3>DL ZooKeeper Settings<a class="headerlink" href="#dl-zookeeper-settings" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><em>zkSessionTimeoutSeconds</em>: ZooKeeper session timeout, in seconds. Default is 30 seconds.</li>
<li><em>zkNumRetries</em>: Number of retries of each zookeeper request could attempt on retryable exceptions.
Default is 3.</li>
<li><em>zkRetryStartBackoffMillis</em>: The initial backoff time of first retry of each zookeeper request, in milliseconds.
Default is 5000.</li>
<li><em>zkRetryMaxBackoffMillis</em>: The max backoff time of retries of each zookeeper request, in milliseconds.
Default is 30000.</li>
<li><em>zkcNumRetryThreads</em>: The number of retry threads used by this zookeeper client. Default is 1.</li>
<li><em>zkRequestRateLimit</em>: The rate limiter is basically a guava <cite>RateLimiter</cite>. It is rate limiting the
requests that sent by zookeeper client per second. If the value is non-positive, the rate limiting
is disable. Default is 0.</li>
<li><em>zkAclId</em>: The digest id used for zookeeper ACL. If it is null, ACL is disabled. Default is null.</li>
</ul>
</div>
<div class="section" id="bk-zookeeper-settings">
<h3>BK ZooKeeper Settings<a class="headerlink" href="#bk-zookeeper-settings" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><em>bkcZKSessionTimeoutSeconds</em>: ZooKeeper session timeout, in seconds. Default is 30 seconds.</li>
<li><em>bkcZKNumRetries</em>: Number of retries of each zookeeper request could attempt on retryable exceptions.
Default is 3.</li>
<li><em>bkcZKRetryStartBackoffMillis</em>: The initial backoff time of first retry of each zookeeper request, in milliseconds.
Default is 5000.</li>
<li><em>bkcZKRetryMaxBackoffMillis</em>: The max backoff time of retries of each zookeeper request, in milliseconds.
Default is 30000.</li>
<li><em>bkcZKRequestRateLimit</em>: The rate limiter is basically a guava <cite>RateLimiter</cite>. It is rate limiting the
requests that sent by zookeeper client per second. If the value is non-positive, the rate limiting
is disable. Default is 0.</li>
</ul>
<p>There are a few rules to follow when optimizing the zookeeper settings:</p>
<ol class="arabic simple">
<li>In general, higher session timeout is much better than lower timeout, which will make zookeeper client
more resilent to any network glitches.</li>
<li>A lower backoff time is better for latency, as it would trigger fast retries. But it
could trigger retry storm if the backoff time is too low.</li>
<li>Number of retries should be tuned based on the backoff time settings and corresponding latency SLA budget.</li>
<li>BK and DL readers use zookeeper client for metadata accesses. It is recommended to have higher session timeout,
higher number of retries and proper backoff time.</li>
<li>DL writers also use zookeeper client for ownership tracking. It is required to act quickly on network glitches.
It is recommended to have low session timeout, low backoff time and proper number of retries.</li>
</ol>
</div>
</div>
<div class="section" id="bookkeeper-settings">
<h2>BookKeeper Settings<a class="headerlink" href="#bookkeeper-settings" title="Permalink to this headline">¶</a></h2>
<p>All the bookkeeper client configuration settings could be loaded via <cite>DistributedLogConfiguration</cite>. All of them
are prefixed with <cite>bkc.</cite>. For example, <cite>bkc.zkTimeout</cite> in distributedlog configuration will be applied as
<cite>zkTimeout</cite> in bookkeeper client configuration.</p>
<div class="section" id="general-settings">
<h3>General Settings<a class="headerlink" href="#general-settings" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><em>bkcNumIOThreads</em>: The number of I/O threads used by netty in bookkeeper client.
The default value is <cite>numWorkerThreads</cite>.</li>
</ul>
</div>
<div class="section" id="timer-settings">
<h3>Timer Settings<a class="headerlink" href="#timer-settings" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><em>timerTickDuration</em>: The tick duration in milliseconds that used for timeout
timer in bookkeeper client. The default value is 100 milliseconds.</li>
<li><em>timerNumTicks</em>: The number of ticks that used for timeout timer in bookkeeper client.
The default value is 1024.</li>
</ul>
</div>
<div class="section" id="data-placement-settings">
<h3>Data Placement Settings<a class="headerlink" href="#data-placement-settings" title="Permalink to this headline">¶</a></h3>
<p>A log segment is backed by a bookkeeper <cite>ledger</cite>. A ledger's data is stored in an ensemble
of bookies in a stripping way. Each entry will be added in a <cite>write-quorum</cite> size of bookies.
The add operation will complete once it receives responses from a <cite>ack-quorum</cite> size of bookies.
The stripping is done in a round-robin way in bookkeeper.</p>
<p>For example, we configure the ensemble-size to 5, write-quorum-size to 3,
and ack-quorum-size to 2. The data will be stored in following stripping way.</p>
<div class="highlight-python"><pre>| entry id | bk1 | bk2 | bk3 | bk4 | bk5 |
| 0 | x | x | x | | |
| 1 | | x | x | x | |
| 2 | | | x | x | x |
| 3 | x | | | x | x |
| 4 | x | x | | | x |
| 5 | x | x | x | | |</pre>
<div style='display:none;' class='raw-code'><pre>| entry id | bk1 | bk2 | bk3 | bk4 | bk5 |
| 0 | x | x | x | | |
| 1 | | x | x | x | |
| 2 | | | x | x | x |
| 3 | x | | | x | x |
| 4 | x | x | | | x |
| 5 | x | x | x | | |</pre>
</div></div>
<p>We don't recommend stripping within a log segment to increase bandwidth. We'd recommend using
multiple distributedlog streams to increase bandwidth in higher level of distributedlog. so
typically the ensemble size will be set to be the same value as <cite>write-quorum-size</cite>.</p>
<ul class="simple">
<li><em>bkcEnsembleSize</em>: The ensemble size of the log segment. The default value is 3.</li>
<li><em>bkcWriteQuorumSize</em>: The write quorum size of the log segment. The default value is 3.</li>
<li><em>bkcAckQuorumSize</em>: The ack quorumm size of the log segment. The default value is 2.</li>
</ul>
<div class="section" id="dns-resolver-settings">
<h4>DNS Resolver Settings<a class="headerlink" href="#dns-resolver-settings" title="Permalink to this headline">¶</a></h4>
<p>DistributedLog uses bookkeeper's <cite>rack-aware</cite> data placement policy on placing data across
bookkeeper nodes. The <cite>rack-aware</cite> data placement uses a DNS resolver to resolve a bookie
address into a network location and then use those locations to build the network topology.</p>
<p>There are two built-in DNS resolvers in DistributedLog:</p>
<ol class="arabic simple">
<li><em>DNSResolverForRacks</em>: It resolves domain name like <cite>(region)-(rack)-xxx-xxx.*</cite> to
network location <cite>/(region)/(rack)</cite>. If resolution failed, it returns <cite>/default-region/default-rack</cite>.</li>
<li><em>DNSResolverForRows</em>: It resolves domain name like <cite>(region)-(row)xx-xxx-xxx.*</cite> to
network location <cite>/(region)/(row)</cite>. If resolution failed, it returns <cite>/default-region/default-row</cite>.</li>
</ol>
<p>The DNS resolver could be loaded by reflection via <cite>bkEnsemblePlacementDnsResolverClass</cite>.</p>
<p><cite>(region)</cite> could be overrided in a configured <cite>dnsResolverOverrides</cite>. For example, if the
host name is <cite>(regionA)-(row1)-xx-yyy</cite>, it would be resolved to <cite>/regionA/row1</cite> without any
overrides. If the specified overrides is <cite>(regionA)-(row1)-xx-yyy:regionB</cite>,
the resolved network location would be <cite>/regionB/row1</cite>. Allowing overriding region provides
the optimization hits to bookkeeper if two <cite>logical</cite> regions are in same or close locations.</p>
<ul class="simple">
<li><em>bkEnsemblePlacementDnsResolverClass</em>: The DNS resolver class for bookkeeper rack-aware ensemble placement.
The default value is <cite>DNSResolverForRacks</cite>.</li>
<li><em>bkRowAwareEnsemblePlacement</em>: A flag indicates whether <cite>DNSResolverForRows</cite> should be used.
If enabled, <cite>DNSResolverForRows</cite> will be used for DNS resolution in rack-aware placement policy.
Otherwise, it would use the DNS resolver configured by <cite>bkEnsemblePlacementDnsResolverClass</cite>.</li>
<li><em>dnsResolverOverrides</em>: The mapping used to override the region mapping derived by the DNS resolver.
The value is a string of pairs of host-region mappings (<cite>host:region</cite>) separated by semicolon.
By default it is empty string.</li>
</ul>
</div>
</div>
</div>
<div class="section" id="namespace-configuration-settings">
<h2>Namespace Configuration Settings<a class="headerlink" href="#namespace-configuration-settings" title="Permalink to this headline">¶</a></h2>
<p>This section lists all the general settings used by <cite>DistributedLogNamespace</cite>.</p>
<div class="section" id="executor-settings">
<h3>Executor Settings<a class="headerlink" href="#executor-settings" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><em>numWorkerThreads</em>: The number of worker threads used by the namespace instance.
The default value is the number of available processors.</li>
<li><em>numReadAheadWorkerThreads</em>: The number of dedicated readahead worker treads used
by the namespace instance. If it is non-positive, it would share the same executor
for readahead. Otherwise, it would create a dedicated executor for readahead.
The default value is 0.</li>
<li><em>numLockStateThreads</em>: The number of lock state threads used by the namespace instance.
The default value is 1.</li>
<li><em>schedulerShutdownTimeoutMs</em>: The timeout value in milliseconds, for shutting down
schedulers in the namespace instance. The default value is 5000ms.</li>
<li><em>useDaemonThread</em>: The flag whether to use daemon thread for DL executor threads.
The default value is false.</li>
</ul>
</div>
<div class="section" id="metadata-settings">
<h3>Metadata Settings<a class="headerlink" href="#metadata-settings" title="Permalink to this headline">¶</a></h3>
<p>The log segment metadata is serialized into a string of content with a version. The version in log segment
metadata allows us evolving changes to metadata. All the versions supported by distributedlog right now
are listed in the below table.</p>
<table border="1" class="docutils">
<colgroup>
<col width="9%" />
<col width="91%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">version</th>
<th class="head">description</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td>0</td>
<td>Invalid version number.</td>
</tr>
<tr class="row-odd"><td>1</td>
<td>Basic version number.
Inprogress: start tx id, ledger id, region id
Completed: start/end tx id, ledger id, region id, record count and completion time</td>
</tr>
<tr class="row-even"><td>2</td>
<td>Introduced LSSN (LogSegment Sequence Number)</td>
</tr>
<tr class="row-odd"><td>3</td>
<td>Introduced Partial Truncated and Truncated status.
A min active (entry_id, slot_id) pair is recorded in completed log segment
metadata.</td>
</tr>
<tr class="row-even"><td>4</td>
<td>Introduced Enveloped Entry Stucture. None &amp; LZ4 compression codec introduced.</td>
</tr>
<tr class="row-odd"><td>5</td>
<td>Introduced Sequence Id.</td>
</tr>
</tbody>
</table>
<p>A general rule for log segment metadata upgrade is described as below. For example, we are upgrading
from version <em>X</em> to version <em>X+1</em>.</p>
<p>1. Upgrade the readers before upgrading writers. So the readers are able to recognize the log segments
of version <em>X+1</em>.
2. Upgrade the writers with the new binary of version <em>X+1</em> only. Keep the configuration <cite>ledgerMetadataLayoutVersion</cite>
unchanged - still in version <em>X</em>.
3. Once all the writers are running in same binary of version <em>X+1</em>. Update writers again with <cite>ledgerMetadataLayoutVersion</cite>
set to version <em>X+1</em>.</p>
<ul class="simple">
<li><em>ledgerMetadataLayoutVersion</em>: The logsegment metadata layout version. The default value is 5. Apply for <cite>writers</cite> only.</li>
<li><em>ledgerMetadataSkipMinVersionCheck</em>: The flag indicates whether DL should enforce minimum log segment metadata vesion check.
If it is true, DL will skip the checking and read the log segment metadata if it could recognize. Otherwise, it would fail
the read if the log segment's metadata version is less than the version that DL supports. By default, it is disabled.</li>
<li><em>firstLogsegmentSequenceNumber</em>: The first log segment sequence number to start with for a stream. The default value is 1.
The setting is only applied for writers, and only when upgrading metadata from version <cite>1</cite> to version <cite>2</cite>.
In this upgrade, we need to update old log segments to add ledger sequence number, once the writers start generating
new log segments with new version starting from this <cite>firstLogSegmentSequenceNumber</cite>.</li>
<li><em>maxIdSanityCheck</em>: The flag indicates whether DL should do sanity check on transaction id. If it is enabled, DL will throw
<cite>TransactionIdOutOfOrderException</cite> when it received a smaller transaction id than current maximum transaction id. By default,
it is enabled.</li>
<li><em>encodeRegionIDInVersion</em>: The flag indicates whether DL should encode region id into log segment metadata. In a global replicated
log, the log segments can be created in different regions. The region id in log segment metadata would help figuring out what
region that a log segment is created. The region id in log segment metadata would help for monitoring and troubleshooting.
By default, it is disabled.</li>
</ul>
</div>
<div class="section" id="namespace-settings">
<h3>Namespace Settings<a class="headerlink" href="#namespace-settings" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><em>federatedNamespaceEnabled</em>: The flag indicates whether DL should use federated namespace. By default, it is disabled.</li>
<li><em>federatedMaxLogsPerSubnamespace</em>: The maximum number of log stream per sub namespace in a federated namespace. By default, it is 15000</li>
<li><em>federatedCheckExistenceWhenCacheMiss</em>: The flag indicates whether to check the existence of a log stream in zookeeper or not,
if querying the local cache of the federated namespace missed.</li>
</ul>
</div>
</div>
<div class="section" id="writer-configuration-settings">
<h2>Writer Configuration Settings<a class="headerlink" href="#writer-configuration-settings" title="Permalink to this headline">¶</a></h2>
<div class="section" id="id1">
<h3>General Settings<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><em>createStreamIfNotExists</em>: The flag indicates whether to create a log stream if it doesn't exist. By default, it is true.</li>
<li><em>compressionType</em>: The compression type used when enveloping the output buffer. The available compression types are
<cite>none</cite> and <cite>lz4</cite>. By default, it is <cite>none</cite> - no compression.</li>
<li><em>failFastOnStreamNotReady</em>: The flag indicates whether to fail immediately if the stream is not ready rather than enqueueing
the request. A log stream is considered as <cite>not-ready</cite> when it is either initializing the log stream or rolling a new log
segment. If this is enabled, DL would fail the write request immediately when the stream isn't ready. Otherwise, it would
enqueue the request and wait for the stream become ready. Please consider turning it on for the use cases that could retry
writing to other log streams, which it would result in fast failure hence client could retry other streams immediately.
By default, it is disabled.</li>
<li><em>disableRollingOnLogSegmentError</em>: The flag to disable rolling log segment when encountered error. By default, it is true.</li>
</ul>
</div>
<div class="section" id="durability-settings">
<h3>Durability Settings<a class="headerlink" href="#durability-settings" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><em>isDurableWriteEnabled</em>: The flag indicates whether durable write is enabled. By default it is true.</li>
</ul>
</div>
<div class="section" id="transmit-settings">
<h3>Transmit Settings<a class="headerlink" href="#transmit-settings" title="Permalink to this headline">¶</a></h3>
<p>DL writes the log records into a transmit buffer before writing to bookkeeper. The following settings control
the frequency of transmits and commits.</p>
<ul class="simple">
<li><em>writerOutputBufferSize</em>: The output buffer size in bytes. Larger buffer size will result in higher compression ratio and
it would reduce the entries sent to bookkeeper, use the disk bandwidth more efficiently and improve throughput.
Set this setting to <cite>0</cite> will ask DL to transmit the data immediately, which it would achieve low latency.</li>
<li><em>periodicFlushFrequencyMilliSeconds</em>: The periodic flush frequency in milliseconds. If the setting is set to a positive value,
the data in transmit buffer will be flushed in every half of the provided interval. Otherwise, the periodical flush will be
disabled. For example, if this setting is set to <cite>10</cite> milliseconds, the data will be flushed (<cite>transmit</cite>) every 5 milliseconds.</li>
<li><em>enableImmediateFlush</em>: The flag to enable immediate flush a control record. It is a flag to control the period to make data
visible to the readers. If this settings is true, DL would flush a control record immediately after transmitting the user data
is completed. The default value is false.</li>
<li><em>minimumDelayBetweenImmediateFlushMilliSeconds</em>: The minimum delay between two immediate flushes, in milliseconds. This setting
only takes effects when immediate flush is enabled. It is designed to tolerant the bursty of traffic when immediate flush is enabled,
which prevents sending too many control records to the bookkeeper.</li>
</ul>
</div>
<div class="section" id="logsegment-retention-settings">
<h3>LogSegment Retention Settings<a class="headerlink" href="#logsegment-retention-settings" title="Permalink to this headline">¶</a></h3>
<p>The following settings are related to log segment retention.</p>
<ul class="simple">
<li><em>logSegmentRetentionHours</em>: The log segment retention period, in hours. In other words, how long should DL keep the log segment
once it is <cite>truncated</cite> (<cite>explicitTruncationByApp`==true) or `completed</cite> (<a href="#id2"><span class="problematic" id="id3">`</span></a>explicitTruncationByApp`==false).</li>
<li><em>explicitTruncationByApp</em>: The flag indicates that truncation is managed explicitly by the application. If this is set then time
based retention only clean the log segments which are marked as <cite>truncated</cite>. By default it is disabled.</li>
</ul>
</div>
<div class="section" id="logsegment-rolling-settings">
<h3>LogSegment Rolling Settings<a class="headerlink" href="#logsegment-rolling-settings" title="Permalink to this headline">¶</a></h3>
<p>The following settings are related to log segment rolling.</p>
<ul class="simple">
<li><em>logSegmentRollingMinutes</em>: The log segment rolling interval, in minutes. If the setting is set to a positive value, DL will roll
log segments based on time. Otherwise, it will roll log segment based on size (<cite>maxLogSegmentBytes</cite>). The default value is 2 hours.</li>
<li><em>maxLogSegmentBytes</em>: The maximum size of a log segment, in bytes. This setting only takes effects when time based rolling is disabled.
If it is enabled, DL will roll a new log segment when the current one reaches the provided threshold. The default value is 256MB.</li>
<li><em>logSegmentRollingConcurrency</em>: The concurrency of log segment rolling. If the value is positive, it means how many log segments
can be rolled at the same time. Otherwise, it is unlimited. The default value is 1.</li>
</ul>
</div>
<div class="section" id="logsegment-allocation-settings">
<h3>LogSegment Allocation Settings<a class="headerlink" href="#logsegment-allocation-settings" title="Permalink to this headline">¶</a></h3>
<p>A bookkeeper ledger is allocated when a DL stream is rolling into a new log segment. To reduce the latency penalty on log segment rolling,
a ledger allocator could be used for pre-allocating the ledgers for DL streams. This section describes the settings related to ledger
allocation.</p>
<ul class="simple">
<li><em>enableLedgerAllocatorPool</em>: The flag indicates whether to use ledger allocator pool or not. It is disabled by default. It is recommended
to enable on write proxy.</li>
<li><em>ledgerAllocatorPoolPath</em>: The path of the ledger allocator pool. The default value is &quot;.allocation_pool&quot;. The allocator pool path has to
be prefixed with <cite>&quot;.&quot;</cite>. A DL namespace is allowed to have multiple allocator pool, as they will be acted independently.</li>
<li><em>ledgerAllocatorPoolName</em>: The name of the ledger allocator pool. Default value is null. It is set by write proxy on startup.</li>
<li><em>ledgerAllocatorPoolCoreSize</em>: The number of ledger allocators in the pool. The default value is 20.</li>
</ul>
</div>
<div class="section" id="write-limit-settings">
<h3>Write Limit Settings<a class="headerlink" href="#write-limit-settings" title="Permalink to this headline">¶</a></h3>
<p>This section describes the settings related to queue-based write limiting.</p>
<ul class="simple">
<li><em>globalOutstandingWriteLimit</em>: The maximum number of outstanding writes. If this setting is set to a positive value, the global
write limiting is enabled - when the number of outstanding writes go above the threshold, the consequent requests will be rejected
with <cite>OverCapacity</cite> exceptions. Otherwise, it is disabled. The default value is 0.</li>
<li><em>perWriterOutstandingWriteLimit</em>: The maximum number of outstanding writes per writer. It is similar as <cite>globalOutstandingWriteLimit</cite>
but applied per writer instance. The default value is 0.</li>
<li><em>outstandingWriteLimitDarkmode</em>: The flag indicates whether the write limiting is running in darkmode or not. If it is running in
dark mode, the request is not rejected when it is over limit, but just record it in the stats. By default, it is in dark mode. It
is recommended to run in dark mode to understand the traffic pattern before enabling real write limiting.</li>
</ul>
</div>
<div class="section" id="lock-settings">
<h3>Lock Settings<a class="headerlink" href="#lock-settings" title="Permalink to this headline">¶</a></h3>
<p>This section describes the settings related to distributed lock used by the writers.</p>
<ul class="simple">
<li><em>lockTimeoutSeconds</em>: The lock timeout in seconds. The default value is 30. If it is 0 or negative, the caller will attempt claiming
the lock, if there is no owner, it would claim successfully, otherwise it would return immediately and throw exception to indicate
who is the current owner.</li>
</ul>
</div>
</div>
<div class="section" id="reader-configuration-settings">
<h2>Reader Configuration Settings<a class="headerlink" href="#reader-configuration-settings" title="Permalink to this headline">¶</a></h2>
<div class="section" id="id4">
<h3>General Settings<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><em>readLACLongPollTimeout</em>: The long poll timeout for reading <cite>LastAddConfirmed</cite> requests, in milliseconds.
The default value is 1 second. It is typically recommended to tune approximately with the request arrival interval. Otherwise, it would
end up becoming unnecessary short polls.</li>
</ul>
</div>
<div class="section" id="readahead-settings">
<h3>ReadAhead Settings<a class="headerlink" href="#readahead-settings" title="Permalink to this headline">¶</a></h3>
<p>This section describes the settings related to readahead in DL readers.</p>
<ul class="simple">
<li><em>enableReadAhead</em>: Flag to enable read ahead in DL readers. It is enabled by default.</li>
<li><em>readAheadMaxRecords</em>: The maximum number of records that will be cached in readahead cache by the DL readers. The default value
is 10. A higher value will improve throughput but use more memory. It should be tuned properly to avoid jvm gc if the reader cannot
keep up with the writing rate.</li>
<li><em>readAheadBatchSize</em>: The maximum number of entries that readahead worker will read in one batch. The default value is 2.
Increase the value to increase the concurrency of reading entries from bookkeeper. It is recommended to tune to a proper value for
catching up readers, not to exhaust bookkeeper's bandwidth.</li>
<li><em>readAheadWaitTimeOnEndOfStream</em>: The wait time if the reader reaches end of stream and there isn't any new inprogress log segment,
in milliseconds. The default value is 10 seconds.</li>
<li><em>readAheadNoSuchLedgerExceptionOnReadLACErrorThresholdMillis</em>: If readahead worker keeps receiving <cite>NoSuchLedgerExists</cite> exceptions
when reading <cite>LastAddConfirmed</cite> in the given period, it would stop long polling <cite>LastAddConfirmed</cite> and re-initialize the ledger handle
and retry. The threshold is in milliseconds. The default value is 10 seconds.</li>
</ul>
</div>
<div class="section" id="reader-constraint-settings">
<h3>Reader Constraint Settings<a class="headerlink" href="#reader-constraint-settings" title="Permalink to this headline">¶</a></h3>
<p>This section describes the constraint settings in DL reader.</p>
<ul class="simple">
<li><em>ignoreTruncationStatus</em>: The flag whether to ignore truncation status when reading the records. By default, it is false.
The readers will not attempt to read a log segment that is marked as <cite>Truncated</cite> if this setting is false. It can be enabled for
tooling and troubleshooting.</li>
<li><em>alertPositionOnTruncated</em>: The flag whether we should alert when reader is positioned on a truncated segment. By default, it is true.
It would alert and fail the reader if it is positioned at a <cite>Truncated</cite> log segment when the setting is true. It can be disabled for
tooling and troubleshooting.</li>
<li><em>positionGapDetectionEnabled</em>: The flag whether to enable position gap detection or not. This is a very strict constraint on reader,
to prevent readers miss reading records due to any software bugs. It is enabled by default.</li>
</ul>
</div>
<div class="section" id="idle-reader-settings">
<h3>Idle Reader Settings<a class="headerlink" href="#idle-reader-settings" title="Permalink to this headline">¶</a></h3>
<p>There is a mechanism to detect idleness of readers, to prevent reader becoming stall due to any bugs.</p>
<ul class="simple">
<li><em>readerIdleWarnThresholdMillis</em>: The warning threshold of the time that a reader becomes idle, in milliseconds. If a reader becomes
idle more than the threshold, it would dump warnings in the log. The default value is 2 minutes.</li>
<li><em>readerIdleErrorThresholdMillis</em>: The error threshold of the time that a reader becomes idle, in milliseconds. If a reader becomes
idle more than the threshold, it would throw <cite>IdleReader</cite> exceptions to notify applications. The default value is <cite>Integer.MAX_VALUE</cite>.</li>
</ul>
</div>
<div class="section" id="scan-settings">
<h3>Scan Settings<a class="headerlink" href="#scan-settings" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><em>firstNumEntriesEachPerLastRecordScan</em>: Number of entries to scan for first scan of reading last record. The default value is 2.</li>
<li><em>maxNumEntriesPerReadLastRecordScan</em>: Maximum number of entries for each scan to read last record. The default value is 16.</li>
</ul>
</div>
</div>
<div class="section" id="tracing-stats-settings">
<h2>Tracing/Stats Settings<a class="headerlink" href="#tracing-stats-settings" title="Permalink to this headline">¶</a></h2>
<p>This section describes the settings related to tracing and stats.</p>
<ul class="simple">
<li><em>traceReadAheadDeliveryLatency</em>: Flag to enable tracing read ahead delivery latency. By default it is disabled.</li>
<li><em>metadataLatencyWarnThresholdMs</em>: The warn threshold of metadata access latency, in milliseconds. If a metadata operation takes
more than the threshold, it would be logged. By default it is 1 second.</li>
<li><em>dataLatencyWarnThresholdMs</em>: The warn threshold for data access latency, in milliseconds. If a data operation takes
more than the threshold, it would be logged. By default it is 2 seconds.</li>
<li><em>traceReadAheadMetadataChanges</em>: Flag to enable tracing the major metadata changes in readahead. If it is enabled, it will log
the readahead metadata changes with precise timestamp, which is helpful for troubleshooting latency related issues. By default it
is disabled.</li>
<li><em>enableTaskExecutionStats</em>: Flag to trace long running tasks and record task execution stats in the thread pools. It is disabled
by default.</li>
<li><em>taskExecutionWarnTimeMicros</em>: The warn threshold for the task execution time, in micros. The default value is 100,000.</li>
<li><em>enablePerStreamStat</em>: Flag to enable per stream stat. By default, it is disabled.</li>
</ul>
</div>
<div class="section" id="feature-provider-settings">
<h2>Feature Provider Settings<a class="headerlink" href="#feature-provider-settings" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><em>featureProviderClass</em>: The feature provider class. The default value is <cite>DefaultFeatureProvider</cite>, which disable all the features
by default.</li>
</ul>
</div>
</div>
</div>
</div>
<div class="hidden-xs col-sm-3 col-md-3 col-md-offset-1 col-lg-3 db-sidebar">
<div class="db-toc" role="complementary">
<ul class="current">
<li class="toctree-l0 current"><a class="current reference internal" href="../index.html">DistributedLog</a></li>
</ul>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../download.html">Releases</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../download.html#rc1">0.3.51-RC1</a></li>
<li class="toctree-l2"><a class="reference internal" href="../download.html#rc0">0.3.51-RC0</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../basics/main.html">Getting Started</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../basics/introduction.html">Introduction</a></li>
<li class="toctree-l2"><a class="reference internal" href="../basics/quickstart.html">Quick Start</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../api/main.html">API</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../api/core.html">Core Library API</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/proxy.html">Write Proxy Client API</a></li>
<li class="toctree-l2"><a class="reference internal" href="../api/practice.html">Best Practices</a></li>
</ul>
</li>
<li class="toctree-l1 current"><a class="reference internal" href="main.html">Configuration</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="">Core Library Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="proxy.html">Write Proxy Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="client.html">Client Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="perlog.html">Per Stream Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../considerations/main.html">Considerations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../considerations/main.html#consistency-durability-and-ordering">Consistency, Durability and Ordering</a></li>
<li class="toctree-l2"><a class="reference internal" href="../considerations/main.html#partitioning">Partitioning</a></li>
<li class="toctree-l2"><a class="reference internal" href="../considerations/main.html#processing-semantics">Processing Semantics</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../architecture/main.html">Architecture</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../architecture/main.html#data-model">Data Model</a></li>
<li class="toctree-l2"><a class="reference internal" href="../architecture/main.html#software-stack">Software Stack</a></li>
<li class="toctree-l2"><a class="reference internal" href="../architecture/main.html#lifecyle-of-records">Lifecyle of records</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../design/main.html">Detail Design</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../design/main.html#consistency">Consistency</a></li>
<li class="toctree-l2"><a class="reference internal" href="../design/main.html#streaming-reads">Streaming Reads</a></li>
<li class="toctree-l2"><a class="reference internal" href="../design/main.html#logsegment-lifecycle">LogSegment Lifecycle</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../globalreplicatedlog/main.html">Global Replicated Log</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../globalreplicatedlog/main.html#region-aware-data-placement-policy">Region Aware Data Placement Policy</a></li>
<li class="toctree-l2"><a class="reference internal" href="../globalreplicatedlog/main.html#cross-region-speculative-reads">Cross Region Speculative Reads</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../implementation/main.html">Implementation</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../implementation/storage.html">Storage</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../operations/main.html">Deployment &amp; Administration</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../operations/deployment.html">Cluster Setup &amp; Deployment</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/operations.html">DistributedLog Operations</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/performance.html">Performance Tuning</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/hardware.html">Hardware</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/monitoring.html">Monitoring</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/zookeeper.html">ZooKeeper</a></li>
<li class="toctree-l2"><a class="reference internal" href="../operations/bookkeeper.html">BookKeeper</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../performance/main.html">Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="../references/main.html">References</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../references/configuration.html">Configuration Settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../references/metrics.html">Metrics</a></li>
<li class="toctree-l2"><a class="reference internal" href="../references/features.html">Features</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../tutorials/main.html">Tutorials</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/main.html#basic">Basic</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/main.html#messaging">Messaging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/main.html#replicated-state-machines">Replicated State Machines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tutorials/main.html#analytics">Analytics</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../developer/main.html">Developer</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../developer/release.html">Release</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../faq.html">FAQ</a></li>
</ul>
<span id="last"></span>
</div>
</div>
<!-- <div id="slidebox"> -->
<!-- <button id="slidebox_close" type="button" class="close">&times;</button> -->
<!-- <p>Rate This Page</p> -->
<!-- <div id="rateYo"></div> -->
<!-- <p>Comment</p>
<input type="text" name="comment"></input>
<button>Submit</button> -->
<!-- </div> -->
</div>
</div>
<footer class="footer">
<div class="container-fluid">
<div class="row">
<div class="col-md-10 col-md-offset-1">
<p class="pull-right">
<a href="#">Back to top</a>
<br/>
<div id="sourcelink">
<a href="git@github.com:twitter/distributedlog.git/tree/master/docs/configuration/core.rst"
rel="nofollow">Source</a>
<a href="../_sources/configuration/core.txt"
rel="nofollow">Raw</a>
<a href="../__docbird-build.log"
rel="nofollow">Build Log</a>
<a href="/report/stats/distributedlog:distributedlog"
rel="nofollow">Stats</a>
</div>
</p>
<p>
Built and hosted by <a href="/">DocBird</a>.
</p>
</div>
</div>
</div>
</footer>
<script type="text/javascript" src="../_static/js/docbird.js"></script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-30775-8']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<!-- <script type="text/javascript" src="//s/d41d8cd98f00b204e9800998ecf8427e/en_US-tbnx1s-1988229788/6163/97/1.4.3/_/download/batch/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector/com.atlassian.jira.collector.plugin.jira-issue-collector-plugin:issuecollector.js?collectorId=e62237fc"></script>
-->
<script type="text/javascript">
$(document).ready(function () {
// track user activity time (from https://github.com/jasonzissman/TimeMe.js)
TimeMe.setIdleDurationInSeconds(30);
TimeMe.setCurrentPageName("my-home-page");
TimeMe.initialize();
// record page visit event when user leaves the page
window.onbeforeunload = function (event) {
xmlhttp=new XMLHttpRequest();
xmlhttp.withCredentials = true;
xmlhttp.open("POST", "/event/distributedlog:distributedlog/visit", false);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var event_data = {
total_time_reading: TimeMe.getTimeOnCurrentPageInSeconds(),
page: window.location.href
};
//alert("send: " + $.param(event_data));
xmlhttp.send($.param(event_data));
};
// ask user for page rating after 20 seconds
// setTimeout(function(){
// alert("Rate this page!");
// }, 20000);
});
</script>
<!-- <style>
#slidebox{
width: 250px;
height: 90px;
padding: 10px;
background-color: #fff;
border: 1px solid #ccc;
position: fixed;
bottom: 3px;
right: -280px;
z-index: 1;
}
#slidebox .close{
margin-top: -5px;
opacity: 0.5;
}
#slidebox .close:hover{
opacity: 0.7;
}
</style> -->
<script type="text/javascript">
$(function() {
// $(window).scroll(function(){
// var distanceTop = $('#last').offset().top - $(window).height();
// if ($(window).scrollTop() > distanceTop)
// $('#slidebox').animate({'right':'3px'},300);
// else
// $('#slidebox').stop(true).animate({'right':'-280px'},100);
// });
// $('#slidebox .close').bind('click',function(){
// $(this).parent().remove();
// });
$("#rateYo").rateYo({
normalFill: "#A0A0A0",
halfStar: true,
rating: (Cookies.get('docbird.rating.distributedlog.distributedlog') || 0.0)
}).on("rateyo.set", function (e, data) {
var event_data = {
comment: '', // see todo note below
rating: data.rating,
page: window.location.href
};
Cookies.get('docbird.rating.distributedlog.distributedlog', data.rating)
$.post('/event/distributedlog:distributedlog/rating', event_data)
// xmlhttp=new XMLHttpRequest();
// xmlhttp.withCredentials = true;
// var event_data = {
// comment: '', // see todo note below
// rating: data.rating,
// page: window.location.href
// };
// xmlhttp.open("GET", "/event/distributedlog/rating?" + $.param(event_data), false);
// xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// // todo: implement comment form in rating slide out,
// // and instead of hooking this event, include a submit button,
// // and read the rating with rating() method
// // alert("send: " + $.param(event_data));
// xmlhttp.send();
});
});
</script>
<script src="_static/js/selection-sharer.js"></script>
<script>
$('.db-content-body').selectionSharer();
</script>
</body>
</html>