blob: 3e15805c045b513e264ebd9eaeb642e86883b502 [file] [log] [blame]
<!-- This comment will put IE 6, 7 and 8 in quirks mode -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Kudu C++ client API: kudu::client::KuduClient Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javaScript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body onload='searchBox.OnSelectItem(0);'>
<!-- Generated by Doxygen 1.6.1 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Search');
--></script>
<div class="navigation" id="top">
<div class="tabs">
<ul>
<li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
<li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
<li class="current"><a href="annotated.html"><span>Classes</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<img id="MSearchSelect" src="search/search.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</div>
</li>
</ul>
</div>
<div class="tabs">
<ul>
<li><a href="annotated.html"><span>Class&nbsp;List</span></a></li>
<li><a href="hierarchy.html"><span>Class&nbsp;Hierarchy</span></a></li>
<li><a href="functions.html"><span>Class&nbsp;Members</span></a></li>
</ul>
</div>
<div class="navpath"><b>kudu</b>::<b>client</b>::<a class="el" href="classkudu_1_1client_1_1KuduClient.html">KuduClient</a>
</div>
</div>
<div class="contents">
<h1>kudu::client::KuduClient Class Reference</h1><!-- doxytag: class="kudu::client::KuduClient" --><!-- doxytag: inherits="std::tr1::enable_shared_from_this" -->
<p>A handle for a connection to a cluster.
<a href="#_details">More...</a></p>
<p><code>#include &lt;<a class="el" href="client_8h_source.html">client.h</a>&gt;</code></p>
<p>Inherits std::tr1::enable_shared_from_this&lt; KuduClient &gt;.</p>
<p><a href="classkudu_1_1client_1_1KuduClient-members.html">List of all members.</a></p>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td colspan="2"><h2>Public Types</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">enum &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#aef70c7f3a596ecda4040f9d46514b11a">ReplicaSelection</a> { <a class="el" href="classkudu_1_1client_1_1KuduClient.html#aef70c7f3a596ecda4040f9d46514b11aafb912836db348061379d0e0a9055e239">LEADER_ONLY</a>,
<a class="el" href="classkudu_1_1client_1_1KuduClient.html#aef70c7f3a596ecda4040f9d46514b11aa801886067da41dacd0c9c2b8091f08d8">CLOSEST_REPLICA</a>,
<a class="el" href="classkudu_1_1client_1_1KuduClient.html#aef70c7f3a596ecda4040f9d46514b11aaa060fb6126a3e3fa80079f885dc7d48f">FIRST_REPLICA</a>
}</td></tr>
<tr><td colspan="2"><h2>Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classkudu_1_1client_1_1KuduTableCreator.html">KuduTableCreator</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a003f13604b4fb378f61e133a9b49d153">NewTableCreator</a> ()</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classkudu_1_1Status.html">Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a2f0323b439d8658b2ac31fde7f46de63">IsCreateTableInProgress</a> (const std::string &amp;table_name, bool *create_in_progress)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classkudu_1_1Status.html">Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a9d7cbad036bc74c71873a428abce5c1d">DeleteTable</a> (const std::string &amp;table_name)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classkudu_1_1client_1_1KuduTableAlterer.html">KuduTableAlterer</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a116bbcf13dc0991ad2a3129630075aea">NewTableAlterer</a> (const std::string &amp;table_name)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classkudu_1_1Status.html">Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a7a331e528759296089837b4611c01809">IsAlterTableInProgress</a> (const std::string &amp;table_name, bool *alter_in_progress)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classkudu_1_1Status.html">Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a2aa649e05e0cfb0e10ebce98fb4d7a65">GetTableSchema</a> (const std::string &amp;table_name, <a class="el" href="classkudu_1_1client_1_1KuduSchema.html">KuduSchema</a> *schema)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classkudu_1_1Status.html">Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#ae283a49551a081524b41f5d8e51e68d9">ListTabletServers</a> (std::vector&lt; <a class="el" href="classkudu_1_1client_1_1KuduTabletServer.html">KuduTabletServer</a> * &gt; *tablet_servers)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classkudu_1_1Status.html">Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a3ab09f69753b8c99ac7b2eeed03faa1d">ListTables</a> (std::vector&lt; std::string &gt; *tables, const std::string &amp;filter=&quot;&quot;)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classkudu_1_1Status.html">Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a96e9a6c0a16a8825c291528ac27af818">TableExists</a> (const std::string &amp;table_name, bool *exists)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classkudu_1_1Status.html">Status</a>&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#aa82a09718ffe68d3255195e736aec8d7">OpenTable</a> (const std::string &amp;table_name, sp::shared_ptr&lt; <a class="el" href="classkudu_1_1client_1_1KuduTable.html">KuduTable</a> &gt; *table)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">sp::shared_ptr&lt; <a class="el" href="classkudu_1_1client_1_1KuduSession.html">KuduSession</a> &gt;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a1f5b9bf8767b44f03f4d3220dfd5f925">NewSession</a> ()</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a6f52dff0717d6e96863aff068bfb3795">IsMultiMaster</a> () const </td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classkudu_1_1MonoDelta.html">MonoDelta</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#aacfcd61c7cc1bf7817d1aa0bb738414f">default_admin_operation_timeout</a> () const </td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classkudu_1_1MonoDelta.html">MonoDelta</a> &amp;&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a2d0e8397e979e651a23eb240513a5556">default_rpc_timeout</a> () const </td></tr>
<tr><td class="memItemLeft" align="right" valign="top">uint64_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a3a671b3540c74ef7c358bb98e95031e0">GetLatestObservedTimestamp</a> () const </td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a0809b055eda76fd68988462f2a9791dd">SetLatestObservedTimestamp</a> (uint64_t ht_timestamp)</td></tr>
<tr><td colspan="2"><h2>Static Public Attributes</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">static const uint64_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classkudu_1_1client_1_1KuduClient.html#a196f1a18c000cdca309d05161caaddaa">kNoTimestamp</a></td></tr>
<tr><td colspan="2"><h2>Friends</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ada57057f15990c8cc54770c782fa9ad4"></a><!-- doxytag: member="kudu::client::KuduClient::internal::Batcher" ref="ada57057f15990c8cc54770c782fa9ad4" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>internal::Batcher</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1d6afdd81ae5d2f0207f7224a058132c"></a><!-- doxytag: member="kudu::client::KuduClient::internal::GetTableSchemaRpc" ref="a1d6afdd81ae5d2f0207f7224a058132c" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>internal::GetTableSchemaRpc</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a78c0756675d700d01d123aea8ca18751"></a><!-- doxytag: member="kudu::client::KuduClient::internal::LookupRpc" ref="a78c0756675d700d01d123aea8ca18751" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>internal::LookupRpc</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="acb6757f44c88e6b23da105cca0299aee"></a><!-- doxytag: member="kudu::client::KuduClient::internal::MetaCache" ref="acb6757f44c88e6b23da105cca0299aee" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>internal::MetaCache</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a01410a9ff63da146890f75dcda841e99"></a><!-- doxytag: member="kudu::client::KuduClient::internal::RemoteTablet" ref="a01410a9ff63da146890f75dcda841e99" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>internal::RemoteTablet</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2cd42cd8503e7c94b878c96c42b2fd10"></a><!-- doxytag: member="kudu::client::KuduClient::internal::RemoteTabletServer" ref="a2cd42cd8503e7c94b878c96c42b2fd10" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>internal::RemoteTabletServer</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8241e8597925b7121abc27b5024c9773"></a><!-- doxytag: member="kudu::client::KuduClient::internal::WriteRpc" ref="a8241e8597925b7121abc27b5024c9773" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>internal::WriteRpc</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aba2affbf999dd265d3a7f8c30598fec7"></a><!-- doxytag: member="kudu::client::KuduClient::ClientTest" ref="aba2affbf999dd265d3a7f8c30598fec7" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>ClientTest</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad396ed74a6421797a2320caf02bec46c"></a><!-- doxytag: member="kudu::client::KuduClient::KuduClientBuilder" ref="ad396ed74a6421797a2320caf02bec46c" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>KuduClientBuilder</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a79d30f3059c783e077627a6f6d153c1b"></a><!-- doxytag: member="kudu::client::KuduClient::KuduScanner" ref="a79d30f3059c783e077627a6f6d153c1b" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>KuduScanner</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a644ef5d9d668e5772acd6dc03c4f14ee"></a><!-- doxytag: member="kudu::client::KuduClient::KuduScanTokenBuilder" ref="a644ef5d9d668e5772acd6dc03c4f14ee" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>KuduScanTokenBuilder</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ae192dc54e7e8c25675182bacad0d0b6e"></a><!-- doxytag: member="kudu::client::KuduClient::KuduSession" ref="ae192dc54e7e8c25675182bacad0d0b6e" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>KuduSession</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a770744f0111b5919212173a7efaf85cd"></a><!-- doxytag: member="kudu::client::KuduClient::KuduTable" ref="a770744f0111b5919212173a7efaf85cd" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>KuduTable</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3460d221abb050e895feac294530a58f"></a><!-- doxytag: member="kudu::client::KuduClient::KuduTableAlterer" ref="a3460d221abb050e895feac294530a58f" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>KuduTableAlterer</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af500eb2379d14e4e6603db2c69faa783"></a><!-- doxytag: member="kudu::client::KuduClient::KuduTableCreator" ref="af500eb2379d14e4e6603db2c69faa783" args="" -->
class&nbsp;</td><td class="memItemRight" valign="bottom"><b>KuduTableCreator</b></td></tr>
</table>
<hr/><a name="_details"></a><h2>Detailed Description</h2>
<p>A handle for a connection to a cluster. </p>
<p>The <a class="el" href="classkudu_1_1client_1_1KuduClient.html" title="A handle for a connection to a cluster.">KuduClient</a> class represents a connection to a cluster. From the user perspective, they should only need to create one of these in their application, likely a singleton -- but it is not a singleton in Kudu in any way. Different <a class="el" href="classkudu_1_1client_1_1KuduClient.html" title="A handle for a connection to a cluster.">KuduClient</a> objects do not interact with each other -- no connection pooling, etc. With the exception of common properties managed by free (non-member) functions in the kudu::client namespace, each <a class="el" href="classkudu_1_1client_1_1KuduClient.html" title="A handle for a connection to a cluster.">KuduClient</a> object is sandboxed with no global cross-client state.</p>
<p>In the implementation, the client holds various pieces of common infrastructure which is not table-specific: </p>
<ul>
<li>RPC messenger: reactor threads and RPC connections are pooled here </li>
<li>Authentication: the client is initialized with some credentials, and all accesses through it share those credentials. </li>
<li>Caches: caches of table schemas, tablet locations, tablet server IP addresses, etc are shared per-client.</li>
</ul>
<p>In order to actually write data to the cluster, callers must first create a <a class="el" href="classkudu_1_1client_1_1KuduSession.html" title="Representation of a Kudu client session.">KuduSession</a> object using <a class="el" href="classkudu_1_1client_1_1KuduClient.html#a1f5b9bf8767b44f03f4d3220dfd5f925">NewSession()</a>. A <a class="el" href="classkudu_1_1client_1_1KuduClient.html" title="A handle for a connection to a cluster.">KuduClient</a> may have several associated sessions.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>This class is thread-safe.</dd></dl>
<dl class="todo"><dt><b><a class="el" href="todo.html#_todo000001">Todo:</a></b></dt><dd>Cluster administration functions are likely to be in this class as well. </dd></dl>
<hr/><h2>Member Enumeration Documentation</h2>
<a class="anchor" id="aef70c7f3a596ecda4040f9d46514b11a"></a><!-- doxytag: member="kudu::client::KuduClient::ReplicaSelection" ref="aef70c7f3a596ecda4040f9d46514b11a" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="classkudu_1_1client_1_1KuduClient.html#aef70c7f3a596ecda4040f9d46514b11a">kudu::client::KuduClient::ReplicaSelection</a></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Policy with which to choose amongst multiple replicas. </p>
<dl><dt><b>Enumerator: </b></dt><dd><table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><em><a class="anchor" id="aef70c7f3a596ecda4040f9d46514b11aafb912836db348061379d0e0a9055e239"></a><!-- doxytag: member="LEADER_ONLY" ref="aef70c7f3a596ecda4040f9d46514b11aafb912836db348061379d0e0a9055e239" args="" -->LEADER_ONLY</em>&nbsp;</td><td>
<p>Select the LEADER replica. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="aef70c7f3a596ecda4040f9d46514b11aa801886067da41dacd0c9c2b8091f08d8"></a><!-- doxytag: member="CLOSEST_REPLICA" ref="aef70c7f3a596ecda4040f9d46514b11aa801886067da41dacd0c9c2b8091f08d8" args="" -->CLOSEST_REPLICA</em>&nbsp;</td><td>
<p>Select the closest replica to the client, or a random one if all replicas are equidistant. </p>
</td></tr>
<tr><td valign="top"><em><a class="anchor" id="aef70c7f3a596ecda4040f9d46514b11aaa060fb6126a3e3fa80079f885dc7d48f"></a><!-- doxytag: member="FIRST_REPLICA" ref="aef70c7f3a596ecda4040f9d46514b11aaa060fb6126a3e3fa80079f885dc7d48f" args="" -->FIRST_REPLICA</em>&nbsp;</td><td>
<p>Select the first replica in the list. </p>
</td></tr>
</table>
</dd>
</dl>
</div>
</div>
<hr/><h2>Member Function Documentation</h2>
<a class="anchor" id="aacfcd61c7cc1bf7817d1aa0bb738414f"></a><!-- doxytag: member="kudu::client::KuduClient::default_admin_operation_timeout" ref="aacfcd61c7cc1bf7817d1aa0bb738414f" args="() const " -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">const <a class="el" href="classkudu_1_1MonoDelta.html">MonoDelta</a>&amp; kudu::client::KuduClient::default_admin_operation_timeout </td>
<td>(</td>
<td class="paramname"></td>
<td>&nbsp;)&nbsp;</td>
<td> const</td>
</tr>
</table>
</div>
<div class="memdoc">
<dl class="return"><dt><b>Returns:</b></dt><dd>Default timeout for admin operations. </dd></dl>
</div>
</div>
<a class="anchor" id="a2d0e8397e979e651a23eb240513a5556"></a><!-- doxytag: member="kudu::client::KuduClient::default_rpc_timeout" ref="a2d0e8397e979e651a23eb240513a5556" args="() const " -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">const <a class="el" href="classkudu_1_1MonoDelta.html">MonoDelta</a>&amp; kudu::client::KuduClient::default_rpc_timeout </td>
<td>(</td>
<td class="paramname"></td>
<td>&nbsp;)&nbsp;</td>
<td> const</td>
</tr>
</table>
</div>
<div class="memdoc">
<dl class="return"><dt><b>Returns:</b></dt><dd>Default timeout for RPCs. </dd></dl>
</div>
</div>
<a class="anchor" id="a9d7cbad036bc74c71873a428abce5c1d"></a><!-- doxytag: member="kudu::client::KuduClient::DeleteTable" ref="a9d7cbad036bc74c71873a428abce5c1d" args="(const std::string &amp;table_name)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classkudu_1_1Status.html">Status</a> kudu::client::KuduClient::DeleteTable </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&nbsp;</td>
<td class="paramname"> <em>table_name</em></td>
<td>&nbsp;)&nbsp;</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Delete/drop a table.</p>
<dl><dt><b>Parameters:</b></dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>table_name</em>&nbsp;</td><td>Name of the table to drop. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Operation status. </dd></dl>
</div>
</div>
<a class="anchor" id="a3a671b3540c74ef7c358bb98e95031e0"></a><!-- doxytag: member="kudu::client::KuduClient::GetLatestObservedTimestamp" ref="a3a671b3540c74ef7c358bb98e95031e0" args="() const " -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint64_t kudu::client::KuduClient::GetLatestObservedTimestamp </td>
<td>(</td>
<td class="paramname"></td>
<td>&nbsp;)&nbsp;</td>
<td> const</td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Get the highest HybridTime timestamp observed by the client.</p>
<p>The latest observed timestamp can be used to start a snapshot scan on a table which is guaranteed to contain all data written or previously read by this client. See <a class="el" href="classkudu_1_1client_1_1KuduScanner.html" title="This class is a representation of a single scan.">KuduScanner</a> for more details on timestamps.</p>
<p>How to get Read-Your-Writes consistency: the code snippet below uses <a class="el" href="classkudu_1_1client_1_1KuduClient.html#a3a671b3540c74ef7c358bb98e95031e0">KuduClient::GetLatestObservedTimestamp()</a> along with <a class="el" href="classkudu_1_1client_1_1KuduScanner.html#ab13dbb301197b411dec4cd6870801bae">KuduScanner::SetSnapshotRaw()</a> to perform READ_AT_SNAPSHOT scan containing the data which has just been written. Notice extra 1 added to the timestamp passed to <a class="el" href="classkudu_1_1client_1_1KuduScanner.html#ab13dbb301197b411dec4cd6870801bae">KuduScanner::SetSnapshotRaw()</a>: </p>
<div class="fragment"><pre class="fragment"> shared_ptr&lt;KuduClient&gt; client;
... <span class="comment">// open/initialize the client</span>
shared_ptr&lt;KuduSession&gt; session(client-&gt;NewSession());
... <span class="comment">// set Kudu session properties</span>
shared_ptr&lt;KuduTable&gt; table;
... <span class="comment">// open the table</span>
unique_ptr&lt;KuduInsert&gt; insert_op(table-&gt;NewInsert());
... <span class="comment">// populate new insert operation with data</span>
RETURN_NOT_OK(session-&gt;Apply(insert_op.release()));
RETURN_NOT_OK(session-&gt;Flush());
uint64_t snapshot_timestamp = client-&gt;GetLatestObservedTimestamp() + 1;
KuduScanner scanner(table.get());
RETURN_NOT_OK(scanner.SetSnapshotRaw(snapshot_timestamp));
RETURN_NOT_OK(scanner.SetSelection(<a class="code" href="classkudu_1_1client_1_1KuduClient.html#aef70c7f3a596ecda4040f9d46514b11aafb912836db348061379d0e0a9055e239" title="Select the LEADER replica.">KuduClient::LEADER_ONLY</a>));
RETURN_NOT_OK(scanner.SetReadMode(<a class="code" href="classkudu_1_1client_1_1KuduScanner.html#a36fdb59d6488618363331269d3f58348a380798cc81589d865b7b2549e186b2e2">KuduScanner::READ_AT_SNAPSHOT</a>));
RETURN_NOT_OK(scanner.Open());
... <span class="comment">// retrieve scanned rows</span>
</pre></div><p> There are currently races in which, in rare occasions, Read-Your-Writes consistency might not hold even in this case. These are being taken care of as part of <a href="https://issues.apache.org/jira/browse/KUDU-430">KUDU-430</a></p>
<dl class="note"><dt><b>Note:</b></dt><dd>This method is experimental and will either disappear or change in a future release.</dd></dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Highest HybridTime timestamp observed by the client. </dd></dl>
</div>
</div>
<a class="anchor" id="a2aa649e05e0cfb0e10ebce98fb4d7a65"></a><!-- doxytag: member="kudu::client::KuduClient::GetTableSchema" ref="a2aa649e05e0cfb0e10ebce98fb4d7a65" args="(const std::string &amp;table_name, KuduSchema *schema)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classkudu_1_1Status.html">Status</a> kudu::client::KuduClient::GetTableSchema </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&nbsp;</td>
<td class="paramname"> <em>table_name</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="classkudu_1_1client_1_1KuduSchema.html">KuduSchema</a> *&nbsp;</td>
<td class="paramname"> <em>schema</em></td><td>&nbsp;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Get table's schema.</p>
<dl><dt><b>Parameters:</b></dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>table_name</em>&nbsp;</td><td>Name of the table. </td></tr>
<tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>schema</em>&nbsp;</td><td>Raw pointer to the schema object; caller gets ownership. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Operation status. </dd></dl>
</div>
</div>
<a class="anchor" id="a7a331e528759296089837b4611c01809"></a><!-- doxytag: member="kudu::client::KuduClient::IsAlterTableInProgress" ref="a7a331e528759296089837b4611c01809" args="(const std::string &amp;table_name, bool *alter_in_progress)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classkudu_1_1Status.html">Status</a> kudu::client::KuduClient::IsAlterTableInProgress </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&nbsp;</td>
<td class="paramname"> <em>table_name</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool *&nbsp;</td>
<td class="paramname"> <em>alter_in_progress</em></td><td>&nbsp;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Check if table alteration is in-progress.</p>
<dl><dt><b>Parameters:</b></dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>table_name</em>&nbsp;</td><td>Name of the table. </td></tr>
<tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>alter_in_progress</em>&nbsp;</td><td>The value is set only in case of success; it is <code>true</code> iff the operation is in progress. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Operation status. </dd></dl>
</div>
</div>
<a class="anchor" id="a2f0323b439d8658b2ac31fde7f46de63"></a><!-- doxytag: member="kudu::client::KuduClient::IsCreateTableInProgress" ref="a2f0323b439d8658b2ac31fde7f46de63" args="(const std::string &amp;table_name, bool *create_in_progress)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classkudu_1_1Status.html">Status</a> kudu::client::KuduClient::IsCreateTableInProgress </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&nbsp;</td>
<td class="paramname"> <em>table_name</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool *&nbsp;</td>
<td class="paramname"> <em>create_in_progress</em></td><td>&nbsp;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Check whether a create table operation is in-progress.</p>
<dl><dt><b>Parameters:</b></dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>table_name</em>&nbsp;</td><td>Name of the table. </td></tr>
<tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>create_in_progress</em>&nbsp;</td><td>The value is set only in case of success; it is <code>true</code> iff the operation is in progress. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Operation status. </dd></dl>
</div>
</div>
<a class="anchor" id="a6f52dff0717d6e96863aff068bfb3795"></a><!-- doxytag: member="kudu::client::KuduClient::IsMultiMaster" ref="a6f52dff0717d6e96863aff068bfb3795" args="() const " -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool kudu::client::KuduClient::IsMultiMaster </td>
<td>(</td>
<td class="paramname"></td>
<td>&nbsp;)&nbsp;</td>
<td> const</td>
</tr>
</table>
</div>
<div class="memdoc">
<dl class="return"><dt><b>Returns:</b></dt><dd><code>true</code> iff client is configured to talk to multiple Kudu master servers. </dd></dl>
</div>
</div>
<a class="anchor" id="a3ab09f69753b8c99ac7b2eeed03faa1d"></a><!-- doxytag: member="kudu::client::KuduClient::ListTables" ref="a3ab09f69753b8c99ac7b2eeed03faa1d" args="(std::vector&lt; std::string &gt; *tables, const std::string &amp;filter=&quot;&quot;)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classkudu_1_1Status.html">Status</a> kudu::client::KuduClient::ListTables </td>
<td>(</td>
<td class="paramtype">std::vector&lt; std::string &gt; *&nbsp;</td>
<td class="paramname"> <em>tables</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::string &amp;&nbsp;</td>
<td class="paramname"> <em>filter</em> = <code>&quot;&quot;</code></td><td>&nbsp;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>List only those tables whose names pass a substring match on <code>filter</code>.</p>
<dl><dt><b>Parameters:</b></dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>tables</em>&nbsp;</td><td>The placeholder for the result. Appended only on success. </td></tr>
<tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>filter</em>&nbsp;</td><td>Substring filter to use; empty sub-string filter matches all tables. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd><a class="el" href="classkudu_1_1Status.html" title="A representation of an operation&#39;s outcome.">Status</a> object for the operation. </dd></dl>
</div>
</div>
<a class="anchor" id="ae283a49551a081524b41f5d8e51e68d9"></a><!-- doxytag: member="kudu::client::KuduClient::ListTabletServers" ref="ae283a49551a081524b41f5d8e51e68d9" args="(std::vector&lt; KuduTabletServer * &gt; *tablet_servers)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classkudu_1_1Status.html">Status</a> kudu::client::KuduClient::ListTabletServers </td>
<td>(</td>
<td class="paramtype">std::vector&lt; <a class="el" href="classkudu_1_1client_1_1KuduTabletServer.html">KuduTabletServer</a> * &gt; *&nbsp;</td>
<td class="paramname"> <em>tablet_servers</em></td>
<td>&nbsp;)&nbsp;</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Get information on current tablet servers.</p>
<dl><dt><b>Parameters:</b></dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>tablet_servers</em>&nbsp;</td><td>The placeholder for the result. The caller takes ownership of the container's elements. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Operation status. </dd></dl>
</div>
</div>
<a class="anchor" id="a1f5b9bf8767b44f03f4d3220dfd5f925"></a><!-- doxytag: member="kudu::client::KuduClient::NewSession" ref="a1f5b9bf8767b44f03f4d3220dfd5f925" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">sp::shared_ptr&lt;<a class="el" href="classkudu_1_1client_1_1KuduSession.html">KuduSession</a>&gt; kudu::client::KuduClient::NewSession </td>
<td>(</td>
<td class="paramname"></td>
<td>&nbsp;)&nbsp;</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Create a new session for interacting with the cluster.</p>
<p>This is a fully local operation (no RPCs or blocking).</p>
<dl class="return"><dt><b>Returns:</b></dt><dd>A new session object; caller is responsible for destroying it. </dd></dl>
</div>
</div>
<a class="anchor" id="a116bbcf13dc0991ad2a3129630075aea"></a><!-- doxytag: member="kudu::client::KuduClient::NewTableAlterer" ref="a116bbcf13dc0991ad2a3129630075aea" args="(const std::string &amp;table_name)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classkudu_1_1client_1_1KuduTableAlterer.html">KuduTableAlterer</a>* kudu::client::KuduClient::NewTableAlterer </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&nbsp;</td>
<td class="paramname"> <em>table_name</em></td>
<td>&nbsp;)&nbsp;</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Create a <a class="el" href="classkudu_1_1client_1_1KuduTableAlterer.html" title="Alters an existing table based on the provided steps.">KuduTableAlterer</a> object.</p>
<dl><dt><b>Parameters:</b></dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>table_name</em>&nbsp;</td><td>Name of the table to alter. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Pointer to newly created object: it is the caller's responsibility to free it. </dd></dl>
</div>
</div>
<a class="anchor" id="a003f13604b4fb378f61e133a9b49d153"></a><!-- doxytag: member="kudu::client::KuduClient::NewTableCreator" ref="a003f13604b4fb378f61e133a9b49d153" args="()" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classkudu_1_1client_1_1KuduTableCreator.html">KuduTableCreator</a>* kudu::client::KuduClient::NewTableCreator </td>
<td>(</td>
<td class="paramname"></td>
<td>&nbsp;)&nbsp;</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Create a <a class="el" href="classkudu_1_1client_1_1KuduTableCreator.html" title="A helper class to create a new table with the desired options.">KuduTableCreator</a> object.</p>
<dl class="return"><dt><b>Returns:</b></dt><dd>Pointer to newly created object; it is the caller's responsibility to free it. </dd></dl>
</div>
</div>
<a class="anchor" id="aa82a09718ffe68d3255195e736aec8d7"></a><!-- doxytag: member="kudu::client::KuduClient::OpenTable" ref="aa82a09718ffe68d3255195e736aec8d7" args="(const std::string &amp;table_name, sp::shared_ptr&lt; KuduTable &gt; *table)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classkudu_1_1Status.html">Status</a> kudu::client::KuduClient::OpenTable </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&nbsp;</td>
<td class="paramname"> <em>table_name</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">sp::shared_ptr&lt; <a class="el" href="classkudu_1_1client_1_1KuduTable.html">KuduTable</a> &gt; *&nbsp;</td>
<td class="paramname"> <em>table</em></td><td>&nbsp;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Open table with the given name.</p>
<p>This method does an RPC to ensure that the table exists and looks up its schema.</p>
<dl><dt><b>Parameters:</b></dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>table_name</em>&nbsp;</td><td>Name of the table. </td></tr>
<tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>table</em>&nbsp;</td><td>The result table. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd>Operation status.</dd></dl>
<dl class="todo"><dt><b><a class="el" href="todo.html#_todo000002">Todo:</a></b></dt><dd><p class="startdd">Should we offer an async version of this as well? </p>
<p class="enddd">Probably should have a configurable timeout in <a class="el" href="classkudu_1_1client_1_1KuduClientBuilder.html" title="A &quot;factory&quot; for KuduClient objects.">KuduClientBuilder</a>? </p>
</dd></dl>
</div>
</div>
<a class="anchor" id="a0809b055eda76fd68988462f2a9791dd"></a><!-- doxytag: member="kudu::client::KuduClient::SetLatestObservedTimestamp" ref="a0809b055eda76fd68988462f2a9791dd" args="(uint64_t ht_timestamp)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void kudu::client::KuduClient::SetLatestObservedTimestamp </td>
<td>(</td>
<td class="paramtype">uint64_t&nbsp;</td>
<td class="paramname"> <em>ht_timestamp</em></td>
<td>&nbsp;)&nbsp;</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Sets the latest observed HybridTime timestamp.</p>
<p>This is only useful when forwarding timestamps between clients to enforce external consistency when using <a class="el" href="classkudu_1_1client_1_1KuduSession.html#aabd55109ba3b086bbe33b277cdd40d22ae978fab7451faebf4399830b603c855c">KuduSession::CLIENT_PROPAGATED</a> external consistency mode.</p>
<p>The HybridTime encoded timestamp should be obtained from another client's <a class="el" href="classkudu_1_1client_1_1KuduClient.html#a3a671b3540c74ef7c358bb98e95031e0">KuduClient::GetLatestObservedTimestamp()</a> method.</p>
<dl class="note"><dt><b>Note:</b></dt><dd>This method is experimental and will either disappear or change in a future release.</dd></dl>
<dl><dt><b>Parameters:</b></dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>ht_timestamp</em>&nbsp;</td><td>Timestamp encoded in HybridTime format. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="a96e9a6c0a16a8825c291528ac27af818"></a><!-- doxytag: member="kudu::client::KuduClient::TableExists" ref="a96e9a6c0a16a8825c291528ac27af818" args="(const std::string &amp;table_name, bool *exists)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classkudu_1_1Status.html">Status</a> kudu::client::KuduClient::TableExists </td>
<td>(</td>
<td class="paramtype">const std::string &amp;&nbsp;</td>
<td class="paramname"> <em>table_name</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool *&nbsp;</td>
<td class="paramname"> <em>exists</em></td><td>&nbsp;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Check if the table given by 'table_name' exists.</p>
<dl><dt><b>Parameters:</b></dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"><tt>[in]</tt>&nbsp;</td><td valign="top"><em>table_name</em>&nbsp;</td><td>Name of the table. </td></tr>
<tr><td valign="top"><tt>[out]</tt>&nbsp;</td><td valign="top"><em>exists</em>&nbsp;</td><td>Set only on success; set to <code>true</code> iff table exists. </td></tr>
</table>
</dd>
</dl>
<dl class="return"><dt><b>Returns:</b></dt><dd><a class="el" href="classkudu_1_1Status.html" title="A representation of an operation&#39;s outcome.">Status</a> object for the operation. </dd></dl>
</div>
</div>
<hr/><h2>Member Data Documentation</h2>
<a class="anchor" id="a196f1a18c000cdca309d05161caaddaa"></a><!-- doxytag: member="kudu::client::KuduClient::kNoTimestamp" ref="a196f1a18c000cdca309d05161caaddaa" args="" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">const uint64_t <a class="el" href="classkudu_1_1client_1_1KuduClient.html#a196f1a18c000cdca309d05161caaddaa">kudu::client::KuduClient::kNoTimestamp</a><code> [static]</code></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Value for the latest observed timestamp when none has been observed or set. </p>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>include/kudu/client/<a class="el" href="client_8h_source.html">client.h</a></li>
</ul>
</div>
<!--- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&nbsp;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&nbsp;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&nbsp;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&nbsp;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&nbsp;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&nbsp;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&nbsp;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&nbsp;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&nbsp;</span>Defines</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<!-- start footer part -->
<hr class="footer"/>
<address class="footer">
<small>Generated for Kudu version 1.0.1 on Tue Oct 11 08:52:01 2016 by Doxygen 1.6.1</small>
<br>
<small>Copyright © 2016 The Apache Software Foundation.</small>
</address>
</body>
</html>