<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mariano Guerra's Log (Posts about erlang)</title><link>http://marianoguerra.org/</link><description></description><atom:link href="http://marianoguerra.org/categories/erlang.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Mon, 18 Nov 2024 17:56:35 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Riak Core Tutorial Part 8: HTTP API</title><link>http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;pre class="literal-block"&gt;The content of this chapter is in the 06-http-api branch.

https://gitlab.com/marianoguerra/tanodb/tree/06-http-api&lt;/pre&gt;
&lt;section id="how-it-works"&gt;
&lt;h2&gt;How it Works&lt;/h2&gt;
&lt;p&gt;We are adding a simple HTTP API to our system, it will run on all nodes and
allow us to interact with it from the outside.&lt;/p&gt;
&lt;p&gt;We will use the Cowboy 2.0 HTTP Server.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="implementing-it"&gt;
&lt;h2&gt;Implementing it&lt;/h2&gt;
&lt;p&gt;We need to add cowboy as a dependency on rebar.config and tanodb.app.src.&lt;/p&gt;
&lt;p&gt;Then in tanodb_app.erl we need to start the HTTP API:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-1" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;setup_http_api&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-2" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;Dispatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;cowboy_router&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;([{&lt;/span&gt;&lt;span class="n"&gt;'_'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s"&gt;"/kv/:bucket/:key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tanodb_h_kv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]}]}]),&lt;/span&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-3" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-4" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;HttpPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;http_port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-5" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;HttpAcceptors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;http_acceptors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-6" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;HttpMaxConnections&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;http_max_connections&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;infinity&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-7" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-8" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Starting HTTP API at port &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;HttpPort&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-9" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-9"&gt;&lt;/a&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-10" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;cowboy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;start_clear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb_http_listener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-11" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;HttpPort&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-12" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;num_acceptors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;HttpAcceptors&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-13" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;max_connections&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;HttpMaxConnections&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-14" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;dispatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Dispatch&lt;/span&gt;&lt;span class="p"&gt;}}),&lt;/span&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-15" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-15"&gt;&lt;/a&gt;
&lt;a id="rest_code_6d79d180b30d47c08c5274d025fd4c93-16" name="rest_code_6d79d180b30d47c08c5274d025fd4c93-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_6d79d180b30d47c08c5274d025fd4c93-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We get the configuration from the environment, which is set by cuttlefish.&lt;/p&gt;
&lt;p&gt;The API handler module tanodb_h_kv's main code:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_c6adfdf232d64613b048b6806ce90416-1" name="rest_code_c6adfdf232d64613b048b6806ce90416-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c6adfdf232d64613b048b6806ce90416-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqIn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"GET"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_c6adfdf232d64613b048b6806ce90416-2" name="rest_code_c6adfdf232d64613b048b6806ce90416-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c6adfdf232d64613b048b6806ce90416-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bindings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqIn&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_c6adfdf232d64613b048b6806ce90416-3" name="rest_code_c6adfdf232d64613b048b6806ce90416-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c6adfdf232d64613b048b6806ce90416-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqIn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;a id="rest_code_c6adfdf232d64613b048b6806ce90416-4" name="rest_code_c6adfdf232d64613b048b6806ce90416-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c6adfdf232d64613b048b6806ce90416-4"&gt;&lt;/a&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqIn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_c6adfdf232d64613b048b6806ce90416-5" name="rest_code_c6adfdf232d64613b048b6806ce90416-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c6adfdf232d64613b048b6806ce90416-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bindings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqIn&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_c6adfdf232d64613b048b6806ce90416-6" name="rest_code_c6adfdf232d64613b048b6806ce90416-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c6adfdf232d64613b048b6806ce90416-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Req1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;read_all_body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqIn&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_c6adfdf232d64613b048b6806ce90416-7" name="rest_code_c6adfdf232d64613b048b6806ce90416-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c6adfdf232d64613b048b6806ce90416-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Req1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;a id="rest_code_c6adfdf232d64613b048b6806ce90416-8" name="rest_code_c6adfdf232d64613b048b6806ce90416-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c6adfdf232d64613b048b6806ce90416-8"&gt;&lt;/a&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqIn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"DELETE"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_c6adfdf232d64613b048b6806ce90416-9" name="rest_code_c6adfdf232d64613b048b6806ce90416-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c6adfdf232d64613b048b6806ce90416-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bindings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqIn&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_c6adfdf232d64613b048b6806ce90416-10" name="rest_code_c6adfdf232d64613b048b6806ce90416-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c6adfdf232d64613b048b6806ce90416-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqIn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="trying-it"&gt;
&lt;h2&gt;Trying it&lt;/h2&gt;
&lt;section id="single-node"&gt;
&lt;h3&gt;Single Node&lt;/h3&gt;
&lt;p&gt;We are going to first test it on a single node.&lt;/p&gt;
&lt;p&gt;Get key &lt;cite&gt;k1&lt;/cite&gt; in bucket &lt;cite&gt;b1&lt;/cite&gt;, which doesn't exist yet:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_262e81034b2d4df082a082af0fe7ae6b-1" name="rest_code_262e81034b2d4df082a082af0fe7ae6b-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_262e81034b2d4df082a082af0fe7ae6b-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="w"&gt;  &lt;/span&gt;http://localhost:8098/kv/b1/k1
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-1" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-2" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"replies"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-3" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-4" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-5" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-6" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-7" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-8" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-9" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1301649895747835411525156804137939564381064921088"&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-10" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-11" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-12" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-13" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-14" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-15" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-16" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-17" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1278813932664540053428224228626747642198940975104"&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-18" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-19" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-20" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-20" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-20"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-21" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-21" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-22" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-22" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-23" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-23" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-24" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-24" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-25" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-25" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1255977969581244695331291653115555720016817029120"&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-26" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-26" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-27" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-27" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-27"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_2a3ef5e83039402f90132cb3fae31b78-28" name="rest_code_2a3ef5e83039402f90132cb3fae31b78-28" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2a3ef5e83039402f90132cb3fae31b78-28"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Put key &lt;cite&gt;k1&lt;/cite&gt; in bucket &lt;cite&gt;b1&lt;/cite&gt; with content &lt;cite&gt;hi there&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_becddf6346644e2fab9dc568467d1137-1" name="rest_code_becddf6346644e2fab9dc568467d1137-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_becddf6346644e2fab9dc568467d1137-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;POST&lt;span class="w"&gt;  &lt;/span&gt;http://localhost:8098/kv/b1/k1&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'hi there'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-1" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-2" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"replies"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-3" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-4" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-5" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-6" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1301649895747835411525156804137939564381064921088"&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-7" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-8" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-9" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-10" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-11" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1278813932664540053428224228626747642198940975104"&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-12" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-13" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-14" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-15" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-16" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1255977969581244695331291653115555720016817029120"&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-17" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-18" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-19" name="rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_eb3bbd6dd2354c8c9e33743659f9acc1-19"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Get key &lt;cite&gt;k1&lt;/cite&gt; in bucket &lt;cite&gt;b1&lt;/cite&gt;, which now exists:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_609d1a637e454dc0869efc5182339818-1" name="rest_code_609d1a637e454dc0869efc5182339818-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_609d1a637e454dc0869efc5182339818-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="w"&gt;  &lt;/span&gt;http://localhost:8098/kv/b1/k1
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-1" name="rest_code_b9400b7dca7646768dd977776ef8496f-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-2" name="rest_code_b9400b7dca7646768dd977776ef8496f-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"replies"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-3" name="rest_code_b9400b7dca7646768dd977776ef8496f-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-4" name="rest_code_b9400b7dca7646768dd977776ef8496f-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-5" name="rest_code_b9400b7dca7646768dd977776ef8496f-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-6" name="rest_code_b9400b7dca7646768dd977776ef8496f-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-7" name="rest_code_b9400b7dca7646768dd977776ef8496f-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-8" name="rest_code_b9400b7dca7646768dd977776ef8496f-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1301649895747835411525156804137939564381064921088"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-9" name="rest_code_b9400b7dca7646768dd977776ef8496f-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hi there"&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-10" name="rest_code_b9400b7dca7646768dd977776ef8496f-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-11" name="rest_code_b9400b7dca7646768dd977776ef8496f-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-12" name="rest_code_b9400b7dca7646768dd977776ef8496f-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-13" name="rest_code_b9400b7dca7646768dd977776ef8496f-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-14" name="rest_code_b9400b7dca7646768dd977776ef8496f-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-15" name="rest_code_b9400b7dca7646768dd977776ef8496f-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-16" name="rest_code_b9400b7dca7646768dd977776ef8496f-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1278813932664540053428224228626747642198940975104"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-17" name="rest_code_b9400b7dca7646768dd977776ef8496f-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hi there"&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-18" name="rest_code_b9400b7dca7646768dd977776ef8496f-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-19" name="rest_code_b9400b7dca7646768dd977776ef8496f-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-20" name="rest_code_b9400b7dca7646768dd977776ef8496f-20" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-20"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-21" name="rest_code_b9400b7dca7646768dd977776ef8496f-21" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-22" name="rest_code_b9400b7dca7646768dd977776ef8496f-22" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-23" name="rest_code_b9400b7dca7646768dd977776ef8496f-23" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-24" name="rest_code_b9400b7dca7646768dd977776ef8496f-24" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1255977969581244695331291653115555720016817029120"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-25" name="rest_code_b9400b7dca7646768dd977776ef8496f-25" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hi there"&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-26" name="rest_code_b9400b7dca7646768dd977776ef8496f-26" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-27" name="rest_code_b9400b7dca7646768dd977776ef8496f-27" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-27"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_b9400b7dca7646768dd977776ef8496f-28" name="rest_code_b9400b7dca7646768dd977776ef8496f-28" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b9400b7dca7646768dd977776ef8496f-28"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Delete key &lt;cite&gt;k1&lt;/cite&gt; in bucket &lt;cite&gt;b1&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_8c6764487b8c400789be6c71c18d75c3-1" name="rest_code_8c6764487b8c400789be6c71c18d75c3-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_8c6764487b8c400789be6c71c18d75c3-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;DELETE&lt;span class="w"&gt;  &lt;/span&gt;http://localhost:8098/kv/b1/k1
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-1" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-2" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"replies"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-3" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-4" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-5" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-6" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1301649895747835411525156804137939564381064921088"&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-7" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-8" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-9" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-10" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-11" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1278813932664540053428224228626747642198940975104"&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-12" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-13" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-14" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-15" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-16" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1255977969581244695331291653115555720016817029120"&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-17" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-18" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-19" name="rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_b5afad8f62c34ea9a0d88af09cedfd9b-19"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Get key &lt;cite&gt;k1&lt;/cite&gt; in bucket &lt;cite&gt;b1&lt;/cite&gt;, which shouldn't exist anymore:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_2c02b61a85984986a5fc08d62a6e05fb-1" name="rest_code_2c02b61a85984986a5fc08d62a6e05fb-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_2c02b61a85984986a5fc08d62a6e05fb-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="w"&gt;  &lt;/span&gt;http://localhost:8098/kv/b1/k1
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-1" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-2" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"replies"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-3" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-4" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-5" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-6" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-7" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-8" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-9" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1301649895747835411525156804137939564381064921088"&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-10" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-11" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-12" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-13" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-14" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-15" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-16" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-17" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1278813932664540053428224228626747642198940975104"&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-18" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-19" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-20" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-20" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-20"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-21" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-21" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-22" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-22" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-23" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-23" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-24" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-24" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-25" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-25" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1255977969581244695331291653115555720016817029120"&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-26" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-26" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-27" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-27" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-27"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_97cb0ee33a734097b5ad80eb16516d01-28" name="rest_code_97cb0ee33a734097b5ad80eb16516d01-28" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_97cb0ee33a734097b5ad80eb16516d01-28"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="cluster"&gt;
&lt;h3&gt;Cluster&lt;/h3&gt;
&lt;p&gt;We are going to test it on a cluster now, notice that the port changes, we
are sending each request to a different node.&lt;/p&gt;
&lt;p&gt;You can see each node's port on the logs at startup:&lt;/p&gt;
&lt;pre class="literal-block"&gt;[info] Starting HTTP API at port 8198&lt;/pre&gt;
&lt;p&gt;Get key &lt;cite&gt;k1&lt;/cite&gt; in bucket &lt;cite&gt;b1&lt;/cite&gt;, which doesn't exist yet:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_99b57d6024d04ea1ad1b1e70b3141671-1" name="rest_code_99b57d6024d04ea1ad1b1e70b3141671-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_99b57d6024d04ea1ad1b1e70b3141671-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="w"&gt;  &lt;/span&gt;http://localhost:8198/kv/b1/k1
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notice the node name on the partition field, it may change for you depending
on the state of handoff or how vnodes were distributed.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-1" name="rest_code_c09e42d0f58142feb26302899b319f40-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-2" name="rest_code_c09e42d0f58142feb26302899b319f40-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"replies"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-3" name="rest_code_c09e42d0f58142feb26302899b319f40-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-4" name="rest_code_c09e42d0f58142feb26302899b319f40-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-5" name="rest_code_c09e42d0f58142feb26302899b319f40-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-6" name="rest_code_c09e42d0f58142feb26302899b319f40-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-7" name="rest_code_c09e42d0f58142feb26302899b319f40-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb2@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-8" name="rest_code_c09e42d0f58142feb26302899b319f40-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-9" name="rest_code_c09e42d0f58142feb26302899b319f40-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1301649895747835411525156804137939564381064921088"&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-10" name="rest_code_c09e42d0f58142feb26302899b319f40-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-11" name="rest_code_c09e42d0f58142feb26302899b319f40-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-12" name="rest_code_c09e42d0f58142feb26302899b319f40-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-13" name="rest_code_c09e42d0f58142feb26302899b319f40-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-14" name="rest_code_c09e42d0f58142feb26302899b319f40-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-15" name="rest_code_c09e42d0f58142feb26302899b319f40-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb1@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-16" name="rest_code_c09e42d0f58142feb26302899b319f40-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-17" name="rest_code_c09e42d0f58142feb26302899b319f40-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1278813932664540053428224228626747642198940975104"&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-18" name="rest_code_c09e42d0f58142feb26302899b319f40-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-19" name="rest_code_c09e42d0f58142feb26302899b319f40-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-20" name="rest_code_c09e42d0f58142feb26302899b319f40-20" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-20"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-21" name="rest_code_c09e42d0f58142feb26302899b319f40-21" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-22" name="rest_code_c09e42d0f58142feb26302899b319f40-22" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-23" name="rest_code_c09e42d0f58142feb26302899b319f40-23" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb1@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-24" name="rest_code_c09e42d0f58142feb26302899b319f40-24" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-25" name="rest_code_c09e42d0f58142feb26302899b319f40-25" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1255977969581244695331291653115555720016817029120"&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-26" name="rest_code_c09e42d0f58142feb26302899b319f40-26" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-27" name="rest_code_c09e42d0f58142feb26302899b319f40-27" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-27"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_c09e42d0f58142feb26302899b319f40-28" name="rest_code_c09e42d0f58142feb26302899b319f40-28" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_c09e42d0f58142feb26302899b319f40-28"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Put key &lt;cite&gt;k1&lt;/cite&gt; in bucket &lt;cite&gt;b1&lt;/cite&gt; with content &lt;cite&gt;hi there&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_bdae0d03443a46929f27fc87fb0169e1-1" name="rest_code_bdae0d03443a46929f27fc87fb0169e1-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_bdae0d03443a46929f27fc87fb0169e1-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;POST&lt;span class="w"&gt;  &lt;/span&gt;http://localhost:8298/kv/b1/k1&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'hi there'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-1" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-2" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"replies"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-3" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-4" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb1@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-5" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-6" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1255977969581244695331291653115555720016817029120"&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-7" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-8" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-9" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb1@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-10" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-11" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1278813932664540053428224228626747642198940975104"&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-12" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-13" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-14" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb2@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-15" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-16" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1301649895747835411525156804137939564381064921088"&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-17" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-18" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_61f9d0886a394bfba82e726a2ac9f911-19" name="rest_code_61f9d0886a394bfba82e726a2ac9f911-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_61f9d0886a394bfba82e726a2ac9f911-19"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Get key &lt;cite&gt;k1&lt;/cite&gt; in bucket &lt;cite&gt;b1&lt;/cite&gt;, which now exists:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_d5cb81678f174439a538b03a1b38cdba-1" name="rest_code_d5cb81678f174439a538b03a1b38cdba-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_d5cb81678f174439a538b03a1b38cdba-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="w"&gt;  &lt;/span&gt;http://localhost:8398/kv/b1/k1
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-1" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-2" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"replies"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-3" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-4" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-5" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-6" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb1@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-7" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-8" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1278813932664540053428224228626747642198940975104"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-9" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hi there"&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-10" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-11" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-12" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-13" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-14" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb1@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-15" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-16" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1255977969581244695331291653115555720016817029120"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-17" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hi there"&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-18" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-19" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-20" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-20" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-20"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-21" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-21" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-22" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-22" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb2@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-23" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-23" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-24" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-24" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1301649895747835411525156804137939564381064921088"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-25" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-25" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hi there"&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-26" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-26" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-27" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-27" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-27"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_e5c2f6850d884727bbcdb1a56abf8639-28" name="rest_code_e5c2f6850d884727bbcdb1a56abf8639-28" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_e5c2f6850d884727bbcdb1a56abf8639-28"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Delete key &lt;cite&gt;k1&lt;/cite&gt; in bucket &lt;cite&gt;b1&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_647562aa2f224803a422e29848d0cde4-1" name="rest_code_647562aa2f224803a422e29848d0cde4-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_647562aa2f224803a422e29848d0cde4-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;DELETE&lt;span class="w"&gt;  &lt;/span&gt;http://localhost:8198/kv/b1/k1
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-1" name="rest_code_14da0f77a29b48848d7bae616cced1db-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-2" name="rest_code_14da0f77a29b48848d7bae616cced1db-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"replies"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-3" name="rest_code_14da0f77a29b48848d7bae616cced1db-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-4" name="rest_code_14da0f77a29b48848d7bae616cced1db-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb2@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-5" name="rest_code_14da0f77a29b48848d7bae616cced1db-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-6" name="rest_code_14da0f77a29b48848d7bae616cced1db-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1301649895747835411525156804137939564381064921088"&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-7" name="rest_code_14da0f77a29b48848d7bae616cced1db-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-8" name="rest_code_14da0f77a29b48848d7bae616cced1db-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-9" name="rest_code_14da0f77a29b48848d7bae616cced1db-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb1@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-10" name="rest_code_14da0f77a29b48848d7bae616cced1db-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-11" name="rest_code_14da0f77a29b48848d7bae616cced1db-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1278813932664540053428224228626747642198940975104"&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-12" name="rest_code_14da0f77a29b48848d7bae616cced1db-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-13" name="rest_code_14da0f77a29b48848d7bae616cced1db-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-14" name="rest_code_14da0f77a29b48848d7bae616cced1db-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb1@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-15" name="rest_code_14da0f77a29b48848d7bae616cced1db-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-16" name="rest_code_14da0f77a29b48848d7bae616cced1db-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1255977969581244695331291653115555720016817029120"&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-17" name="rest_code_14da0f77a29b48848d7bae616cced1db-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-18" name="rest_code_14da0f77a29b48848d7bae616cced1db-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_14da0f77a29b48848d7bae616cced1db-19" name="rest_code_14da0f77a29b48848d7bae616cced1db-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_14da0f77a29b48848d7bae616cced1db-19"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Get key &lt;cite&gt;k1&lt;/cite&gt; in bucket &lt;cite&gt;b1&lt;/cite&gt;, which shouldn't exist anymore:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_86b05c0220024ffd825a4e65f1797fd1-1" name="rest_code_86b05c0220024ffd825a4e65f1797fd1-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_86b05c0220024ffd825a4e65f1797fd1-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="w"&gt;  &lt;/span&gt;http://localhost:8298/kv/b1/k1
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-1" name="rest_code_89da1411be34413892ee0778b36614e9-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-2" name="rest_code_89da1411be34413892ee0778b36614e9-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"replies"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-3" name="rest_code_89da1411be34413892ee0778b36614e9-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-4" name="rest_code_89da1411be34413892ee0778b36614e9-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-5" name="rest_code_89da1411be34413892ee0778b36614e9-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-6" name="rest_code_89da1411be34413892ee0778b36614e9-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-7" name="rest_code_89da1411be34413892ee0778b36614e9-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb1@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-8" name="rest_code_89da1411be34413892ee0778b36614e9-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-9" name="rest_code_89da1411be34413892ee0778b36614e9-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1278813932664540053428224228626747642198940975104"&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-10" name="rest_code_89da1411be34413892ee0778b36614e9-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-11" name="rest_code_89da1411be34413892ee0778b36614e9-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-12" name="rest_code_89da1411be34413892ee0778b36614e9-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-13" name="rest_code_89da1411be34413892ee0778b36614e9-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-14" name="rest_code_89da1411be34413892ee0778b36614e9-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-15" name="rest_code_89da1411be34413892ee0778b36614e9-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb1@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-16" name="rest_code_89da1411be34413892ee0778b36614e9-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-17" name="rest_code_89da1411be34413892ee0778b36614e9-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1255977969581244695331291653115555720016817029120"&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-18" name="rest_code_89da1411be34413892ee0778b36614e9-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-19" name="rest_code_89da1411be34413892ee0778b36614e9-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-20" name="rest_code_89da1411be34413892ee0778b36614e9-20" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-20"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"bucket"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-21" name="rest_code_89da1411be34413892ee0778b36614e9-21" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-22" name="rest_code_89da1411be34413892ee0778b36614e9-22" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"key"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-23" name="rest_code_89da1411be34413892ee0778b36614e9-23" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tanodb2@127.0.0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-24" name="rest_code_89da1411be34413892ee0778b36614e9-24" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-25" name="rest_code_89da1411be34413892ee0778b36614e9-25" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"partition"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1301649895747835411525156804137939564381064921088"&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-26" name="rest_code_89da1411be34413892ee0778b36614e9-26" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-27" name="rest_code_89da1411be34413892ee0778b36614e9-27" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-27"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_89da1411be34413892ee0778b36614e9-28" name="rest_code_89da1411be34413892ee0778b36614e9-28" href="http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/#rest_code_89da1411be34413892ee0778b36614e9-28"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;</description><category>distsys</category><category>erlang</category><category>riak_core</category><category>tutorial</category><guid>http://marianoguerra.org/posts/riak-core-tutorial-part-8-http-api/</guid><pubDate>Wed, 05 Sep 2018 19:18:14 GMT</pubDate></item><item><title>Riak Core Tutorial Part 7: Coverage Calls</title><link>http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;pre class="literal-block"&gt;The content of this chapter is in the `05-coverage` branch.

https://gitlab.com/marianoguerra/tanodb/tree/05-coverage&lt;/pre&gt;
&lt;section id="how-it-works"&gt;
&lt;h2&gt;How it Works&lt;/h2&gt;
&lt;p&gt;Since bucket and key are hashed together to decide to which vnode a request
will go it means that the keys for a given bucket may be distributed in
multiple vnodes, and in case you are running in a cluster this means your keys
are distributed in multiple physical nodes.&lt;/p&gt;
&lt;p&gt;This means that to list all the keys from a bucket we have to ask all the
vnodes for the keys on a given bucket and then put the responses together and
return the set of all responses.&lt;/p&gt;
&lt;p&gt;For this Riak Core provides something called coverage calls, which are a way to
handle this process of running a command on all vnodes and gathering the
responses.&lt;/p&gt;
&lt;p&gt;In this chapter we are going to implement the &lt;cite&gt;tanodb:keys(Bucket)&lt;/cite&gt; function
using coverage calls.&lt;/p&gt;
&lt;p&gt;In this case we call &lt;cite&gt;tanodb_coverage_fsm:start({keys, Bucket}, Timeout)&lt;/cite&gt;, which
is a new module, it implements a behavior called &lt;cite&gt;riak_core_coverage_fsm&lt;/cite&gt;, short
for riak_core_coverage &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Finite-state_machine"&gt;finite state machine&lt;/a&gt;,
it implements some predefined callbacks that are called on different states of
a finite state machine.&lt;/p&gt;
&lt;p&gt;The start function calls &lt;cite&gt;tanodb_coverage_fsm_sup:start_fsm([ReqId, self(), Request, Timeout])&lt;/cite&gt;
which starts a supervisor for this new process.&lt;/p&gt;
&lt;p&gt;When we start the fsm with a command &lt;cite&gt;{keys, Bucket}&lt;/cite&gt; and a timeout in
milliseconds, it starts a supervisor that starts the finite state machine
process, it first calls the init function which initializes the state of the
process and returns some information to riak_core so it knows what kind of
coverage call we want to do, then riak_core calls the handle_coverage function
on each vnode and with each response it calls &lt;cite&gt;process_result&lt;/cite&gt; in our process.&lt;/p&gt;
&lt;p&gt;When all the results are received or if an error happens (such as a timeout) it
will call the finish callback there we send the results to the calling process
which is waiting for it.&lt;/p&gt;
&lt;p&gt;The handle_coverage implementation is really simple, it uses the
&lt;a class="reference external" href="http://www.erlang.org/doc/man/ets.html#match-2"&gt;ets:match/2 function&lt;/a&gt; to
match against all the entries with the given bucket and returns the key from
the matched results.&lt;/p&gt;
&lt;p&gt;You can read more about ets match specs in the
&lt;a class="reference external" href="http://www.erlang.org/doc/apps/erts/match_spec.html"&gt;match spec chapter on the Erlang documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="implementing-it"&gt;
&lt;h2&gt;Implementing it&lt;/h2&gt;
&lt;p&gt;Code in tanodb.erl is really simple:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_a44a159189a54a82939fde627b23145c-1" name="rest_code_a44a159189a54a82939fde627b23145c-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_a44a159189a54a82939fde627b23145c-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_a44a159189a54a82939fde627b23145c-2" name="rest_code_a44a159189a54a82939fde627b23145c-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_a44a159189a54a82939fde627b23145c-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;Timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;maps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="nv"&gt;TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_a44a159189a54a82939fde627b23145c-3" name="rest_code_a44a159189a54a82939fde627b23145c-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_a44a159189a54a82939fde627b23145c-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;tanodb_coverage_fsm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Timeout&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In tanodb_vnode.erl we need to implement the handle_coverage callback:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_d0fec6c5e8a640d69cb6f15186512860-1" name="rest_code_d0fec6c5e8a640d69cb6f15186512860-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d0fec6c5e8a640d69cb6f15186512860-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_coverage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;KeySpaces&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{_,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;RefId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_},&lt;/span&gt;
&lt;a id="rest_code_d0fec6c5e8a640d69cb6f15186512860-2" name="rest_code_d0fec6c5e8a640d69cb6f15186512860-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d0fec6c5e8a640d69cb6f15186512860-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_d0fec6c5e8a640d69cb6f15186512860-3" name="rest_code_d0fec6c5e8a640d69cb6f15186512860-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d0fec6c5e8a640d69cb6f15186512860-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb_kv_ets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_d0fec6c5e8a640d69cb6f15186512860-4" name="rest_code_d0fec6c5e8a640d69cb6f15186512860-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d0fec6c5e8a640d69cb6f15186512860-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;RefId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Keys&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We add two new modules:&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;tanodb_coverage_fsm&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;The FSM implementation for the coverage call.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;tanodb_coverage_fsm_sup&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;The supervisor for the FSM processes.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;We also add the tanodb_coverage_fsm_sup to the tanodb_sup supervisor tree.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="trying-it"&gt;
&lt;h2&gt;Trying it&lt;/h2&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-1" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-1"&gt;&lt;/a&gt;&lt;span class="nv"&gt;Nums&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-2" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-2"&gt;&lt;/a&gt;&lt;span class="nv"&gt;Buckets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;list_to_binary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bucket-"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;integer_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-3" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-3"&gt;&lt;/a&gt;&lt;span class="nv"&gt;Nums&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-4" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-4"&gt;&lt;/a&gt;&lt;span class="nv"&gt;Keys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;list_to_binary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"key-"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;integer_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Nums&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-5" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-6" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-6"&gt;&lt;/a&gt;&lt;span class="nv"&gt;GenValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-7" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-8" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-8"&gt;&lt;/a&gt;&lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-9" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-10" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nv"&gt;Val&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GenValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-11" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-12" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-13" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-13"&gt;&lt;/a&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Buckets&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-14" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-14"&gt;&lt;/a&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-15" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-15"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"bucket-1"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_4800f735ea4e4d988029fc45d6b362ed-16" name="rest_code_4800f735ea4e4d988029fc45d6b362ed-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_4800f735ea4e4d988029fc45d6b362ed-16"&gt;&lt;/a&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Keys&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Keys&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Keys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=/=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]].&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-1" name="rest_code_d230342bae4f4634aca555ef2feac34c-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="mi"&gt;296867520082839655260123481645494988367611297792&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-2" name="rest_code_d230342bae4f4634aca555ef2feac34c-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-10"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-3" name="rest_code_d230342bae4f4634aca555ef2feac34c-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-3"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;365375409332725729550921208179070754913983135744&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-4" name="rest_code_d230342bae4f4634aca555ef2feac34c-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-4"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-5" name="rest_code_d230342bae4f4634aca555ef2feac34c-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-5"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;137015778499772148581595453067151533092743675904&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-6" name="rest_code_d230342bae4f4634aca555ef2feac34c-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-8"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-7" name="rest_code_d230342bae4f4634aca555ef2feac34c-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-7"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;707914855582156101004909840846949587645842325504&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-8" name="rest_code_d230342bae4f4634aca555ef2feac34c-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-9"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-9" name="rest_code_d230342bae4f4634aca555ef2feac34c-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-9"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;45671926166590716193865151022383844364247891968&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-10" name="rest_code_d230342bae4f4634aca555ef2feac34c-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-2"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-11" name="rest_code_d230342bae4f4634aca555ef2feac34c-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-11"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;753586781748746817198774991869333432010090217472&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-12" name="rest_code_d230342bae4f4634aca555ef2feac34c-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-9"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-13" name="rest_code_d230342bae4f4634aca555ef2feac34c-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-13"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;274031556999544297163190906134303066185487351808&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-14" name="rest_code_d230342bae4f4634aca555ef2feac34c-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-10"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-15" name="rest_code_d230342bae4f4634aca555ef2feac34c-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-15"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;822094670998632891489572718402909198556462055424&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-16" name="rest_code_d230342bae4f4634aca555ef2feac34c-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-5"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-17" name="rest_code_d230342bae4f4634aca555ef2feac34c-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-17"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;319703483166135013357056057156686910549735243776&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-18" name="rest_code_d230342bae4f4634aca555ef2feac34c-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-4"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-10"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-19" name="rest_code_d230342bae4f4634aca555ef2feac34c-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-19"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;342539446249430371453988632667878832731859189760&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-20" name="rest_code_d230342bae4f4634aca555ef2feac34c-20" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-20"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-4"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-21" name="rest_code_d230342bae4f4634aca555ef2feac34c-21" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-21"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;68507889249886074290797726533575766546371837952&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-22" name="rest_code_d230342bae4f4634aca555ef2feac34c-22" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-2"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-23" name="rest_code_d230342bae4f4634aca555ef2feac34c-23" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-23"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;799258707915337533392640142891717276374338109440&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-24" name="rest_code_d230342bae4f4634aca555ef2feac34c-24" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-5"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-25" name="rest_code_d230342bae4f4634aca555ef2feac34c-25" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-25"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;91343852333181432387730302044767688728495783936&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-26" name="rest_code_d230342bae4f4634aca555ef2feac34c-26" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-2"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-27" name="rest_code_d230342bae4f4634aca555ef2feac34c-27" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-27"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;730750818665451459101842416358141509827966271488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-28" name="rest_code_d230342bae4f4634aca555ef2feac34c-28" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-28"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-9"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-29" name="rest_code_d230342bae4f4634aca555ef2feac34c-29" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-29"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;159851741583067506678528028578343455274867621888&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-30" name="rest_code_d230342bae4f4634aca555ef2feac34c-30" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-30"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-8"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-31" name="rest_code_d230342bae4f4634aca555ef2feac34c-31" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-31"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;182687704666362864775460604089535377456991567872&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-32" name="rest_code_d230342bae4f4634aca555ef2feac34c-32" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-32"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-8"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-33" name="rest_code_d230342bae4f4634aca555ef2feac34c-33" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-33"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;844930634081928249586505293914101120738586001408&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-34" name="rest_code_d230342bae4f4634aca555ef2feac34c-34" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-34"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-5"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-35" name="rest_code_d230342bae4f4634aca555ef2feac34c-35" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-35"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;867766597165223607683437869425293042920709947392&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-36" name="rest_code_d230342bae4f4634aca555ef2feac34c-36" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-36"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-3"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-37" name="rest_code_d230342bae4f4634aca555ef2feac34c-37" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-37"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;890602560248518965780370444936484965102833893376&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-38" name="rest_code_d230342bae4f4634aca555ef2feac34c-38" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-38"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-3"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-39" name="rest_code_d230342bae4f4634aca555ef2feac34c-39" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-39"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-40" name="rest_code_d230342bae4f4634aca555ef2feac34c-40" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-40"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-6"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-41" name="rest_code_d230342bae4f4634aca555ef2feac34c-41" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-41"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;913438523331814323877303020447676887284957839360&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-42" name="rest_code_d230342bae4f4634aca555ef2feac34c-42" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-42"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-3"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-43" name="rest_code_d230342bae4f4634aca555ef2feac34c-43" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-43"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1118962191081472546749696200048404186924073353216&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-44" name="rest_code_d230342bae4f4634aca555ef2feac34c-44" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-44"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-7"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-1"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-45" name="rest_code_d230342bae4f4634aca555ef2feac34c-45" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-45"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1164634117248063262943561351070788031288321245184&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-46" name="rest_code_d230342bae4f4634aca555ef2feac34c-46" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-46"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-7"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-47" name="rest_code_d230342bae4f4634aca555ef2feac34c-47" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-47"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1027618338748291114361965898003636498195577569280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-48" name="rest_code_d230342bae4f4634aca555ef2feac34c-48" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-48"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-"&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-49" name="rest_code_d230342bae4f4634aca555ef2feac34c-49" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-49"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1096126227998177188652763624537212264741949407232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-50" name="rest_code_d230342bae4f4634aca555ef2feac34c-50" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-50"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-51" name="rest_code_d230342bae4f4634aca555ef2feac34c-51" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-51"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1073290264914881830555831049026020342559825461248&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-52" name="rest_code_d230342bae4f4634aca555ef2feac34c-52" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-52"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[...]},&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-53" name="rest_code_d230342bae4f4634aca555ef2feac34c-53" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-53"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1141798154164767904846628775559596109106197299200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_d230342bae4f4634aca555ef2feac34c-54" name="rest_code_d230342bae4f4634aca555ef2feac34c-54" href="http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/#rest_code_d230342bae4f4634aca555ef2feac34c-54"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;,...}]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;</description><category>distsys</category><category>erlang</category><category>riak_core</category><category>tutorial</category><guid>http://marianoguerra.org/posts/riak-core-tutorial-part-7-coverage-calls/</guid><pubDate>Thu, 30 Aug 2018 11:25:52 GMT</pubDate></item><item><title>Riak Core Tutorial Part 6: Handoff</title><link>http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;pre class="literal-block"&gt;The content of this chapter is in the 04-handoff branch.

https://gitlab.com/marianoguerra/tanodb/tree/04-handoff&lt;/pre&gt;
&lt;section id="how-it-works"&gt;
&lt;h2&gt;How it Works&lt;/h2&gt;
&lt;p&gt;With quorum requests we are halfway in our way to tolerate failures in cluster
nodes, our values are written to more than one vnode but if a node dies and
another takes his work or if we add a new node and the vnodes must be
rebalanced we need to handle &lt;a class="reference external" href="https://github.com/basho/riak_core/wiki/Handoffs"&gt;handoff&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The reasons to start a handoff are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A ring update event for a ring that all other nodes have already seen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A secondary vnode is idle for a period of time and the primary, original
owner of the partition is up again.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When this happens riak_core will inform the vnode that handoff is starting,
calling &lt;cite&gt;handoff_starting&lt;/cite&gt;, if it returns false it's cancelled, if it returns
true it calls &lt;cite&gt;is_empty&lt;/cite&gt;, that must return false to inform that the vnode has
something to handoff (it's not empty) or true to inform that the vnode is
empty, in our case we ask for the first element of the ets table and if it's
the special value '$end_of_table' we know it's empty, if it returns true the
handoff is considered finished, if false then a call is done to &lt;cite&gt;handle_handoff_command&lt;/cite&gt;
passing as first parameter an opaque structure that contains two fields we are
insterested in, foldfun and acc0, they can be unpacked with a macro like this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_e62d23d547af4b33929a62516c3ae6c4-1" name="rest_code_e62d23d547af4b33929a62516c3ae6c4-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_e62d23d547af4b33929a62516c3ae6c4-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_handoff_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="nv"&gt;FOLD_REQ&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;foldfun&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Fun&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;acc0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Acc0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;cite&gt;FOLD_REQ&lt;/cite&gt; macro is defined in the riak_core_vnode.hrl header file which we
include.&lt;/p&gt;
&lt;p&gt;This function must iterate through all the keys it stores and for each of them
call foldfun with the key as first argument, the value as second argument and
the latest acc0 value as third.&lt;/p&gt;
&lt;p&gt;The result of the function call is the new &lt;cite&gt;Acc0&lt;/cite&gt; you must pass to the next
call to foldfun, the last &lt;cite&gt;Acc0&lt;/cite&gt; must be returned by the handle_handoff_command.&lt;/p&gt;
&lt;p&gt;For each call to &lt;cite&gt;Fun(Key, Entry, AccIn0)&lt;/cite&gt; riak_core will send it to the new
vnode, to do that it must encode the data before sending, it does this by
calling &lt;cite&gt;encode_handoff_item(Key, Value)&lt;/cite&gt;, where you must encode the data
before sending it.&lt;/p&gt;
&lt;p&gt;When the value is received by the new vnode it must decode it and do something
with it, this is done by the function &lt;cite&gt;handle_handoff_data&lt;/cite&gt;, where we decode the
received data and do the appropriate thing with it.&lt;/p&gt;
&lt;p&gt;When we sent all the key/values &lt;cite&gt;handoff_finished&lt;/cite&gt; will be called and then
&lt;cite&gt;delete&lt;/cite&gt; so we cleanup the data on the old vnode .&lt;/p&gt;
&lt;p&gt;You can decide to handle other commands sent to the vnode while the handoff is
running, you can choose to do one of the followings:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Handle it in the current vnode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Forward it to the vnode we are handing off&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Drop it&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What to do depends on the design of you app, all of them have tradeoffs.&lt;/p&gt;
&lt;p&gt;The signature of all the responses is:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_c1c2149d84b44a61858313f2d852d048-1" name="rest_code_c1c2149d84b44a61858313f2d852d048-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_c1c2149d84b44a61858313f2d852d048-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;callback&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;handle_handoff_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;term&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Sender&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ModState&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;term&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_c1c2149d84b44a61858313f2d852d048-2" name="rest_code_c1c2149d84b44a61858313f2d852d048-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_c1c2149d84b44a61858313f2d852d048-2"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Reply&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;term&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NewModState&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;term&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;a id="rest_code_c1c2149d84b44a61858313f2d852d048-3" name="rest_code_c1c2149d84b44a61858313f2d852d048-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_c1c2149d84b44a61858313f2d852d048-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;noreply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NewModState&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;term&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;a id="rest_code_c1c2149d84b44a61858313f2d852d048-4" name="rest_code_c1c2149d84b44a61858313f2d852d048-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_c1c2149d84b44a61858313f2d852d048-4"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;async&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Work&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;From&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NewModState&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;term&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;a id="rest_code_c1c2149d84b44a61858313f2d852d048-5" name="rest_code_c1c2149d84b44a61858313f2d852d048-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_c1c2149d84b44a61858313f2d852d048-5"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NewModState&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;term&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;a id="rest_code_c1c2149d84b44a61858313f2d852d048-6" name="rest_code_c1c2149d84b44a61858313f2d852d048-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_c1c2149d84b44a61858313f2d852d048-6"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NewModState&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;term&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;a id="rest_code_c1c2149d84b44a61858313f2d852d048-7" name="rest_code_c1c2149d84b44a61858313f2d852d048-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_c1c2149d84b44a61858313f2d852d048-7"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Reason&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;term&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NewModState&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;term&lt;/span&gt;&lt;span class="p"&gt;()}.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A diagram of the flow is as follows:&lt;/p&gt;
&lt;pre class="literal-block"&gt;+-----------+      +----------+        +----------+
|           | true |          | false  |          |
| Starting  +------&amp;gt; is_empty +--------&amp;gt; fold_req |
|           |      |          |        |          |
+-----+-----+      +----+-----+        +----+-----+
      |                 |                   |
      | false           | true              | ok
      |                 |                   |
+-----v-----+           |              +----v-----+     +--------+
|           |           |              |          |     |        |
| Cancelled |           +--------------&amp;gt; finished +-----&amp;gt; delete |
|           |                          |          |     |        |
+-----------+                          +----------+     +--------+&lt;/pre&gt;
&lt;/section&gt;
&lt;section id="implementing-it"&gt;
&lt;h2&gt;Implementing it&lt;/h2&gt;
&lt;p&gt;We need to add logic to all the empty callbacks related to handoff:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-1" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_handoff_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="nv"&gt;FOLD_REQ&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;foldfun&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;FoldFun&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;acc0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Acc0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-2" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-3" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fold req &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-4" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;KvFoldFun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Val&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AccIn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-5" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"fold fun &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Val&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-6" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="nv"&gt;FoldFun&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AccIn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-7" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-8" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;AccFinal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb_kv_ets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;foldl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;KvFoldFun&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Acc0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-9" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AccFinal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}};&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-10" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-10"&gt;&lt;/a&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-11" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-11"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_handoff_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-12" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff command &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;, ignoring"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-13" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;noreply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-14" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-14"&gt;&lt;/a&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-15" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-15"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handoff_starting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;TargetNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-16" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff starting &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;TargetNode&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-17" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-18" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-18"&gt;&lt;/a&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-19" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-19"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handoff_cancelled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-20" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-20" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-20"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff cancelled &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-21" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-21" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-22" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-22" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-22"&gt;&lt;/a&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-23" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-23" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-23"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handoff_finished&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;TargetNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-24" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-24" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff finished &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;TargetNode&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-25" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-25" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-26" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-26" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-26"&gt;&lt;/a&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-27" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-27" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-27"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_handoff_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;BinData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-28" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-28" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-28"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;TermData&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;binary_to_term&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;BinData&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-29" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-29" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-29"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff data received &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;TermData&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-30" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-30" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-30"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;TermData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-31" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-31" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-31"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb_kv_ets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-32" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-32" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-32"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}}.&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-33" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-33" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-33"&gt;&lt;/a&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-34" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-34" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-34"&gt;&lt;/a&gt;&lt;span class="nf"&gt;encode_handoff_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-35" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-35" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-35"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;term_to_binary&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-36" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-36" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-36"&gt;&lt;/a&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-37" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-37" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-37"&gt;&lt;/a&gt;&lt;span class="nf"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-38" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-38" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-38"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;IsEmpty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb_kv_ets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;is_empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-39" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-39" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-39"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"is_empty &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;IsEmpty&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-40" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-40" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-40"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;IsEmpty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}}.&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-41" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-41" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-41"&gt;&lt;/a&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-42" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-42" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-42"&gt;&lt;/a&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-43" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-43" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-43"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"delete &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-44" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-44" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-44"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb_kv_ets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-45" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-45" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-45"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KvState2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb_kv_ets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-46" name="rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-46" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_1da92d60b4cc4eb58a8b25bccdbc3dc8-46"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState2&lt;/span&gt;&lt;span class="p"&gt;}}.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="trying-it"&gt;
&lt;h2&gt;Trying it&lt;/h2&gt;
&lt;p&gt;To test it we will first start a devrel node, put some values and then join
two other nodes and see on the console the handoff happening.&lt;/p&gt;
&lt;p&gt;To make sure the nodes don't know about each other in case you played with
clustering already we will start by removing the devrel builds:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_8ad16dfc856f49e59f0ff1aa18aff3ea-1" name="rest_code_8ad16dfc856f49e59f0ff1aa18aff3ea-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_8ad16dfc856f49e59f0ff1aa18aff3ea-1"&gt;&lt;/a&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-rf&lt;span class="w"&gt; &lt;/span&gt;_build/dev*
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And build the nodes again:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_2c741e1f0f794ea2b230ee3b434cd5c1-1" name="rest_code_2c741e1f0f794ea2b230ee3b434cd5c1-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_2c741e1f0f794ea2b230ee3b434cd5c1-1"&gt;&lt;/a&gt;make&lt;span class="w"&gt; &lt;/span&gt;devrel
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we will start the first node and connect to its console:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_a8744663ecd2476098204f235699f82d-1" name="rest_code_a8744663ecd2476098204f235699f82d-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_a8744663ecd2476098204f235699f82d-1"&gt;&lt;/a&gt;make&lt;span class="w"&gt; &lt;/span&gt;dev1-console
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We generate a list of some numbers:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_5ee67badffef43d598471125b0999e96-1" name="rest_code_5ee67badffef43d598471125b0999e96-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_5ee67badffef43d598471125b0999e96-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb1&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Nums&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;seq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_5ee67badffef43d598471125b0999e96-2" name="rest_code_5ee67badffef43d598471125b0999e96-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_5ee67badffef43d598471125b0999e96-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_5ee67badffef43d598471125b0999e96-3" name="rest_code_5ee67badffef43d598471125b0999e96-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_5ee67badffef43d598471125b0999e96-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And with it create some bucket names:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_7354622bddb44bf2b799b27681668330-1" name="rest_code_7354622bddb44bf2b799b27681668330-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_7354622bddb44bf2b799b27681668330-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb1&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_7354622bddb44bf2b799b27681668330-2" name="rest_code_7354622bddb44bf2b799b27681668330-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_7354622bddb44bf2b799b27681668330-2"&gt;&lt;/a&gt;&lt;span class="nv"&gt;Buckets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_7354622bddb44bf2b799b27681668330-3" name="rest_code_7354622bddb44bf2b799b27681668330-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_7354622bddb44bf2b799b27681668330-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;list_to_binary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bucket-"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;integer_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a id="rest_code_7354622bddb44bf2b799b27681668330-4" name="rest_code_7354622bddb44bf2b799b27681668330-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_7354622bddb44bf2b799b27681668330-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Nums&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_7354622bddb44bf2b799b27681668330-5" name="rest_code_7354622bddb44bf2b799b27681668330-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_7354622bddb44bf2b799b27681668330-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_7354622bddb44bf2b799b27681668330-6" name="rest_code_7354622bddb44bf2b799b27681668330-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_7354622bddb44bf2b799b27681668330-6"&gt;&lt;/a&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"bucket-1"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"bucket-2"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"bucket-3"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7354622bddb44bf2b799b27681668330-7" name="rest_code_7354622bddb44bf2b799b27681668330-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_7354622bddb44bf2b799b27681668330-7"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"bucket-4"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"bucket-5"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"bucket-6"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"bucket-7"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7354622bddb44bf2b799b27681668330-8" name="rest_code_7354622bddb44bf2b799b27681668330-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_7354622bddb44bf2b799b27681668330-8"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"bucket-8"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"bucket-9"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"bucket-10"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And some key names:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_abeaa253ec334c08b9f91608b5b009f8-1" name="rest_code_abeaa253ec334c08b9f91608b5b009f8-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_abeaa253ec334c08b9f91608b5b009f8-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb1&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_abeaa253ec334c08b9f91608b5b009f8-2" name="rest_code_abeaa253ec334c08b9f91608b5b009f8-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_abeaa253ec334c08b9f91608b5b009f8-2"&gt;&lt;/a&gt;&lt;span class="nv"&gt;Keys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_abeaa253ec334c08b9f91608b5b009f8-3" name="rest_code_abeaa253ec334c08b9f91608b5b009f8-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_abeaa253ec334c08b9f91608b5b009f8-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;list_to_binary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"key-"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;integer_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a id="rest_code_abeaa253ec334c08b9f91608b5b009f8-4" name="rest_code_abeaa253ec334c08b9f91608b5b009f8-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_abeaa253ec334c08b9f91608b5b009f8-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Nums&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_abeaa253ec334c08b9f91608b5b009f8-5" name="rest_code_abeaa253ec334c08b9f91608b5b009f8-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_abeaa253ec334c08b9f91608b5b009f8-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_abeaa253ec334c08b9f91608b5b009f8-6" name="rest_code_abeaa253ec334c08b9f91608b5b009f8-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_abeaa253ec334c08b9f91608b5b009f8-6"&gt;&lt;/a&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-1"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-2"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-3"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-4"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_abeaa253ec334c08b9f91608b5b009f8-7" name="rest_code_abeaa253ec334c08b9f91608b5b009f8-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_abeaa253ec334c08b9f91608b5b009f8-7"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-5"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-6"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-7"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-8"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-9"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_abeaa253ec334c08b9f91608b5b009f8-8" name="rest_code_abeaa253ec334c08b9f91608b5b009f8-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_abeaa253ec334c08b9f91608b5b009f8-8"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"key-10"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We create a function to generate a value from a bucket and a key:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_b8de4cc4542b48d5ac21920e93bb7e6f-1" name="rest_code_b8de4cc4542b48d5ac21920e93bb7e6f-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_b8de4cc4542b48d5ac21920e93bb7e6f-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb1&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_b8de4cc4542b48d5ac21920e93bb7e6f-2" name="rest_code_b8de4cc4542b48d5ac21920e93bb7e6f-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_b8de4cc4542b48d5ac21920e93bb7e6f-2"&gt;&lt;/a&gt;&lt;span class="nv"&gt;GenValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And then put some values to the buckets and keys we created:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_712d5cf041d54652838f286a1733b792-1" name="rest_code_712d5cf041d54652838f286a1733b792-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_712d5cf041d54652838f286a1733b792-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb1&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_712d5cf041d54652838f286a1733b792-2" name="rest_code_712d5cf041d54652838f286a1733b792-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_712d5cf041d54652838f286a1733b792-2"&gt;&lt;/a&gt;&lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_712d5cf041d54652838f286a1733b792-3" name="rest_code_712d5cf041d54652838f286a1733b792-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_712d5cf041d54652838f286a1733b792-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_712d5cf041d54652838f286a1733b792-4" name="rest_code_712d5cf041d54652838f286a1733b792-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_712d5cf041d54652838f286a1733b792-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;Val&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GenValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_712d5cf041d54652838f286a1733b792-5" name="rest_code_712d5cf041d54652838f286a1733b792-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_712d5cf041d54652838f286a1733b792-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_712d5cf041d54652838f286a1733b792-6" name="rest_code_712d5cf041d54652838f286a1733b792-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_712d5cf041d54652838f286a1733b792-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_712d5cf041d54652838f286a1733b792-7" name="rest_code_712d5cf041d54652838f286a1733b792-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_712d5cf041d54652838f286a1733b792-7"&gt;&lt;/a&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Buckets&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_712d5cf041d54652838f286a1733b792-8" name="rest_code_712d5cf041d54652838f286a1733b792-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_712d5cf041d54652838f286a1733b792-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_712d5cf041d54652838f286a1733b792-9" name="rest_code_712d5cf041d54652838f286a1733b792-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_712d5cf041d54652838f286a1733b792-9"&gt;&lt;/a&gt;&lt;span class="n"&gt;ok&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now that we have some data let's start the other two nodes:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_0983645c97b24d9083ace299dd17b38b-1" name="rest_code_0983645c97b24d9083ace299dd17b38b-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_0983645c97b24d9083ace299dd17b38b-1"&gt;&lt;/a&gt;make&lt;span class="w"&gt; &lt;/span&gt;dev2-console
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In yet another shell:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_179f36798c784b15ac3f8b7aac804799-1" name="rest_code_179f36798c784b15ac3f8b7aac804799-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_179f36798c784b15ac3f8b7aac804799-1"&gt;&lt;/a&gt;make&lt;span class="w"&gt; &lt;/span&gt;dev3-console
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This part should remind you of the first chapter:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_b5cdf0a3a9fb4cf58f7ca00c249f1109-1" name="rest_code_b5cdf0a3a9fb4cf58f7ca00c249f1109-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_b5cdf0a3a9fb4cf58f7ca00c249f1109-1"&gt;&lt;/a&gt;make&lt;span class="w"&gt; &lt;/span&gt;devrel-join
&lt;/pre&gt;&lt;/div&gt;
&lt;pre class="literal-block"&gt;Success: staged join request for 'tanodb2@127.0.0.1' to 'tanodb1@127.0.0.1'
Success: staged join request for 'tanodb3@127.0.0.1' to 'tanodb1@127.0.0.1'&lt;/pre&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_758dcda2318e4b909920db09a464bd5c-1" name="rest_code_758dcda2318e4b909920db09a464bd5c-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_758dcda2318e4b909920db09a464bd5c-1"&gt;&lt;/a&gt;make&lt;span class="w"&gt; &lt;/span&gt;devrel-cluster-plan
&lt;/pre&gt;&lt;/div&gt;
&lt;pre class="literal-block"&gt;=============================== Staged Changes =========================
Action         Details(s)
------------------------------------------------------------------------
join           'tanodb2@127.0.0.1'
join           'tanodb3@127.0.0.1'
------------------------------------------------------------------------


NOTE: Applying these changes will result in 1 cluster transition

########################################################################
                         After cluster transition 1/1
########################################################################

================================= Membership ===========================
Status     Ring    Pending    Node
------------------------------------------------------------------------
valid     100.0%     34.4%    'tanodb1@127.0.0.1'
valid       0.0%     32.8%    'tanodb2@127.0.0.1'
valid       0.0%     32.8%    'tanodb3@127.0.0.1'
------------------------------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

WARNING: Not all replicas will be on distinct nodes

Transfers resulting from cluster changes: 42
  21 transfers from 'tanodb1@127.0.0.1' to 'tanodb3@127.0.0.1'
  21 transfers from 'tanodb1@127.0.0.1' to 'tanodb2@127.0.0.1'&lt;/pre&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_99daf84d42c74f038d99aebec3a49dcd-1" name="rest_code_99daf84d42c74f038d99aebec3a49dcd-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/#rest_code_99daf84d42c74f038d99aebec3a49dcd-1"&gt;&lt;/a&gt;make&lt;span class="w"&gt; &lt;/span&gt;devrel-cluster-commit
&lt;/pre&gt;&lt;/div&gt;
&lt;pre class="literal-block"&gt;Cluster changes committed&lt;/pre&gt;
&lt;p&gt;On the consoles from the nodes you should see some logs like the following, I
will just paste some as example.&lt;/p&gt;
&lt;p&gt;On the sending side:&lt;/p&gt;
&lt;pre class="literal-block"&gt;00:17:24.240 [info] Starting ownership transfer of tanodb_vnode from
'tanodb1@127.0.0.1' 1118962191081472546749696200048404186924073353216 to
'tanodb2@127.0.0.1' 1118962191081472546749696200048404186924073353216

00:17:24.240 [info] fold req 1118962191081472546749696200048404186924073353216
00:17:24.240 [info] fold fun {&amp;lt;&amp;lt;"bucket-1"&amp;gt;&amp;gt;,&amp;lt;&amp;lt;"key-1"&amp;gt;&amp;gt;}:
    [{bucket,&amp;lt;&amp;lt;"bucket-1"&amp;gt;&amp;gt;},{key,&amp;lt;&amp;lt;"key-1"&amp;gt;&amp;gt;}]

...

00:17:24.241 [info] fold fun {&amp;lt;&amp;lt;"bucket-7"&amp;gt;&amp;gt;,&amp;lt;&amp;lt;"key-8"&amp;gt;&amp;gt;}:
    [{bucket,&amp;lt;&amp;lt;"bucket-7"&amp;gt;&amp;gt;},{key,&amp;lt;&amp;lt;"key-8"&amp;gt;&amp;gt;}]

00:17:24.281 [info] ownership transfer of tanodb_vnode from
'tanodb1@127.0.0.1' 1118962191081472546749696200048404186924073353216 to
'tanodb2@127.0.0.1' 1118962191081472546749696200048404186924073353216
    completed: sent 575.00 B bytes in 7 of 7 objects in 0.04 seconds
    (13.67 KB/second)

00:17:24.280 [info] handoff finished
    1141798154164767904846628775559596109106197299200:
    {1141798154164767904846628775559596109106197299200,
        'tanodb3@127.0.0.1'}

00:17:24.285 [info] delete
    1141798154164767904846628775559596109106197299200&lt;/pre&gt;
&lt;p&gt;On the receiving side:&lt;/p&gt;
&lt;pre class="literal-block"&gt;00:13:59.641 [info] handoff starting
    1050454301831586472458898473514828420377701515264:
    {hinted,{1050454301831586472458898473514828420377701515264,
        'tanodb1@127.0.0.1'}}

00:13:59.641 [info] is_empty
    182687704666362864775460604089535377456991567872: true

00:14:34.259 [info] Receiving handoff data for partition
    tanodb_vnode:68507889249886074290797726533575766546371837952 from
    {"127.0.0.1",47440}

00:14:34.296 [info] handoff data received
    {{&amp;lt;&amp;lt;"bucket-8"&amp;gt;&amp;gt;,&amp;lt;&amp;lt;"key-1"&amp;gt;&amp;gt;},
        [{bucket,&amp;lt;&amp;lt;"bucket-8"&amp;gt;&amp;gt;},{key,&amp;lt;&amp;lt;"key-1"&amp;gt;&amp;gt;}]}

...

00:14:34.297 [info] handoff data received
    {{&amp;lt;&amp;lt;"bucket-3"&amp;gt;&amp;gt;,&amp;lt;&amp;lt;"key-7"&amp;gt;&amp;gt;},
        [{bucket,&amp;lt;&amp;lt;"bucket-3"&amp;gt;&amp;gt;},{key,&amp;lt;&amp;lt;"key-7"&amp;gt;&amp;gt;}]}

00:14:34.298 [info] Handoff receiver for partition
    68507889249886074290797726533575766546371837952 exited after
    processing 5 objects from {"127.0.0.1",47440}&lt;/pre&gt;
&lt;/section&gt;</description><category>distsys</category><category>erlang</category><category>riak_core</category><category>tutorial</category><guid>http://marianoguerra.org/posts/riak-core-tutorial-part-6-handoff/</guid><pubDate>Thu, 16 Aug 2018 17:54:51 GMT</pubDate></item><item><title>Riak Core Tutorial Part 5: Quorum Requests</title><link>http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;pre class="literal-block"&gt;The content of this chapter is in the 03-quorum branch.

https://gitlab.com/marianoguerra/tanodb/tree/03-quorum&lt;/pre&gt;
&lt;section id="how-it-works"&gt;
&lt;h2&gt;How it Works&lt;/h2&gt;
&lt;p&gt;Quorum requests allows sending a command to more than one vnode and wait until
a number of responses are received before considering the request succesful.&lt;/p&gt;
&lt;p&gt;To implement this we need a process that distributed the requests to the first
N vnodes in the preference list and waits for at least W response to arrive
before returning to the requester.&lt;/p&gt;
&lt;p&gt;We use a gen_fsm to implement this process, which looks like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;+------+    +---------+    +---------+    +---------+              +------+
|      |    |         |    |         |    |         |remaining = 0 |      |
| Init +---&amp;gt;| Prepare +---&amp;gt;| Execute +---&amp;gt;| Waiting +-------------&amp;gt;| Stop |
|      |    |         |    |         |    |         |              |      |
+------+    +---------+    +---------+    +-------+-+              +------+
                                              ^   | |
                                              |   | |        +---------+
                                              +---+ +-------&amp;gt;|         |
                                                             | Timeout |
                                      remaining &amp;gt; 0  timeout |         |
                                                             +---------+&lt;/pre&gt;
&lt;/section&gt;
&lt;section id="implementing-it"&gt;
&lt;h2&gt;Implementing it&lt;/h2&gt;
&lt;p&gt;To implement it we need to change the code in tanodb.erl instantiate a FSM
to handle the request instead of sending the command directly to one vnode.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-1" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-1"&gt;&lt;/a&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-2" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;K&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-3" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;Params&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-4" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;run_quorum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-5" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-6" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-6"&gt;&lt;/a&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-7" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;K&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-8" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;Params&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-9" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;run_quorum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-10" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-10"&gt;&lt;/a&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-11" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-11"&gt;&lt;/a&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-12" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;K&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-13" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;Params&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_dfc0609e9aae474995d42d76ef7459f6-14" name="rest_code_dfc0609e9aae474995d42d76ef7459f6-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dfc0609e9aae474995d42d76ef7459f6-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;run_quorum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We are going to generalize that logic in a function called run_quorum, where
we can pass options for N, W and Timeout to play with different values:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-1" name="rest_code_5c75173a407f4a619dca5cfab1921d75-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;run_quorum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-2" name="rest_code_5c75173a407f4a619dca5cfab1921d75-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;maps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-3" name="rest_code_5c75173a407f4a619dca5cfab1921d75-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;W&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;maps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="nv"&gt;W&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-4" name="rest_code_5c75173a407f4a619dca5cfab1921d75-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;Timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;maps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Opts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="nv"&gt;TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-5" name="rest_code_5c75173a407f4a619dca5cfab1921d75-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;make_ref&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-6" name="rest_code_5c75173a407f4a619dca5cfab1921d75-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;tanodb_write_fsm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;W&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-7" name="rest_code_5c75173a407f4a619dca5cfab1921d75-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;wait_for_reqid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Timeout&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-8" name="rest_code_5c75173a407f4a619dca5cfab1921d75-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-9" name="rest_code_5c75173a407f4a619dca5cfab1921d75-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-9"&gt;&lt;/a&gt;&lt;span class="nf"&gt;wait_for_reqid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Timeout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-10" name="rest_code_5c75173a407f4a619dca5cfab1921d75-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;receive&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-11" name="rest_code_5c75173a407f4a619dca5cfab1921d75-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Val&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Val&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-12" name="rest_code_5c75173a407f4a619dca5cfab1921d75-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;after&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-13" name="rest_code_5c75173a407f4a619dca5cfab1921d75-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;Timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_5c75173a407f4a619dca5cfab1921d75-14" name="rest_code_5c75173a407f4a619dca5cfab1921d75-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5c75173a407f4a619dca5cfab1921d75-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To wait for the right answer we need to generate a unique identifier for each
request and send it with the request itself. The identifier will come back
in the message sent by the FSM once the request finishes.&lt;/p&gt;
&lt;p&gt;If too much time passed waiting for the response we consider it an error and
return before receiving it.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_32761614827146959f062ca43d1448ae-1" name="rest_code_32761614827146959f062ca43d1448ae-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_32761614827146959f062ca43d1448ae-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;wait_for_reqid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Timeout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_32761614827146959f062ca43d1448ae-2" name="rest_code_32761614827146959f062ca43d1448ae-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_32761614827146959f062ca43d1448ae-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;receive&lt;/span&gt;
&lt;a id="rest_code_32761614827146959f062ca43d1448ae-3" name="rest_code_32761614827146959f062ca43d1448ae-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_32761614827146959f062ca43d1448ae-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Reason&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Reason&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;a id="rest_code_32761614827146959f062ca43d1448ae-4" name="rest_code_32761614827146959f062ca43d1448ae-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_32761614827146959f062ca43d1448ae-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Val&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Val&lt;/span&gt;
&lt;a id="rest_code_32761614827146959f062ca43d1448ae-5" name="rest_code_32761614827146959f062ca43d1448ae-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_32761614827146959f062ca43d1448ae-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;after&lt;/span&gt;
&lt;a id="rest_code_32761614827146959f062ca43d1448ae-6" name="rest_code_32761614827146959f062ca43d1448ae-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_32761614827146959f062ca43d1448ae-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nv"&gt;Timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_32761614827146959f062ca43d1448ae-7" name="rest_code_32761614827146959f062ca43d1448ae-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_32761614827146959f062ca43d1448ae-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There are two new files:&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;tanodb_write_fsm.erl&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;The FSM logic&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;tanodb_write_fsm_sup.erl&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;The supervisor for the FSMs&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Finally we need to add tanodb_write_fsm_sup to our top level supervisor in
tanodb_sup.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="trying-it"&gt;
&lt;h2&gt;Trying it&lt;/h2&gt;
&lt;p&gt;To test it we are going to run some calls to the API and observe that now
the response contains more than one response:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_352122ee825546c39729d7c2938ded22-1" name="rest_code_352122ee825546c39729d7c2938ded22-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_352122ee825546c39729d7c2938ded22-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;a id="rest_code_352122ee825546c39729d7c2938ded22-2" name="rest_code_352122ee825546c39729d7c2938ded22-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_352122ee825546c39729d7c2938ded22-2"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;a id="rest_code_352122ee825546c39729d7c2938ded22-3" name="rest_code_352122ee825546c39729d7c2938ded22-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_352122ee825546c39729d7c2938ded22-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;V1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;First let's try to get a key that doesn't exist:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_446b99aea0e848709096eba13d801bde-1" name="rest_code_446b99aea0e848709096eba13d801bde-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_446b99aea0e848709096eba13d801bde-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_578b1105c03142eaa8b3df5efce03c18-1" name="rest_code_578b1105c03142eaa8b3df5efce03c18-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_578b1105c03142eaa8b3df5efce03c18-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,[{[&lt;/span&gt;&lt;span class="mi"&gt;1073290264914881830555831049026020342559825461248&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_578b1105c03142eaa8b3df5efce03c18-2" name="rest_code_578b1105c03142eaa8b3df5efce03c18-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_578b1105c03142eaa8b3df5efce03c18-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_578b1105c03142eaa8b3df5efce03c18-3" name="rest_code_578b1105c03142eaa8b3df5efce03c18-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_578b1105c03142eaa8b3df5efce03c18-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;}}},&lt;/span&gt;
&lt;a id="rest_code_578b1105c03142eaa8b3df5efce03c18-4" name="rest_code_578b1105c03142eaa8b3df5efce03c18-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_578b1105c03142eaa8b3df5efce03c18-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_578b1105c03142eaa8b3df5efce03c18-5" name="rest_code_578b1105c03142eaa8b3df5efce03c18-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_578b1105c03142eaa8b3df5efce03c18-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_578b1105c03142eaa8b3df5efce03c18-6" name="rest_code_578b1105c03142eaa8b3df5efce03c18-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_578b1105c03142eaa8b3df5efce03c18-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_578b1105c03142eaa8b3df5efce03c18-7" name="rest_code_578b1105c03142eaa8b3df5efce03c18-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_578b1105c03142eaa8b3df5efce03c18-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;}}},&lt;/span&gt;
&lt;a id="rest_code_578b1105c03142eaa8b3df5efce03c18-8" name="rest_code_578b1105c03142eaa8b3df5efce03c18-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_578b1105c03142eaa8b3df5efce03c18-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_578b1105c03142eaa8b3df5efce03c18-9" name="rest_code_578b1105c03142eaa8b3df5efce03c18-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_578b1105c03142eaa8b3df5efce03c18-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1096126227998177188652763624537212264741949407232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_578b1105c03142eaa8b3df5efce03c18-10" name="rest_code_578b1105c03142eaa8b3df5efce03c18-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_578b1105c03142eaa8b3df5efce03c18-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_578b1105c03142eaa8b3df5efce03c18-11" name="rest_code_578b1105c03142eaa8b3df5efce03c18-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_578b1105c03142eaa8b3df5efce03c18-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;}}}]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's do the same call but passing options, we want to run the command in 5
vnodes and wait for the response of the 5, the request should finish under a
second:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_bbdaa8edd89246b5890035e6139337e5-1" name="rest_code_bbdaa8edd89246b5890035e6139337e5-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_bbdaa8edd89246b5890035e6139337e5-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-1" name="rest_code_53e94d93b6674044bb3e4e1248915f21-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,[{[&lt;/span&gt;&lt;span class="mi"&gt;456719261665907161938651510223838443642478919680&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-2" name="rest_code_53e94d93b6674044bb3e4e1248915f21-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-3" name="rest_code_53e94d93b6674044bb3e4e1248915f21-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;}}},&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-4" name="rest_code_53e94d93b6674044bb3e4e1248915f21-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-5" name="rest_code_53e94d93b6674044bb3e4e1248915f21-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;433883298582611803841718934712646521460354973696&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-6" name="rest_code_53e94d93b6674044bb3e4e1248915f21-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-7" name="rest_code_53e94d93b6674044bb3e4e1248915f21-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;}}},&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-8" name="rest_code_53e94d93b6674044bb3e4e1248915f21-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-9" name="rest_code_53e94d93b6674044bb3e4e1248915f21-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;411047335499316445744786359201454599278231027712&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-10" name="rest_code_53e94d93b6674044bb3e4e1248915f21-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-11" name="rest_code_53e94d93b6674044bb3e4e1248915f21-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;}}},&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-12" name="rest_code_53e94d93b6674044bb3e4e1248915f21-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-12"&gt;&lt;/a&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-13" name="rest_code_53e94d93b6674044bb3e4e1248915f21-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;388211372416021087647853783690262677096107081728&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-14" name="rest_code_53e94d93b6674044bb3e4e1248915f21-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-15" name="rest_code_53e94d93b6674044bb3e4e1248915f21-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;}}},&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-16" name="rest_code_53e94d93b6674044bb3e4e1248915f21-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-16"&gt;&lt;/a&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-17" name="rest_code_53e94d93b6674044bb3e4e1248915f21-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;365375409332725729550921208179070754913983135744&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-18" name="rest_code_53e94d93b6674044bb3e4e1248915f21-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_53e94d93b6674044bb3e4e1248915f21-19" name="rest_code_53e94d93b6674044bb3e4e1248915f21-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_53e94d93b6674044bb3e4e1248915f21-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;}}}]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's try deleting a key that doesn't exist:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_29d09eed089e42e5804584902b201d4f-1" name="rest_code_29d09eed089e42e5804584902b201d4f-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_29d09eed089e42e5804584902b201d4f-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_055e78dd26ac491ab5f0d184c447ce37-1" name="rest_code_055e78dd26ac491ab5f0d184c447ce37-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_055e78dd26ac491ab5f0d184c447ce37-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,[{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_055e78dd26ac491ab5f0d184c447ce37-2" name="rest_code_055e78dd26ac491ab5f0d184c447ce37-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_055e78dd26ac491ab5f0d184c447ce37-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_055e78dd26ac491ab5f0d184c447ce37-3" name="rest_code_055e78dd26ac491ab5f0d184c447ce37-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_055e78dd26ac491ab5f0d184c447ce37-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_055e78dd26ac491ab5f0d184c447ce37-4" name="rest_code_055e78dd26ac491ab5f0d184c447ce37-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_055e78dd26ac491ab5f0d184c447ce37-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_055e78dd26ac491ab5f0d184c447ce37-5" name="rest_code_055e78dd26ac491ab5f0d184c447ce37-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_055e78dd26ac491ab5f0d184c447ce37-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1073290264914881830555831049026020342559825461248&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_055e78dd26ac491ab5f0d184c447ce37-6" name="rest_code_055e78dd26ac491ab5f0d184c447ce37-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_055e78dd26ac491ab5f0d184c447ce37-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_055e78dd26ac491ab5f0d184c447ce37-7" name="rest_code_055e78dd26ac491ab5f0d184c447ce37-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_055e78dd26ac491ab5f0d184c447ce37-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_055e78dd26ac491ab5f0d184c447ce37-8" name="rest_code_055e78dd26ac491ab5f0d184c447ce37-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_055e78dd26ac491ab5f0d184c447ce37-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_055e78dd26ac491ab5f0d184c447ce37-9" name="rest_code_055e78dd26ac491ab5f0d184c447ce37-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_055e78dd26ac491ab5f0d184c447ce37-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1096126227998177188652763624537212264741949407232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_055e78dd26ac491ab5f0d184c447ce37-10" name="rest_code_055e78dd26ac491ab5f0d184c447ce37-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_055e78dd26ac491ab5f0d184c447ce37-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_055e78dd26ac491ab5f0d184c447ce37-11" name="rest_code_055e78dd26ac491ab5f0d184c447ce37-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_055e78dd26ac491ab5f0d184c447ce37-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's put a value:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_72617d662a214609ab4aea79e428ca59-1" name="rest_code_72617d662a214609ab4aea79e428ca59-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_72617d662a214609ab4aea79e428ca59-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;V1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-1" name="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_ac3f3ce82d114ef9a759a356ec3480c1-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,[{[&lt;/span&gt;&lt;span class="mi"&gt;1096126227998177188652763624537212264741949407232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-2" name="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_ac3f3ce82d114ef9a759a356ec3480c1-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-3" name="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_ac3f3ce82d114ef9a759a356ec3480c1-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-4" name="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_ac3f3ce82d114ef9a759a356ec3480c1-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-5" name="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_ac3f3ce82d114ef9a759a356ec3480c1-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1073290264914881830555831049026020342559825461248&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-6" name="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_ac3f3ce82d114ef9a759a356ec3480c1-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-7" name="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_ac3f3ce82d114ef9a759a356ec3480c1-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-8" name="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_ac3f3ce82d114ef9a759a356ec3480c1-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-9" name="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_ac3f3ce82d114ef9a759a356ec3480c1-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-10" name="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_ac3f3ce82d114ef9a759a356ec3480c1-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-11" name="rest_code_ac3f3ce82d114ef9a759a356ec3480c1-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_ac3f3ce82d114ef9a759a356ec3480c1-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now let's get the value:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_1b24e4cda87c4b5d821134dfafbee10c-1" name="rest_code_1b24e4cda87c4b5d821134dfafbee10c-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_1b24e4cda87c4b5d821134dfafbee10c-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-1" name="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,[{[&lt;/span&gt;&lt;span class="mi"&gt;1096126227998177188652763624537212264741949407232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-2" name="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-3" name="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;,{{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;}}},&lt;/span&gt;
&lt;a id="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-4" name="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-5" name="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-6" name="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-7" name="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;,{{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;}}},&lt;/span&gt;
&lt;a id="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-8" name="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-9" name="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1073290264914881830555831049026020342559825461248&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-10" name="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-11" name="rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_5aa53b6fe82c4f08b2bf35e4ce9c1fa6-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;,{{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;}}}]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's delete it:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_29dc1914623849ef825b617d65be4ec7-1" name="rest_code_29dc1914623849ef825b617d65be4ec7-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_29dc1914623849ef825b617d65be4ec7-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_8a2d93a7702d4ac2a803ba8699282c35-1" name="rest_code_8a2d93a7702d4ac2a803ba8699282c35-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_8a2d93a7702d4ac2a803ba8699282c35-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,[{[&lt;/span&gt;&lt;span class="mi"&gt;1073290264914881830555831049026020342559825461248&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_8a2d93a7702d4ac2a803ba8699282c35-2" name="rest_code_8a2d93a7702d4ac2a803ba8699282c35-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_8a2d93a7702d4ac2a803ba8699282c35-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_8a2d93a7702d4ac2a803ba8699282c35-3" name="rest_code_8a2d93a7702d4ac2a803ba8699282c35-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_8a2d93a7702d4ac2a803ba8699282c35-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_8a2d93a7702d4ac2a803ba8699282c35-4" name="rest_code_8a2d93a7702d4ac2a803ba8699282c35-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_8a2d93a7702d4ac2a803ba8699282c35-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_8a2d93a7702d4ac2a803ba8699282c35-5" name="rest_code_8a2d93a7702d4ac2a803ba8699282c35-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_8a2d93a7702d4ac2a803ba8699282c35-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1096126227998177188652763624537212264741949407232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_8a2d93a7702d4ac2a803ba8699282c35-6" name="rest_code_8a2d93a7702d4ac2a803ba8699282c35-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_8a2d93a7702d4ac2a803ba8699282c35-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_8a2d93a7702d4ac2a803ba8699282c35-7" name="rest_code_8a2d93a7702d4ac2a803ba8699282c35-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_8a2d93a7702d4ac2a803ba8699282c35-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_8a2d93a7702d4ac2a803ba8699282c35-8" name="rest_code_8a2d93a7702d4ac2a803ba8699282c35-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_8a2d93a7702d4ac2a803ba8699282c35-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_8a2d93a7702d4ac2a803ba8699282c35-9" name="rest_code_8a2d93a7702d4ac2a803ba8699282c35-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_8a2d93a7702d4ac2a803ba8699282c35-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_8a2d93a7702d4ac2a803ba8699282c35-10" name="rest_code_8a2d93a7702d4ac2a803ba8699282c35-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_8a2d93a7702d4ac2a803ba8699282c35-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_8a2d93a7702d4ac2a803ba8699282c35-11" name="rest_code_8a2d93a7702d4ac2a803ba8699282c35-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_8a2d93a7702d4ac2a803ba8699282c35-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And try to get it back:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_4d519631340744ab8d2845617a585165-1" name="rest_code_4d519631340744ab8d2845617a585165-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_4d519631340744ab8d2845617a585165-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-1" name="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,[{[&lt;/span&gt;&lt;span class="mi"&gt;1073290264914881830555831049026020342559825461248&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-2" name="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-3" name="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;}}},&lt;/span&gt;
&lt;a id="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-4" name="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-5" name="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1096126227998177188652763624537212264741949407232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-6" name="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-7" name="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;}}},&lt;/span&gt;
&lt;a id="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-8" name="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-9" name="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-10" name="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-11" name="rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/#rest_code_dee9c92326dd4a1dac1f61b77e6cd17f-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;}}}]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;</description><category>distsys</category><category>erlang</category><category>riak_core</category><category>tutorial</category><guid>http://marianoguerra.org/posts/riak-core-tutorial-part-5-quorum-requests/</guid><pubDate>Sat, 11 Aug 2018 20:25:13 GMT</pubDate></item><item><title>Riak Core Tutorial Part 4: First Commands</title><link>http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;pre class="literal-block"&gt;The content of this chapter is in the 02-commands branch.

https://gitlab.com/marianoguerra/tanodb/tree/02-commands&lt;/pre&gt;
&lt;p&gt;This is part of a series, see the previous one at &lt;a class="reference external" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/"&gt;Riak Core Tutorial Part 3: Ping Command&lt;/a&gt;&lt;/p&gt;
&lt;section id="implementing-get-put-and-delete"&gt;
&lt;h2&gt;Implementing Get, Put and Delete&lt;/h2&gt;
&lt;p&gt;For our first commands we will copy the general structure of the ping command.&lt;/p&gt;
&lt;p&gt;We will start by adding three new functions to the tanodb.erl file:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_9002958be5304d6f80a202bc4665a21b-1" name="rest_code_9002958be5304d6f80a202bc4665a21b-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9002958be5304d6f80a202bc4665a21b-1"&gt;&lt;/a&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_9002958be5304d6f80a202bc4665a21b-2" name="rest_code_9002958be5304d6f80a202bc4665a21b-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9002958be5304d6f80a202bc4665a21b-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;make_ref&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a id="rest_code_9002958be5304d6f80a202bc4665a21b-3" name="rest_code_9002958be5304d6f80a202bc4665a21b-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9002958be5304d6f80a202bc4665a21b-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;send_to_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;}}).&lt;/span&gt;
&lt;a id="rest_code_9002958be5304d6f80a202bc4665a21b-4" name="rest_code_9002958be5304d6f80a202bc4665a21b-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9002958be5304d6f80a202bc4665a21b-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_9002958be5304d6f80a202bc4665a21b-5" name="rest_code_9002958be5304d6f80a202bc4665a21b-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9002958be5304d6f80a202bc4665a21b-5"&gt;&lt;/a&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_9002958be5304d6f80a202bc4665a21b-6" name="rest_code_9002958be5304d6f80a202bc4665a21b-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9002958be5304d6f80a202bc4665a21b-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;make_ref&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a id="rest_code_9002958be5304d6f80a202bc4665a21b-7" name="rest_code_9002958be5304d6f80a202bc4665a21b-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9002958be5304d6f80a202bc4665a21b-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;send_to_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;}}).&lt;/span&gt;
&lt;a id="rest_code_9002958be5304d6f80a202bc4665a21b-8" name="rest_code_9002958be5304d6f80a202bc4665a21b-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9002958be5304d6f80a202bc4665a21b-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_9002958be5304d6f80a202bc4665a21b-9" name="rest_code_9002958be5304d6f80a202bc4665a21b-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9002958be5304d6f80a202bc4665a21b-9"&gt;&lt;/a&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_9002958be5304d6f80a202bc4665a21b-10" name="rest_code_9002958be5304d6f80a202bc4665a21b-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9002958be5304d6f80a202bc4665a21b-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;make_ref&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a id="rest_code_9002958be5304d6f80a202bc4665a21b-11" name="rest_code_9002958be5304d6f80a202bc4665a21b-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9002958be5304d6f80a202bc4665a21b-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;send_to_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;}}).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And generalizing the code used by ping to send a command to one vnode:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_8bf14a84280c4c6695905669213fb8f7-1" name="rest_code_8bf14a84280c4c6695905669213fb8f7-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_8bf14a84280c4c6695905669213fb8f7-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;send_to_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Cmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_8bf14a84280c4c6695905669213fb8f7-2" name="rest_code_8bf14a84280c4c6695905669213fb8f7-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_8bf14a84280c4c6695905669213fb8f7-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;DocIdx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_core_util&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;chash_key&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;a id="rest_code_8bf14a84280c4c6695905669213fb8f7-3" name="rest_code_8bf14a84280c4c6695905669213fb8f7-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_8bf14a84280c4c6695905669213fb8f7-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;PrefList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_core_apl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_primary_apl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;DocIdx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_8bf14a84280c4c6695905669213fb8f7-4" name="rest_code_8bf14a84280c4c6695905669213fb8f7-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_8bf14a84280c4c6695905669213fb8f7-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;IndexNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PrefList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_8bf14a84280c4c6695905669213fb8f7-5" name="rest_code_8bf14a84280c4c6695905669213fb8f7-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_8bf14a84280c4c6695905669213fb8f7-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;riak_core_vnode_master&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;sync_spawn_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IndexNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Cmd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tanodb_vnode_master&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In tanodb_vnode.erl we will need to first create an instance of the key-value
store per vnode at initialization and keep a reference to its state in the
vnode state record:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_5951eacceec642cba9538c66bb3835d6-1" name="rest_code_5951eacceec642cba9538c66bb3835d6-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_5951eacceec642cba9538c66bb3835d6-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;
&lt;a id="rest_code_5951eacceec642cba9538c66bb3835d6-2" name="rest_code_5951eacceec642cba9538c66bb3835d6-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_5951eacceec642cba9538c66bb3835d6-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_5951eacceec642cba9538c66bb3835d6-3" name="rest_code_5951eacceec642cba9538c66bb3835d6-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_5951eacceec642cba9538c66bb3835d6-3"&gt;&lt;/a&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_5951eacceec642cba9538c66bb3835d6-4" name="rest_code_5951eacceec642cba9538c66bb3835d6-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_5951eacceec642cba9538c66bb3835d6-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb_kv_ets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(#{&lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;a id="rest_code_5951eacceec642cba9538c66bb3835d6-5" name="rest_code_5951eacceec642cba9538c66bb3835d6-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_5951eacceec642cba9538c66bb3835d6-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We then need to add three new clauses to the handle_command callback to handle
our two new commands, which translate almost directly to calls in the kv module:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-1" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_command&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-2" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-3" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;node&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-4" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb_kv_ets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-5" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Res&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}};&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-6" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-6"&gt;&lt;/a&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-7" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-7"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_command&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-8" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-9" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;node&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-10" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb_kv_ets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-11" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Res&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}};&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-12" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-12"&gt;&lt;/a&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-13" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-13"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_command&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-14" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-15" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;Location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;node&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-16" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb_kv_ets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;KvState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_a10f0e9c5f12441d8180ef3010e9c782-17" name="rest_code_a10f0e9c5f12441d8180ef3010e9c782-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_a10f0e9c5f12441d8180ef3010e9c782-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;ReqId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Res&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kv_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;KvState1&lt;/span&gt;&lt;span class="p"&gt;}};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="trying-it"&gt;
&lt;h2&gt;Trying it&lt;/h2&gt;
&lt;p&gt;First let's try to get a key that doesn't exist:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_b62c44f6a122494083439c047fed044f-1" name="rest_code_b62c44f6a122494083439c047fed044f-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_b62c44f6a122494083439c047fed044f-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;a id="rest_code_b62c44f6a122494083439c047fed044f-2" name="rest_code_b62c44f6a122494083439c047fed044f-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_b62c44f6a122494083439c047fed044f-2"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;a id="rest_code_b62c44f6a122494083439c047fed044f-3" name="rest_code_b62c44f6a122494083439c047fed044f-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_b62c44f6a122494083439c047fed044f-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;V1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_d3b7e59f18c14fcb8fa9a2c2ac652ce2-1" name="rest_code_d3b7e59f18c14fcb8fa9a2c2ac652ce2-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_d3b7e59f18c14fcb8fa9a2c2ac652ce2-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_c6808e15c84146a4898002dd5233560f-1" name="rest_code_c6808e15c84146a4898002dd5233560f-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_c6808e15c84146a4898002dd5233560f-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_c6808e15c84146a4898002dd5233560f-2" name="rest_code_c6808e15c84146a4898002dd5233560f-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_c6808e15c84146a4898002dd5233560f-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_c6808e15c84146a4898002dd5233560f-3" name="rest_code_c6808e15c84146a4898002dd5233560f-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_c6808e15c84146a4898002dd5233560f-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;}}}}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The structure of the response is:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_26d02ac46e4849a0b9a1d9f94b4a3813-1" name="rest_code_26d02ac46e4849a0b9a1d9f94b4a3813-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_26d02ac46e4849a0b9a1d9f94b4a3813-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;UniqueRequestReference&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="nv"&gt;PartitionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NodeId&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;CommandResponse&lt;/span&gt;&lt;span class="p"&gt;}}.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's try deleting a key that doesn't exist:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_fe0fe41814a54778a2bebf24c1000119-1" name="rest_code_fe0fe41814a54778a2bebf24c1000119-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_fe0fe41814a54778a2bebf24c1000119-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_3947a3df0cf94f0f98ca496894e59715-1" name="rest_code_3947a3df0cf94f0f98ca496894e59715-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_3947a3df0cf94f0f98ca496894e59715-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_3947a3df0cf94f0f98ca496894e59715-2" name="rest_code_3947a3df0cf94f0f98ca496894e59715-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_3947a3df0cf94f0f98ca496894e59715-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_3947a3df0cf94f0f98ca496894e59715-3" name="rest_code_3947a3df0cf94f0f98ca496894e59715-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_3947a3df0cf94f0f98ca496894e59715-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's put a value:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_9df2daceb3b649c1a763e6f883668c2a-1" name="rest_code_9df2daceb3b649c1a763e6f883668c2a-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_9df2daceb3b649c1a763e6f883668c2a-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;V1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_e49245b997904d659acb990264e26455-1" name="rest_code_e49245b997904d659acb990264e26455-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_e49245b997904d659acb990264e26455-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e49245b997904d659acb990264e26455-2" name="rest_code_e49245b997904d659acb990264e26455-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_e49245b997904d659acb990264e26455-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_e49245b997904d659acb990264e26455-3" name="rest_code_e49245b997904d659acb990264e26455-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_e49245b997904d659acb990264e26455-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now let's get the value:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_da8289e67e6b4c6e8a9ec2e41784c4bf-1" name="rest_code_da8289e67e6b4c6e8a9ec2e41784c4bf-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_da8289e67e6b4c6e8a9ec2e41784c4bf-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_1cbcbd1205be432d8b828582e0248d94-1" name="rest_code_1cbcbd1205be432d8b828582e0248d94-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_1cbcbd1205be432d8b828582e0248d94-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_1cbcbd1205be432d8b828582e0248d94-2" name="rest_code_1cbcbd1205be432d8b828582e0248d94-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_1cbcbd1205be432d8b828582e0248d94-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_1cbcbd1205be432d8b828582e0248d94-3" name="rest_code_1cbcbd1205be432d8b828582e0248d94-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_1cbcbd1205be432d8b828582e0248d94-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;,{{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;}}}}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's delete it:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_8da5208a81f14fb9ae41fa2f33d37aa0-1" name="rest_code_8da5208a81f14fb9ae41fa2f33d37aa0-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_8da5208a81f14fb9ae41fa2f33d37aa0-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_0405729dbb144442ae699ef3bac148cc-1" name="rest_code_0405729dbb144442ae699ef3bac148cc-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_0405729dbb144442ae699ef3bac148cc-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_0405729dbb144442ae699ef3bac148cc-2" name="rest_code_0405729dbb144442ae699ef3bac148cc-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_0405729dbb144442ae699ef3bac148cc-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_0405729dbb144442ae699ef3bac148cc-3" name="rest_code_0405729dbb144442ae699ef3bac148cc-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_0405729dbb144442ae699ef3bac148cc-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And try to get it back:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_8487604ade514cc5a16b82ae2ea2ea1b-1" name="rest_code_8487604ade514cc5a16b82ae2ea2ea1b-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_8487604ade514cc5a16b82ae2ea2ea1b-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;B1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;K1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_e5794fc308d44850bfb892981ed69c3b-1" name="rest_code_e5794fc308d44850bfb892981ed69c3b-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_e5794fc308d44850bfb892981ed69c3b-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="mi"&gt;1050454301831586472458898473514828420377701515264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_e5794fc308d44850bfb892981ed69c3b-2" name="rest_code_e5794fc308d44850bfb892981ed69c3b-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_e5794fc308d44850bfb892981ed69c3b-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;a id="rest_code_e5794fc308d44850bfb892981ed69c3b-3" name="rest_code_e5794fc308d44850bfb892981ed69c3b-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/#rest_code_e5794fc308d44850bfb892981ed69c3b-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;k1&lt;/span&gt;&lt;span class="p"&gt;}}}}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;</description><category>distsys</category><category>erlang</category><category>riak_core</category><category>tutorial</category><guid>http://marianoguerra.org/posts/riak-core-tutorial-part-4-first-commands/</guid><pubDate>Mon, 30 Jul 2018 08:41:45 GMT</pubDate></item><item><title>Riak Core Tutorial Part 3: Ping Command</title><link>http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;pre class="literal-block"&gt;The content of this chapter is in the `01-template` branch.

https://gitlab.com/marianoguerra/tanodb/tree/01-template&lt;/pre&gt;
&lt;p&gt;This is part of a series, see the previous one at &lt;a class="reference external" href="http://marianoguerra.org/posts/riak-core-tutorial-part-2-starting/"&gt;Riak Core Tutorial Part 2: Starting&lt;/a&gt;&lt;/p&gt;
&lt;section id="how-it-works"&gt;
&lt;h2&gt;How it Works&lt;/h2&gt;
&lt;p&gt;Let's see how ping works under the covers.&lt;/p&gt;
&lt;p&gt;Its entry point and public API is the tanodb module, that means we have to
look into tanodb.erl:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-1" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-2" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-2"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;export&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-3" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;ignore_xref&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-4" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-5" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-5"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% @doc Pings a random vnode to make sure communication is functional&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-6" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-6"&gt;&lt;/a&gt;&lt;span class="nf"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-7" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% argument to chash_key has to be a two item tuple, since it comes from riak&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-8" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% and the full key has a bucket, we use a contant in the bucket position&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-9" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% and a timestamp as key so we hit different vnodes on each call&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-10" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;DocIdx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_core_util&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;chash_key&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"ping"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;term_to_binary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;())}),&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-11" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% ask for 1 vnode index to send this request to, change N to get more&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-12" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% vnodes, for example for replication&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-13" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-14" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;PrefList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_core_apl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_primary_apl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;DocIdx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-15" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;IndexNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PrefList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-16" name="rest_code_ed99253bfc64414f8f8e1d8e2b09532f-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ed99253bfc64414f8f8e1d8e2b09532f-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;riak_core_vnode_master&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;sync_spawn_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IndexNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tanodb_vnode_master&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_53c8b111b7f9480cabd518c51f04262b-1" name="rest_code_53c8b111b7f9480cabd518c51f04262b-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_53c8b111b7f9480cabd518c51f04262b-1"&gt;&lt;/a&gt;&lt;span class="nv"&gt;DocIdx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_core_util&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;chash_key&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"ping"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;term_to_binary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;())}),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The line above hashes a key to decide to which vnode the call should go, a
riak_core app has a fixed number of vnodes that are distributed across all the
instances of your app's physical nodes, vnodes move from instance to instance
when the number of instances change to balance the load and provide fault
tolerance and scalability.&lt;/p&gt;
&lt;p&gt;The call above will allow us to ask for vnodes that can handle that hashed key,
let's run it in the app console to see what it does:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_9d07e17ea47845738f9538cbc9847b38-1" name="rest_code_9d07e17ea47845738f9538cbc9847b38-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_9d07e17ea47845738f9538cbc9847b38-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DocIdx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_core_util&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;chash_key&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s"&gt;"ping"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;term_to_binary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;())}).&lt;/span&gt;
&lt;a id="rest_code_9d07e17ea47845738f9538cbc9847b38-2" name="rest_code_9d07e17ea47845738f9538cbc9847b38-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_9d07e17ea47845738f9538cbc9847b38-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_9d07e17ea47845738f9538cbc9847b38-3" name="rest_code_9d07e17ea47845738f9538cbc9847b38-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_9d07e17ea47845738f9538cbc9847b38-3"&gt;&lt;/a&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;126&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;218&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;155&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;160&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;161&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;213&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;168&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We seem to get a binary back, in the next line we ask for a list of vnodes that
can handle that hashed key:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_da699e74bd2f465692dff2e46bd4d519-1" name="rest_code_da699e74bd2f465692dff2e46bd4d519-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_da699e74bd2f465692dff2e46bd4d519-1"&gt;&lt;/a&gt;&lt;span class="nv"&gt;PrefList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_core_apl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_primary_apl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;DocIdx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's run it to see what it does:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_10433c71e00e4110aed203c539f49da7-1" name="rest_code_10433c71e00e4110aed203c539f49da7-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_10433c71e00e4110aed203c539f49da7-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PrefList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_core_apl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_primary_apl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;DocIdx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_10433c71e00e4110aed203c539f49da7-2" name="rest_code_10433c71e00e4110aed203c539f49da7-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_10433c71e00e4110aed203c539f49da7-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_10433c71e00e4110aed203c539f49da7-3" name="rest_code_10433c71e00e4110aed203c539f49da7-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_10433c71e00e4110aed203c539f49da7-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;[{{&lt;/span&gt;&lt;span class="mi"&gt;730750818665451459101842416358141509827966271488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_10433c71e00e4110aed203c539f49da7-4" name="rest_code_10433c71e00e4110aed203c539f49da7-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_10433c71e00e4110aed203c539f49da7-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We get a list with one tuple that has 3 items, a long number, something that
looks like a host and an atom, let's try changing the number 1:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_ade5bef7692847b990234f600a239052-1" name="rest_code_ade5bef7692847b990234f600a239052-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ade5bef7692847b990234f600a239052-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PrefList2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_core_apl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_primary_apl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;DocIdx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_ade5bef7692847b990234f600a239052-2" name="rest_code_ade5bef7692847b990234f600a239052-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ade5bef7692847b990234f600a239052-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_ade5bef7692847b990234f600a239052-3" name="rest_code_ade5bef7692847b990234f600a239052-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ade5bef7692847b990234f600a239052-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;[{{&lt;/span&gt;&lt;span class="mi"&gt;730750818665451459101842416358141509827966271488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_ade5bef7692847b990234f600a239052-4" name="rest_code_ade5bef7692847b990234f600a239052-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ade5bef7692847b990234f600a239052-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_ade5bef7692847b990234f600a239052-5" name="rest_code_ade5bef7692847b990234f600a239052-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ade5bef7692847b990234f600a239052-5"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="mi"&gt;753586781748746817198774991869333432010090217472&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_ade5bef7692847b990234f600a239052-6" name="rest_code_ade5bef7692847b990234f600a239052-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ade5bef7692847b990234f600a239052-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we get two tuples, the first one is the same, so what this does is to return
the number of vnodes that can handle the request from the hashed key by priority.&lt;/p&gt;
&lt;p&gt;The first number is the vnode id, it's what we get on the ping response.&lt;/p&gt;
&lt;p&gt;Next line just unpacks the pref list to get the vnode id and ignore the other
part:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_49f9cf0fc0494ce09c0cf4662d65f4e9-1" name="rest_code_49f9cf0fc0494ce09c0cf4662d65f4e9-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_49f9cf0fc0494ce09c0cf4662d65f4e9-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;IndexNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PrefList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally we ask riak_core to call the ping command on the IndexNode we got back:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_6832a76fcd594aee913f28007a00fe8a-1" name="rest_code_6832a76fcd594aee913f28007a00fe8a-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_6832a76fcd594aee913f28007a00fe8a-1"&gt;&lt;/a&gt;&lt;span class="nn"&gt;riak_core_vnode_master&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;sync_spawn_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IndexNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tanodb_vnode_master&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's try it on the console:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_34f5364881a545da8d92b2d43ad6935b-1" name="rest_code_34f5364881a545da8d92b2d43ad6935b-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_34f5364881a545da8d92b2d43ad6935b-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;IndexNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PrefList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;a id="rest_code_34f5364881a545da8d92b2d43ad6935b-2" name="rest_code_34f5364881a545da8d92b2d43ad6935b-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_34f5364881a545da8d92b2d43ad6935b-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_34f5364881a545da8d92b2d43ad6935b-3" name="rest_code_34f5364881a545da8d92b2d43ad6935b-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_34f5364881a545da8d92b2d43ad6935b-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;[{{&lt;/span&gt;&lt;span class="mi"&gt;730750818665451459101842416358141509827966271488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_34f5364881a545da8d92b2d43ad6935b-4" name="rest_code_34f5364881a545da8d92b2d43ad6935b-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_34f5364881a545da8d92b2d43ad6935b-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;a id="rest_code_34f5364881a545da8d92b2d43ad6935b-5" name="rest_code_34f5364881a545da8d92b2d43ad6935b-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_34f5364881a545da8d92b2d43ad6935b-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_34f5364881a545da8d92b2d43ad6935b-6" name="rest_code_34f5364881a545da8d92b2d43ad6935b-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_34f5364881a545da8d92b2d43ad6935b-6"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_core_vnode_master&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;sync_spawn_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IndexNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tanodb_vnode_master&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_34f5364881a545da8d92b2d43ad6935b-7" name="rest_code_34f5364881a545da8d92b2d43ad6935b-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_34f5364881a545da8d92b2d43ad6935b-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_34f5364881a545da8d92b2d43ad6935b-8" name="rest_code_34f5364881a545da8d92b2d43ad6935b-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_34f5364881a545da8d92b2d43ad6935b-8"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pong&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;730750818665451459101842416358141509827966271488&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can see we get IndexNode back in the pong response, now let's try passing the second IndexNode:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_7e29b8d485754c27a23c8a545b8805fa-1" name="rest_code_7e29b8d485754c27a23c8a545b8805fa-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_7e29b8d485754c27a23c8a545b8805fa-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nv"&gt;IndexNode1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Type1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;IndexNode2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Type2&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PrefList2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;a id="rest_code_7e29b8d485754c27a23c8a545b8805fa-2" name="rest_code_7e29b8d485754c27a23c8a545b8805fa-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_7e29b8d485754c27a23c8a545b8805fa-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_7e29b8d485754c27a23c8a545b8805fa-3" name="rest_code_7e29b8d485754c27a23c8a545b8805fa-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_7e29b8d485754c27a23c8a545b8805fa-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;[{{&lt;/span&gt;&lt;span class="mi"&gt;730750818665451459101842416358141509827966271488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7e29b8d485754c27a23c8a545b8805fa-4" name="rest_code_7e29b8d485754c27a23c8a545b8805fa-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_7e29b8d485754c27a23c8a545b8805fa-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_7e29b8d485754c27a23c8a545b8805fa-5" name="rest_code_7e29b8d485754c27a23c8a545b8805fa-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_7e29b8d485754c27a23c8a545b8805fa-5"&gt;&lt;/a&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="mi"&gt;753586781748746817198774991869333432010090217472&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7e29b8d485754c27a23c8a545b8805fa-6" name="rest_code_7e29b8d485754c27a23c8a545b8805fa-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_7e29b8d485754c27a23c8a545b8805fa-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;'tanodb@127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;a id="rest_code_7e29b8d485754c27a23c8a545b8805fa-7" name="rest_code_7e29b8d485754c27a23c8a545b8805fa-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_7e29b8d485754c27a23c8a545b8805fa-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_7e29b8d485754c27a23c8a545b8805fa-8" name="rest_code_7e29b8d485754c27a23c8a545b8805fa-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_7e29b8d485754c27a23c8a545b8805fa-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_7e29b8d485754c27a23c8a545b8805fa-9" name="rest_code_7e29b8d485754c27a23c8a545b8805fa-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_7e29b8d485754c27a23c8a545b8805fa-9"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_core_vnode_master&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;sync_spawn_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IndexNode2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tanodb_vnode_master&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_7e29b8d485754c27a23c8a545b8805fa-10" name="rest_code_7e29b8d485754c27a23c8a545b8805fa-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_7e29b8d485754c27a23c8a545b8805fa-10"&gt;&lt;/a&gt;
&lt;a id="rest_code_7e29b8d485754c27a23c8a545b8805fa-11" name="rest_code_7e29b8d485754c27a23c8a545b8805fa-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_7e29b8d485754c27a23c8a545b8805fa-11"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pong&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;753586781748746817198774991869333432010090217472&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We get the IndexNode2 back, that means that the request was sent to the second
vnode instead of the first one.&lt;/p&gt;
&lt;p&gt;But where does the command go?&lt;/p&gt;
&lt;p&gt;Let's see the content of tanodb_vnode.erl (just the useful parts):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-1" name="rest_code_cfad86014c86445786fb5f2a206325eb-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb_vnode&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-2" name="rest_code_cfad86014c86445786fb5f2a206325eb-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-2"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;behaviour&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riak_core_vnode&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-3" name="rest_code_cfad86014c86445786fb5f2a206325eb-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-4" name="rest_code_cfad86014c86445786fb5f2a206325eb-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-4"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;export&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;start_vnode&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-5" name="rest_code_cfad86014c86445786fb5f2a206325eb-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-6" name="rest_code_cfad86014c86445786fb5f2a206325eb-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;terminate&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-7" name="rest_code_cfad86014c86445786fb5f2a206325eb-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_command&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-8" name="rest_code_cfad86014c86445786fb5f2a206325eb-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;is_empty&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-9" name="rest_code_cfad86014c86445786fb5f2a206325eb-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-10" name="rest_code_cfad86014c86445786fb5f2a206325eb-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_handoff_command&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-11" name="rest_code_cfad86014c86445786fb5f2a206325eb-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handoff_starting&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-12" name="rest_code_cfad86014c86445786fb5f2a206325eb-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handoff_cancelled&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-13" name="rest_code_cfad86014c86445786fb5f2a206325eb-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handoff_finished&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-14" name="rest_code_cfad86014c86445786fb5f2a206325eb-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_handoff_data&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-15" name="rest_code_cfad86014c86445786fb5f2a206325eb-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;encode_handoff_item&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-16" name="rest_code_cfad86014c86445786fb5f2a206325eb-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_overload_command&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-17" name="rest_code_cfad86014c86445786fb5f2a206325eb-17" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_overload_info&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-18" name="rest_code_cfad86014c86445786fb5f2a206325eb-18" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_coverage&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-19" name="rest_code_cfad86014c86445786fb5f2a206325eb-19" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_exit&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-20" name="rest_code_cfad86014c86445786fb5f2a206325eb-20" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-20"&gt;&lt;/a&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-21" name="rest_code_cfad86014c86445786fb5f2a206325eb-21" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-21"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-22" name="rest_code_cfad86014c86445786fb5f2a206325eb-22" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-22"&gt;&lt;/a&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-23" name="rest_code_cfad86014c86445786fb5f2a206325eb-23" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-23"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% API&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-24" name="rest_code_cfad86014c86445786fb5f2a206325eb-24" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-24"&gt;&lt;/a&gt;&lt;span class="nf"&gt;start_vnode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-25" name="rest_code_cfad86014c86445786fb5f2a206325eb-25" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;riak_core_vnode_master&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_vnode_pid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;I&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="nv"&gt;MODULE&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-26" name="rest_code_cfad86014c86445786fb5f2a206325eb-26" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-26"&gt;&lt;/a&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-27" name="rest_code_cfad86014c86445786fb5f2a206325eb-27" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-27"&gt;&lt;/a&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-28" name="rest_code_cfad86014c86445786fb5f2a206325eb-28" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-28"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}.&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-29" name="rest_code_cfad86014c86445786fb5f2a206325eb-29" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-29"&gt;&lt;/a&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-30" name="rest_code_cfad86014c86445786fb5f2a206325eb-30" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-30"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% Sample command: respond to a ping&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-31" name="rest_code_cfad86014c86445786fb5f2a206325eb-31" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-31"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-32" name="rest_code_cfad86014c86445786fb5f2a206325eb-32" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-32"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pong&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="nl"&gt;#state.partition&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-33" name="rest_code_cfad86014c86445786fb5f2a206325eb-33" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-33"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-34" name="rest_code_cfad86014c86445786fb5f2a206325eb-34" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-34"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"unhandled_command &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_cfad86014c86445786fb5f2a206325eb-35" name="rest_code_cfad86014c86445786fb5f2a206325eb-35" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_cfad86014c86445786fb5f2a206325eb-35"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;noreply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Let's go by parts, first we declare our module:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_af30ce47785b4d88be406147c37397ba-1" name="rest_code_af30ce47785b4d88be406147c37397ba-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_af30ce47785b4d88be406147c37397ba-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tanodb_vnode&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We specify that we want to implement the riak_core_vnode behavior:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_3b24e647f2e6417d8ccd698386c24d90-1" name="rest_code_3b24e647f2e6417d8ccd698386c24d90-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_3b24e647f2e6417d8ccd698386c24d90-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;behaviour&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riak_core_vnode&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Behaviors in Erlang are like interfaces, a set of functions that a module must
implement to satisfy the behaviour specification, you can read more in the
&lt;a class="reference external" href="http://www.erlang.org/doc/design_principles/des_princ.html"&gt;Erlang documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this case riak_core defines a behavior with a set of functions we must
implement to be a valid riak_core vnode, you can get an idea of the kind of
functionality we need by looking at the exported functions:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-1" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;export&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;start_vnode&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-2" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-3" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;terminate&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-4" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-4" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_command&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-5" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-5" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;is_empty&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-6" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-6" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-7" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-7" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_handoff_command&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-8" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-8" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handoff_starting&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-9" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-9" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handoff_cancelled&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-10" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-10" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handoff_finished&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-11" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-11" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_handoff_data&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-12" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-12" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;encode_handoff_item&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-13" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-13" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_overload_command&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-14" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-14" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_overload_info&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-15" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-15" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_coverage&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_59e48a3b84244c25aceb02a2628cfd15-16" name="rest_code_59e48a3b84244c25aceb02a2628cfd15-16" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_59e48a3b84244c25aceb02a2628cfd15-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;handle_exit&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For the moment most of them have a "dummy" implementation where they just do
the minimal amount of work to satisfy the behavior and not more, it's our job
to change the default implementation to fit our needs.&lt;/p&gt;
&lt;p&gt;We will have a record called state to keep info between callbacks, this is
typical Erlang way of managing state so I won't cover it here:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_ce790ba87265416cb01125de270a9543-1" name="rest_code_ce790ba87265416cb01125de270a9543-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_ce790ba87265416cb01125de270a9543-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We implement the api to start the vnode:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_1c77f700553d4351afed6c80f1a5c733-1" name="rest_code_1c77f700553d4351afed6c80f1a5c733-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_1c77f700553d4351afed6c80f1a5c733-1"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% API&lt;/span&gt;
&lt;a id="rest_code_1c77f700553d4351afed6c80f1a5c733-2" name="rest_code_1c77f700553d4351afed6c80f1a5c733-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_1c77f700553d4351afed6c80f1a5c733-2"&gt;&lt;/a&gt;&lt;span class="nf"&gt;start_vnode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;I&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_1c77f700553d4351afed6c80f1a5c733-3" name="rest_code_1c77f700553d4351afed6c80f1a5c733-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_1c77f700553d4351afed6c80f1a5c733-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;riak_core_vnode_master&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_vnode_pid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;I&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="nv"&gt;MODULE&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that on init we store the Partition value on state so we can use it later,
this is what I referred above as vnode id, it's the big number you saw before:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_8f5679a5104449f78ca4c3e76a8e4880-1" name="rest_code_8f5679a5104449f78ca4c3e76a8e4880-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_8f5679a5104449f78ca4c3e76a8e4880-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_8f5679a5104449f78ca4c3e76a8e4880-2" name="rest_code_8f5679a5104449f78ca4c3e76a8e4880-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_8f5679a5104449f78ca4c3e76a8e4880-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;#state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;Partition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now for the interesting part, here we have our ping command implementation,
we match for ping in the Message position (the first argument):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_aa0c93570351473eae8124431c7821c3-1" name="rest_code_aa0c93570351473eae8124431c7821c3-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_aa0c93570351473eae8124431c7821c3-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Return a response with the second item in the tuple being the actual response
that the caller will get where we reply with the atom pong and the partition
number of this vnode, the last item in the tuple is the new state we want to
have for this vnode, since we didn't change anything we pass the current value:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_580d62cba6dc428e8839a4ebede6eab9-1" name="rest_code_580d62cba6dc428e8839a4ebede6eab9-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_580d62cba6dc428e8839a4ebede6eab9-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pong&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="nl"&gt;#state.partition&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We implement a catch all that will just log the unknown command and give no
reply back:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_009af815b48549ae87497ff6875773ab-1" name="rest_code_009af815b48549ae87497ff6875773ab-1" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_009af815b48549ae87497ff6875773ab-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;handle_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="nv"&gt;Sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_009af815b48549ae87497ff6875773ab-2" name="rest_code_009af815b48549ae87497ff6875773ab-2" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_009af815b48549ae87497ff6875773ab-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;lager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"unhandled_command &lt;/span&gt;&lt;span class="si"&gt;~p&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_009af815b48549ae87497ff6875773ab-3" name="rest_code_009af815b48549ae87497ff6875773ab-3" href="http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/#rest_code_009af815b48549ae87497ff6875773ab-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;noreply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;State&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is the roundtrip of a ping call, our task to add more commands will be:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add a function on tanodb.erl that hides the internal work done to distribute the work&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a new match on handle_command to match the command we added on tanodb.erl and provide a reply&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;</description><category>distsys</category><category>erlang</category><category>riak_core</category><category>tutorial</category><guid>http://marianoguerra.org/posts/riak-core-tutorial-part-3-ping-command/</guid><pubDate>Tue, 24 Jul 2018 14:35:57 GMT</pubDate></item><item><title>ameo: Redis compatible GET,SET,DEL and PUBLISH/SUBSCRIBE on riak_core with WebSocket API</title><link>http://marianoguerra.org/posts/ameo-redis-compatible-getsetdel-and-publishsubscribe-on-riak_core-with-websocket-api/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;p&gt;Last week I was invited by Erlang Solutions to give a talk at the London's
Erlang Meetup and to help at a riak_core themed hackathon at their offices the
next day.&lt;/p&gt;
&lt;p&gt;The talk slides: &lt;a class="reference external" href="http://marianoguerra.github.io/presentations/2018-london-erlang-meetup/"&gt;Building distributed applications: riak_core vs partisan&lt;/a&gt; in case you are interested.&lt;/p&gt;
&lt;p&gt;After giving the introduction to riak_core the teams started to work on their
projects and since they were pretty busy and didn't need much help I decided to
"participate" too by implementing an idea I had in mind for a while.&lt;/p&gt;
&lt;p&gt;The result is called &lt;a class="reference external" href="https://github.com/marianoguerra-atik/ameo"&gt;ameo&lt;/a&gt; and
can be described as:&lt;/p&gt;
&lt;pre class="literal-block"&gt;a Redis compatible, distributed in-memory key-value store and pubsub server
implemented using riak_core that exposes the topics via WebSockets.&lt;/pre&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;p&gt;Many languages make it hard to provide websocket connections and live
connections with clients, they work on a request/response basis and/or make it
really hard/expensive to handle multiple persistent connections.&lt;/p&gt;
&lt;p&gt;I've seen solutions that involve starting a redis server and putting usually
nodejs in the front to expose redis topics via websockets, this involves two
moving parts and for many projects, managing nodejs which they may not have
experience with.&lt;/p&gt;
&lt;p&gt;The solution is to just start one instance of ameo or a cluster of ameos and
expose the WebSocket API to clients and the Redis API to the servers.&lt;/p&gt;
&lt;p&gt;Servers can use their preferred Redis client library and as long as they only
use GET, PUT, DEL, PUBLISH, SUBSCRIBE and UNSUBSCRIBE it will look like they
are talking to a Redis server.&lt;/p&gt;
&lt;p&gt;On my way back I had some extra time at the airport so I implemented a basic
web UI to play with the websocket client and to provide a reference
implementation others can use.&lt;/p&gt;
&lt;p&gt;You can see the result in this screencast:&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/m5NbpmvyQQY" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;&lt;p&gt;Implementation details:&lt;/p&gt;
&lt;p&gt;As said earlier I use riak_core for clustering, for the Redis part I took some
modules from an Erlang implementation of Redis called &lt;a class="reference external" href="https://github.com/cbd/edis"&gt;edis&lt;/a&gt; and I created a library called &lt;a class="reference external" href="https://github.com/marianoguerra/edis_proto"&gt;edis_proto&lt;/a&gt; that allows any project to
expose a Redis compatible API to their servers with a couple lines of code.&lt;/p&gt;
&lt;p&gt;The WebSocket part is implemented using the &lt;a class="reference external" href="https://ninenines.eu/docs/en/cowboy/2.0/"&gt;Cowboy Web Server&lt;/a&gt;.&lt;/p&gt;</description><category>distsys</category><category>erlang</category><category>redis</category><category>riak_core</category><guid>http://marianoguerra.org/posts/ameo-redis-compatible-getsetdel-and-publishsubscribe-on-riak_core-with-websocket-api/</guid><pubDate>Fri, 19 Jan 2018 10:08:04 GMT</pubDate></item><item><title>rebar3 partisan template</title><link>http://marianoguerra.org/posts/rebar3-partisan-template/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;p&gt;I created a &lt;a class="reference external" href="http://www.rebar3.org/"&gt;rebar3&lt;/a&gt; template to start a &lt;a class="reference external" href="https://lasp-lang.readme.io/docs/overview"&gt;partisan&lt;/a&gt;  project, the template is here:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/marianoguerra/rebar3_template_partisan"&gt;rebar3 partisan template&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What is partisan? from the docs:&lt;/p&gt;
&lt;pre class="literal-block"&gt;Partisan is the technology that provides Lasp's scalable cluster
membership. Partisan bypasses the use of Distributed Erlang for manual
connection management via TCP, and has several pluggable backends for
different deployment scenarios.&lt;/pre&gt;
&lt;p&gt;To use:&lt;/p&gt;
&lt;pre class="literal-block"&gt;mkdir -p ~/.config/rebar3/templates
git clone https://github.com/marianoguerra/rebar3_template_partisan.git ~/.config/rebar3/templates/rebar3_template_partisan
rebar3 new rebar3_template_partisan name=party
cd party
make release
make console&lt;/pre&gt;
&lt;p&gt;Clustering:&lt;/p&gt;
&lt;pre class="literal-block"&gt;make devrel

# on 3 different shells
make dev1-console
make dev2-console
make dev3-console

# join all nodes:
make devrel-join

# check node members
make devrel-status

# join node1 to node2 manually:
./_build/dev1/rel/party/bin/party-admin cluster join party2@127.0.0.1

# check node1 members
./_build/dev1/rel/party/bin/party-admin cluster members

# check node1 connections
./_build/dev1/rel/party/bin/party-admin cluster connections&lt;/pre&gt;
&lt;p&gt;A video to show how to use:&lt;/p&gt;
&lt;script type="text/javascript" src="https://asciinema.org/a/ULU5g8Dz4Gub1So389I8cKlZR.js" id="asciicast-ULU5g8Dz4Gub1So389I8cKlZR" async&gt;&lt;/script&gt;</description><category>erlang</category><category>partisan</category><category>rebar3</category><category>template</category><guid>http://marianoguerra.org/posts/rebar3-partisan-template/</guid><pubDate>Sat, 09 Dec 2017 23:16:11 GMT</pubDate></item><item><title>Let's build a key value store in erlang</title><link>http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;p&gt;The code for this post is at &lt;a class="reference external" href="https://github.com/marianoguerra/akvs"&gt;https://github.com/marianoguerra/akvs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We first need to have erlang installed, I will show you how to setup any version
you want to use, and a way to have the version I will use for this without
affecting any other installation you may have.&lt;/p&gt;
&lt;section id="setting-up-kerl"&gt;
&lt;h2&gt;Setting up kerl&lt;/h2&gt;
&lt;p&gt;For this we will use &lt;a class="reference external" href="https://github.com/kerl/kerl"&gt;kerl&lt;/a&gt;, from it's github README:&lt;/p&gt;
&lt;pre class="literal-block"&gt;Easy building and installing of Erlang/OTP instances.

Kerl aims to be shell agnostic and its only dependencies, excluding what's
required to actually build Erlang/OTP, are curl and git.&lt;/pre&gt;
&lt;p&gt;So, first we need to fetch kerl:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-1" name="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_5bf5148700fc456aaa1f9bb47504bd8a-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# create bin folder in our home directory if it's not already there&lt;/span&gt;
&lt;a id="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-2" name="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_5bf5148700fc456aaa1f9bb47504bd8a-2"&gt;&lt;/a&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/bin
&lt;a id="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-3" name="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-3" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_5bf5148700fc456aaa1f9bb47504bd8a-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-4" name="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-4" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_5bf5148700fc456aaa1f9bb47504bd8a-4"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# cd to it&lt;/span&gt;
&lt;a id="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-5" name="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-5" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_5bf5148700fc456aaa1f9bb47504bd8a-5"&gt;&lt;/a&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/bin
&lt;a id="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-6" name="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-6" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_5bf5148700fc456aaa1f9bb47504bd8a-6"&gt;&lt;/a&gt;
&lt;a id="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-7" name="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-7" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_5bf5148700fc456aaa1f9bb47504bd8a-7"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# download kerl script&lt;/span&gt;
&lt;a id="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-8" name="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-8" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_5bf5148700fc456aaa1f9bb47504bd8a-8"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;https://raw.githubusercontent.com/kerl/kerl/master/kerl
&lt;a id="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-9" name="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-9" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_5bf5148700fc456aaa1f9bb47504bd8a-9"&gt;&lt;/a&gt;
&lt;a id="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-10" name="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-10" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_5bf5148700fc456aaa1f9bb47504bd8a-10"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# set execution permitions for our user&lt;/span&gt;
&lt;a id="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-11" name="rest_code_5bf5148700fc456aaa1f9bb47504bd8a-11" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_5bf5148700fc456aaa1f9bb47504bd8a-11"&gt;&lt;/a&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;u+x&lt;span class="w"&gt; &lt;/span&gt;kerl
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You will need to add ~/bin to your PATH variable so your shell can find the
kerl script, you can do it like this in your shell:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-1" name="rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# set the PATH environment variable to the value it had before plus a colon&lt;/span&gt;
&lt;a id="rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-2" name="rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-2"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# (path separator) and a new path which points to the bin folder we just&lt;/span&gt;
&lt;a id="rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-3" name="rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-3" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-3"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# created&lt;/span&gt;
&lt;a id="rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-4" name="rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-4" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_3ba4b8de5c4f49f9a2306ab94529fe0d-4"&gt;&lt;/a&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:&lt;span class="nv"&gt;$HOME&lt;/span&gt;/bin
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you want to make this work every time you start a shell you need to put it
it the rc file of your shell of choice, for bash it's ~/.bashrc, for zsh it's
.zshrc, check your shell's docs for other shells, you will have to add a line like this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_8b9f6c371c59455c903563f99227adb1-1" name="rest_code_8b9f6c371c59455c903563f99227adb1-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_8b9f6c371c59455c903563f99227adb1-1"&gt;&lt;/a&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:&lt;span class="nv"&gt;$HOME&lt;/span&gt;/bin
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After this, start a new shell or source your rc file so that it picks up your
new PATH variable, you can check that it's set correctly by running:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_4bb64b54b2a2449ab4ab8ca0743c1124-1" name="rest_code_4bb64b54b2a2449ab4ab8ca0743c1124-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_4bb64b54b2a2449ab4ab8ca0743c1124-1"&gt;&lt;/a&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="building-an-erlang-release-with-kerl"&gt;
&lt;h2&gt;Building an Erlang release with kerl&lt;/h2&gt;
&lt;p&gt;We have kerl installed and available in our shell, now we need to build an
Erlang release of our choice, for this we will need a compiler and other
tools and libraries needed to compile it:&lt;/p&gt;
&lt;p&gt;This are instructions on ubuntu 17.10, check the names for those packages
on your distribution.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-1" name="rest_code_215443ae3a6c464785740fccccf646f3-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# required: basic tools and libraries needed&lt;/span&gt;
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-2" name="rest_code_215443ae3a6c464785740fccccf646f3-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-2"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# (compiler, curses for the shell, ssl for crypto)&lt;/span&gt;
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-3" name="rest_code_215443ae3a6c464785740fccccf646f3-3" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-3"&gt;&lt;/a&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;build-essential&lt;span class="w"&gt; &lt;/span&gt;m4&lt;span class="w"&gt; &lt;/span&gt;libncurses5-dev&lt;span class="w"&gt; &lt;/span&gt;libssl-dev
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-4" name="rest_code_215443ae3a6c464785740fccccf646f3-4" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-5" name="rest_code_215443ae3a6c464785740fccccf646f3-5" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-5"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# optonal: if you want odbc support (database connectivity)&lt;/span&gt;
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-6" name="rest_code_215443ae3a6c464785740fccccf646f3-6" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-6"&gt;&lt;/a&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;unixodbc-dev
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-7" name="rest_code_215443ae3a6c464785740fccccf646f3-7" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-8" name="rest_code_215443ae3a6c464785740fccccf646f3-8" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-8"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# optonal: if you want pdf docs you need apache fop and xslt tools and java (fop is a java project)&lt;/span&gt;
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-9" name="rest_code_215443ae3a6c464785740fccccf646f3-9" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-9"&gt;&lt;/a&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;fop&lt;span class="w"&gt; &lt;/span&gt;xsltproc&lt;span class="w"&gt; &lt;/span&gt;default-jdk
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-10" name="rest_code_215443ae3a6c464785740fccccf646f3-10" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-10"&gt;&lt;/a&gt;
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-11" name="rest_code_215443ae3a6c464785740fccccf646f3-11" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-11"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# optional: if you want to build jinterface you need a JDK&lt;/span&gt;
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-12" name="rest_code_215443ae3a6c464785740fccccf646f3-12" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-12"&gt;&lt;/a&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;default-jdk
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-13" name="rest_code_215443ae3a6c464785740fccccf646f3-13" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-13"&gt;&lt;/a&gt;
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-14" name="rest_code_215443ae3a6c464785740fccccf646f3-14" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-14"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# optional: if you want wx (desktop GUI modules)&lt;/span&gt;
&lt;a id="rest_code_215443ae3a6c464785740fccccf646f3-15" name="rest_code_215443ae3a6c464785740fccccf646f3-15" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_215443ae3a6c464785740fccccf646f3-15"&gt;&lt;/a&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;libwxgtk3.0-dev
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now that we have everything we need we can finally build our erlang release.&lt;/p&gt;
&lt;p&gt;First we fetch an updated list of releases:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_ae69663684af4ab2b4a333fd74181bbe-1" name="rest_code_ae69663684af4ab2b4a333fd74181bbe-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_ae69663684af4ab2b4a333fd74181bbe-1"&gt;&lt;/a&gt;kerl&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;releases
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output in my case:&lt;/p&gt;
&lt;pre class="literal-block"&gt;The available releases are:

R10B-0 R10B-10 R10B-1a R10B-2 R10B-3 R10B-4 R10B-5 R10B-6 R10B-7 R10B-8
R10B-9 R11B-0 R11B-1 R11B-2 R11B-3 R11B-4 R11B-5 R12B-0 R12B-1 R12B-2 R12B-3
R12B-4 R12B-5 R13A R13B01 R13B02-1 R13B02 R13B03 R13B04 R13B R14A R14B01
R14B02 R14B03 R14B04 R14B_erts-5.8.1.1 R14B R15B01 R15B02
R15B02_with_MSVCR100_installer_fix R15B03-1 R15B03 R15B
R16A_RELEASE_CANDIDATE R16B01 R16B02 R16B03-1 R16B03 R16B 17.0-rc1 17.0-rc2
17.0 17.1 17.3 17.4 17.5 18.0 18.1 18.2.1 18.2 18.3 19.0 19.1 19.2 19.3
20.0 20.1&lt;/pre&gt;
&lt;p&gt;Let's build the 20.1 version:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_b2d2cfb4b6a34850862daa32d40e0bf2-1" name="rest_code_b2d2cfb4b6a34850862daa32d40e0bf2-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_b2d2cfb4b6a34850862daa32d40e0bf2-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# this will take a while&lt;/span&gt;
&lt;a id="rest_code_b2d2cfb4b6a34850862daa32d40e0bf2-2" name="rest_code_b2d2cfb4b6a34850862daa32d40e0bf2-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_b2d2cfb4b6a34850862daa32d40e0bf2-2"&gt;&lt;/a&gt;kerl&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;.1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;.1
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And install it:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_fa5a170579ac476eb743572350fafaa6-1" name="rest_code_fa5a170579ac476eb743572350fafaa6-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_fa5a170579ac476eb743572350fafaa6-1"&gt;&lt;/a&gt;kerl&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;.1&lt;span class="w"&gt; &lt;/span&gt;~/bin/erl-20.1
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now everytime we want to use this version of erlang we need to run:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_19107d2deec843679b179ebc98058407-1" name="rest_code_19107d2deec843679b179ebc98058407-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_19107d2deec843679b179ebc98058407-1"&gt;&lt;/a&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/bin/erl-20.1/activate
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="setting-up-rebar3"&gt;
&lt;h2&gt;Setting up rebar3&lt;/h2&gt;
&lt;p&gt;Now we have erlang, we need a build tool, we are going to use &lt;a class="reference external" href="http://rebar3.org"&gt;rebar3&lt;/a&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_539d476a922c469ba33846683df10759-1" name="rest_code_539d476a922c469ba33846683df10759-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_539d476a922c469ba33846683df10759-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# download rebar3 to our bin directory&lt;/span&gt;
&lt;a id="rest_code_539d476a922c469ba33846683df10759-2" name="rest_code_539d476a922c469ba33846683df10759-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_539d476a922c469ba33846683df10759-2"&gt;&lt;/a&gt;wget&lt;span class="w"&gt; &lt;/span&gt;https://s3.amazonaws.com/rebar3/rebar3&lt;span class="w"&gt; &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/bin/rebar3
&lt;a id="rest_code_539d476a922c469ba33846683df10759-3" name="rest_code_539d476a922c469ba33846683df10759-3" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_539d476a922c469ba33846683df10759-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_539d476a922c469ba33846683df10759-4" name="rest_code_539d476a922c469ba33846683df10759-4" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_539d476a922c469ba33846683df10759-4"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# set execution permissions for our user&lt;/span&gt;
&lt;a id="rest_code_539d476a922c469ba33846683df10759-5" name="rest_code_539d476a922c469ba33846683df10759-5" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_539d476a922c469ba33846683df10759-5"&gt;&lt;/a&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;u+x&lt;span class="w"&gt; &lt;/span&gt;rebar3
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Just in case you have problems running the rebar3 commands with a different
version, here's the version I'm using:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_4625a9310f314728831eed0009a9825f-1" name="rest_code_4625a9310f314728831eed0009a9825f-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_4625a9310f314728831eed0009a9825f-1"&gt;&lt;/a&gt;rebar3&lt;span class="w"&gt; &lt;/span&gt;version
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre class="literal-block"&gt;rebar 3.4.7 on Erlang/OTP 20 Erts 9.1&lt;/pre&gt;
&lt;/section&gt;
&lt;section id="setting-up-our-project"&gt;
&lt;h2&gt;Setting up our project&lt;/h2&gt;
&lt;p&gt;We are ready to start our project, go to a folder where you keep your code and
if you haven't done it yet, add $HOME/bin to your path and activate erlang 20.1
as shown above, then run:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_677c550abf2541a9acf0a769876d8065-1" name="rest_code_677c550abf2541a9acf0a769876d8065-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_677c550abf2541a9acf0a769876d8065-1"&gt;&lt;/a&gt;rebar3&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;release&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;akvs
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output should be something like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;===&amp;gt; Writing akvs/apps/akvs/src/akvs_app.erl
===&amp;gt; Writing akvs/apps/akvs/src/akvs_sup.erl
===&amp;gt; Writing akvs/apps/akvs/src/akvs.app.src
===&amp;gt; Writing akvs/rebar.config
===&amp;gt; Writing akvs/config/sys.config
===&amp;gt; Writing akvs/config/vm.args
===&amp;gt; Writing akvs/.gitignore
===&amp;gt; Writing akvs/LICENSE
===&amp;gt; Writing akvs/README.md&lt;/pre&gt;
&lt;p&gt;Let's see what each file does:&lt;/p&gt;
&lt;p&gt;First of all, we created a release, which is a kind of project that can have
more than one application (a common way to structure a project is into applications
and libraries)&lt;/p&gt;
&lt;p&gt;Under the apps folder are all the applications we mantain for this release,
in our case we only have one application, named akvc.&lt;/p&gt;
&lt;p&gt;Under the akvs application folder we have a src folder where all the source code
for that application will live, we can add other folders there, for tests, header files, private files etc.&lt;/p&gt;
&lt;p&gt;apps/akvs/src/akvs_app.erl&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The $APPNAME_app module is called when starting and stopping the app to do
the setup and tear down of the application.&lt;/p&gt;
&lt;p&gt;Check Erlang's &lt;a class="reference external" href="http://erlang.org/doc/man/application.html"&gt;manual for application&lt;/a&gt; or the &lt;a class="reference external" href="http://erlang.org/doc/design_principles/applications.html"&gt;user's guide entry for application&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;apps/akvs/src/akvs_sup.erl&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The $APPNAME_sup module defines the root supervisor for the application, it
implements the supervisor behavior and will be "hooked" into the supervisor
hierarchy of this release when initialized.&lt;/p&gt;
&lt;p&gt;Check Erlang's &lt;a class="reference external" href="http://erlang.org/doc/man/supervisor.html"&gt;manual for supervisor&lt;/a&gt; or the &lt;a class="reference external" href="http://erlang.org/doc/design_principles/sup_princ.html"&gt;user's guide entry for supervisor&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;apps/akvs/src/akvs.app.src&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The $APPNANE.app.src is a file that contains metadata about this app.&lt;/p&gt;
&lt;p&gt;Check ERlang's &lt;a class="reference external" href="http://erlang.org/doc/man/app.html"&gt;manual for application resource file&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;rebar.config&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Contains information about the project, dependencies, how to build it,
test it, and how to build a release.&lt;/p&gt;
&lt;p&gt;Check &lt;a class="reference external" href="http://www.rebar3.org/docs"&gt;rebar3 docs&lt;/a&gt; for details.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;config/sys.config&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Configuration parameters for the application.&lt;/p&gt;
&lt;p&gt;Check &lt;a class="reference external" href="http://erlang.org/doc/man/config.html"&gt;sys.config's manual page&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;config/vm.args&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Configuration parameters for the Erlang VM.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;.gitignore&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Git specific, files to ignore.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;LICENSE&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The license for this project, you should change it if the Apache License 2.0
isn't the one you want.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;README.md&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Project's readme.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="starting-it-for-the-first-time"&gt;
&lt;h2&gt;Starting it for the first time&lt;/h2&gt;
&lt;p&gt;First we need to build a release:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_91f2ef44244d4936b164ceee16021eb4-1" name="rest_code_91f2ef44244d4936b164ceee16021eb4-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_91f2ef44244d4936b164ceee16021eb4-1"&gt;&lt;/a&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;akvs
&lt;a id="rest_code_91f2ef44244d4936b164ceee16021eb4-2" name="rest_code_91f2ef44244d4936b164ceee16021eb4-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_91f2ef44244d4936b164ceee16021eb4-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_91f2ef44244d4936b164ceee16021eb4-3" name="rest_code_91f2ef44244d4936b164ceee16021eb4-3" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_91f2ef44244d4936b164ceee16021eb4-3"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# build a release, the result will be at _build/default/rel/akvs&lt;/span&gt;
&lt;a id="rest_code_91f2ef44244d4936b164ceee16021eb4-4" name="rest_code_91f2ef44244d4936b164ceee16021eb4-4" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_91f2ef44244d4936b164ceee16021eb4-4"&gt;&lt;/a&gt;rebar3&lt;span class="w"&gt; &lt;/span&gt;release
&lt;a id="rest_code_91f2ef44244d4936b164ceee16021eb4-5" name="rest_code_91f2ef44244d4936b164ceee16021eb4-5" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_91f2ef44244d4936b164ceee16021eb4-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_91f2ef44244d4936b164ceee16021eb4-6" name="rest_code_91f2ef44244d4936b164ceee16021eb4-6" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_91f2ef44244d4936b164ceee16021eb4-6"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# start the release and attach to the console&lt;/span&gt;
&lt;a id="rest_code_91f2ef44244d4936b164ceee16021eb4-7" name="rest_code_91f2ef44244d4936b164ceee16021eb4-7" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_91f2ef44244d4936b164ceee16021eb4-7"&gt;&lt;/a&gt;./_build/default/rel/akvs/bin/akvs&lt;span class="w"&gt; &lt;/span&gt;console
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output in my case is (redacted for clarity):&lt;/p&gt;
&lt;pre class="literal-block"&gt;Exec: bin/erl-20.1/erts-9.1/bin/erlexec
         -boot src/erl/akvs/_build/default/rel/akvs/releases/0.1.0/akvs
         -mode embedded -boot_var ERTS_LIB_DIR bin/erl-20.1/lib
         -config src/erl/akvs/_build/default/rel/akvs/releases/0.1.0/sys.config
         -args_file src/erl/akvs/_build/default/rel/akvs/releases/0.1.0/vm.args
         -pa -- console

Root: src/erl/akvs/_build/default/rel/akvs
src/erl/akvs/_build/default/rel/akvs

Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:4:4] [ds:4:4:10]
                          [async-threads:30] [kernel-poll:true]


=PROGRESS REPORT==== 25-Nov-2017::22:28:34 ===
                  supervisor: {local,sasl_safe_sup}
                         started: [{pid,&amp;lt;0.225.0&amp;gt;},
                                           {id,alarm_handler},
                                           {mfargs,{alarm_handler,start_link,[]}},
                                           {restart_type,permanent},
                                           {shutdown,2000},
                                           {child_type,worker}]

=PROGRESS REPORT==== 25-Nov-2017::22:28:34 ===
                  supervisor: {local,sasl_sup}
                         started: [{pid,&amp;lt;0.224.0&amp;gt;},
                                           {id,sasl_safe_sup},
                                           {mfargs,
                                                   {supervisor,start_link,
                                                           [{local,sasl_safe_sup},sasl,safe]}},
                                           {restart_type,permanent},
                                           {shutdown,infinity},
                                           {child_type,supervisor}]

=PROGRESS REPORT==== 25-Nov-2017::22:28:34 ===
                  supervisor: {local,sasl_sup}
                         started: [{pid,&amp;lt;0.226.0&amp;gt;},
                                           {id,release_handler},
                                           {mfargs,{release_handler,start_link,[]}},
                                           {restart_type,permanent},
                                           {shutdown,2000},
                                           {child_type,worker}]

=PROGRESS REPORT==== 25-Nov-2017::22:28:34 ===
                 application: sasl
                  started_at: akvs@ganesha
Eshell V9.1  (abort with ^G)
(akvs@ganesha)1&amp;gt;&lt;/pre&gt;
&lt;p&gt;There's not much we can do with our project at this stage, so we will just stop
it and exit by running the &lt;cite&gt;q().&lt;/cite&gt; function in the shell:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_dc35bcc1830e496d9c21e1b2c036bd78-1" name="rest_code_dc35bcc1830e496d9c21e1b2c036bd78-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_dc35bcc1830e496d9c21e1b2c036bd78-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;akvs&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;ganesha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_dc35bcc1830e496d9c21e1b2c036bd78-2" name="rest_code_dc35bcc1830e496d9c21e1b2c036bd78-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_dc35bcc1830e496d9c21e1b2c036bd78-2"&gt;&lt;/a&gt;&lt;span class="n"&gt;ok&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="coding-and-testing-the-key-value-store-modules"&gt;
&lt;h2&gt;Coding (and testing) the Key Value store modules&lt;/h2&gt;
&lt;p&gt;The way I usually code in erlang is to first build a stateless module that has
an init function that returns some state, all other functions expect that state
as first parameter, then those functions do something and return the state and
the result.&lt;/p&gt;
&lt;p&gt;This modules are really easy to use in the shell and test.&lt;/p&gt;
&lt;p&gt;This will be our first module, we will call it akvs_kv and it will have the
following API:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-1" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-1"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% types:&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-2" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-3" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-3" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;atom&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iolist&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;()}}.&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-4" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-4" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-4"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-5" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-5" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-5"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-6" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-6" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-6"&gt;&lt;/a&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-7" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-7" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-7"&gt;&lt;/a&gt;&lt;span class="c"&gt;% we don't want other modules to know/care about the internal structure of&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-8" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-8" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-8"&gt;&lt;/a&gt;&lt;span class="c"&gt;% the state type&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-9" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-9" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-9"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;opaque&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-10" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-10" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-10"&gt;&lt;/a&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-11" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-11" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-11"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% functions:&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-12" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-12" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-12"&gt;&lt;/a&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-13" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-13" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-13"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% @doc create a new instance of a key value store&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-14" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-14" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-14"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-15" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-15" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-15"&gt;&lt;/a&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-16" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-16" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-16"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% @doc dispose resources associated with a previously created kv store&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-17" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-17" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-17"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-18" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-18" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-18"&gt;&lt;/a&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-19" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-19" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-19"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% @doc set a value for a key in a kv store&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-20" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-20" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-20"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-21" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-21" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-21"&gt;&lt;/a&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-22" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-22" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-22"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% @doc get a value for a key or an error if not found&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-23" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-23" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-23"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-24" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-24" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-24"&gt;&lt;/a&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-25" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-25" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-25"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% @doc get a value for a key or a default value if not found&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-26" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-26" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-26"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-27" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-27" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-27"&gt;&lt;/a&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-28" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-28" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-28"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% @doc remove a value for a key, if not found do nothing&lt;/span&gt;
&lt;a id="rest_code_a30e36c42e08436c8721ec9f267fdc52-29" name="rest_code_a30e36c42e08436c8721ec9f267fdc52-29" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a30e36c42e08436c8721ec9f267fdc52-29"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;del&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Notice that to specify the API I used a specification of the types and functions,
this is called spec, read more about it at the &lt;a class="reference external" href="http://erlang.org/doc/reference_manual/typespec.html"&gt;Types and Function Specifications sectio in the erlang reference manual&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also for documentation comments I'm using the edoc format, read more about it at the &lt;a class="reference external" href="http://erlang.org/doc/apps/edoc/chapter.html"&gt;edoc user's guide section&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can see the full code of this module here: &lt;a class="reference external" href="https://github.com/marianoguerra/akvs/blob/77188c096275aa1df9b519e55a08fd57fcfeedc3/apps/akvs/src/akvs_kv.erl"&gt;akvs_kv&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But how do we know if it works?&lt;/p&gt;
&lt;p&gt;At this point there are two ways: testing it in the shell, or writing tests for
it, let's do the right thing and write some tests.&lt;/p&gt;
&lt;p&gt;We are going to use &lt;a class="reference external" href="http://erlang.org/doc/apps/common_test/introduction.html"&gt;Common Test&lt;/a&gt; for our tests.&lt;/p&gt;
&lt;p&gt;First we need to create the test folder for our tests:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_cbd051f4a48c4b288859ae15e086a0e4-1" name="rest_code_cbd051f4a48c4b288859ae15e086a0e4-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_cbd051f4a48c4b288859ae15e086a0e4-1"&gt;&lt;/a&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;apps/akvs/test
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Inside it we will create a module called akvs_kv_SUITE that will contain the
tests for the akvs_kv module.&lt;/p&gt;
&lt;p&gt;You can see the full code of this module here: &lt;a class="reference external" href="https://github.com/marianoguerra/akvs/blob/77188c096275aa1df9b519e55a08fd57fcfeedc3/apps/akvs/test/akvs_kv_SUITE.erl"&gt;akvs_kv_SUITE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To run the tests:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_bc9d8083db674c6f9eff64d51fae1f07-1" name="rest_code_bc9d8083db674c6f9eff64d51fae1f07-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_bc9d8083db674c6f9eff64d51fae1f07-1"&gt;&lt;/a&gt;rebar3&lt;span class="w"&gt; &lt;/span&gt;ct
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can also use the type specs we defined to check our code using &lt;a class="reference external" href="http://erlang.org/doc/apps/dialyzer/dialyzer_chapter.html"&gt;dialyzer&lt;/a&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_cb877ee119d04642a5097a986f3638cc-1" name="rest_code_cb877ee119d04642a5097a986f3638cc-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_cb877ee119d04642a5097a986f3638cc-1"&gt;&lt;/a&gt;rebar3&lt;span class="w"&gt; &lt;/span&gt;dialyzer
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Everything seems to be right, let's move on to the next step.&lt;/p&gt;
&lt;p&gt;But before that, in case you want to generate API docs for our code taking advantage
of the edoc annotations, you can do so by running:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_2c0e443381264935af630a60f0982f01-1" name="rest_code_2c0e443381264935af630a60f0982f01-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_2c0e443381264935af630a60f0982f01-1"&gt;&lt;/a&gt;rebar3&lt;span class="w"&gt; &lt;/span&gt;edoc
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And opening apps/akvs/doc/index.html with a browser.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="wrapping-the-state"&gt;
&lt;h2&gt;Wrapping the state&lt;/h2&gt;
&lt;p&gt;Stateless modules are a good start and are really easy to test and use, but we
don't want to pass the burden of threading the state to the users of our code,
also we want to centralize the state management so that more than one process
can call our module and see the state changes of other callers.&lt;/p&gt;
&lt;p&gt;In this case we are using ETS to make it simpler but if our kv was backed by a
map, or if we had some kind of cache, then state management would become really
important to get right, otherwise the results seen by each caller would
diverge.&lt;/p&gt;
&lt;p&gt;To manage the state of our module we are going to wrap it in a process, a &lt;a class="reference external" href="http://erlang.org/doc/man/gen_server.html"&gt;gen_server&lt;/a&gt; in this case.&lt;/p&gt;
&lt;p&gt;The module will be called akvs_kv_s (_s for server, don't know if there's a
convention for it).&lt;/p&gt;
&lt;p&gt;The module is a basic gen_server that exposes a couple functions to call
the kv API from the akvs_kv module, you can read the code here: &lt;a class="reference external" href="https://github.com/marianoguerra/akvs/blob/82b10a423b587a52c890a56cbfc90d24ebe5e6f0/apps/akvs/src/akvs_kv_s.erl"&gt;akvs_kv_s&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We write tests for this module too, you can read the test's code here: &lt;a class="reference external" href="https://github.com/marianoguerra/akvs/blob/82b10a423b587a52c890a56cbfc90d24ebe5e6f0/apps/akvs/test/akvs_kv_s_SUITE.erl"&gt;akvs_kv_s_SUITE&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Run the tests:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_791a414b678c4641b9807291babf579c-1" name="rest_code_791a414b678c4641b9807291babf579c-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_791a414b678c4641b9807291babf579c-1"&gt;&lt;/a&gt;rebar3&lt;span class="w"&gt; &lt;/span&gt;ct
&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section id="an-api-for-our-key-value-stores"&gt;
&lt;h2&gt;An API for our key value stores&lt;/h2&gt;
&lt;p&gt;Now we can spawn a key value store in a gen_server and apply operations to it,
but like with the stateless module, someone has to keep a reference to the
process and provide a nicer way to find and operate on our key value stores, if
it was only one it's easy to just start it as a registered process with a name
and send messages to it by it's name, but in our case, we want to provide
namespaces where each namespace holds a key value store of its own.&lt;/p&gt;
&lt;p&gt;The abstract API or this module should be like this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-1" name="rest_code_917593c7e2b845fba341c763ba6c8228-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ns&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-2" name="rest_code_917593c7e2b845fba341c763ba6c8228-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-2"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;akvs_kv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;key&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-3" name="rest_code_917593c7e2b845fba341c763ba6c8228-3" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-3"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;akvs_kv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-4" name="rest_code_917593c7e2b845fba341c763ba6c8228-4" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-4"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;akvs_kv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-5" name="rest_code_917593c7e2b845fba341c763ba6c8228-5" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-6" name="rest_code_917593c7e2b845fba341c763ba6c8228-6" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-6"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% @doc set Key to Value in namespace Ns&lt;/span&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-7" name="rest_code_917593c7e2b845fba341c763ba6c8228-7" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-7"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ns&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-8" name="rest_code_917593c7e2b845fba341c763ba6c8228-8" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-9" name="rest_code_917593c7e2b845fba341c763ba6c8228-9" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-9"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% @doc get Key from namespace Ns&lt;/span&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-10" name="rest_code_917593c7e2b845fba341c763ba6c8228-10" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-10"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ns&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-11" name="rest_code_917593c7e2b845fba341c763ba6c8228-11" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-11"&gt;&lt;/a&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-12" name="rest_code_917593c7e2b845fba341c763ba6c8228-12" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-12"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% @doc get Key from namespace Ns or DefaultValue if Key not found&lt;/span&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-13" name="rest_code_917593c7e2b845fba341c763ba6c8228-13" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-13"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ns&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-14" name="rest_code_917593c7e2b845fba341c763ba6c8228-14" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-14"&gt;&lt;/a&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-15" name="rest_code_917593c7e2b845fba341c763ba6c8228-15" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-15"&gt;&lt;/a&gt;&lt;span class="c"&gt;%% @doc delete  Key in namespace Ns&lt;/span&gt;
&lt;a id="rest_code_917593c7e2b845fba341c763ba6c8228-16" name="rest_code_917593c7e2b845fba341c763ba6c8228-16" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_917593c7e2b845fba341c763ba6c8228-16"&gt;&lt;/a&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="ni"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;del&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ns&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Right now we are going to solve the problem of who keeps the namespace to
process mapping really simple so we can continue, we are going to setup a
public ETS table at application startup and lookup the processes by namespace
there, if not found we are going to start the process and register it under
that namespace.&lt;/p&gt;
&lt;p&gt;This solution is not recommendable at all but it will allow us to continue and
since the API doesn't know a thing about the way we register/lookup namespaces
we can explore different alternatives later.&lt;/p&gt;
&lt;p&gt;You can view the source code for akvs module here: &lt;a class="reference external" href="https://github.com/marianoguerra/akvs/blob/c6a8c4ae5d28610f153d13515994f4456209c232/apps/akvs/src/akvs.erl"&gt;akvs&lt;/a&gt; and the tests here &lt;a class="reference external" href="https://github.com/marianoguerra/akvs/blob/c6a8c4ae5d28610f153d13515994f4456209c232/apps/akvs/test/akvs_SUITE.erl"&gt;akvs_SUITE&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="an-http-api-for-our-key-value-stores"&gt;
&lt;h2&gt;An HTTP API for our key value stores&lt;/h2&gt;
&lt;p&gt;We are at the point where we can expose our APIs to the world, we are going to
do it by exposing a really basic HTTP API for it.&lt;/p&gt;
&lt;p&gt;The API will look like this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-1" name="rest_code_c94bfc18fdee48de8b561163f538837c-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-1"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# set key in namespace to the binary value sent in body&lt;/span&gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-2" name="rest_code_c94bfc18fdee48de8b561163f538837c-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-2"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# return status: 201&lt;/span&gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-3" name="rest_code_c94bfc18fdee48de8b561163f538837c-3" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-3"&gt;&lt;/a&gt;POST&lt;span class="w"&gt; &lt;/span&gt;/kv/&amp;lt;namespace&amp;gt;/&amp;lt;key&amp;gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-4" name="rest_code_c94bfc18fdee48de8b561163f538837c-4" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-4"&gt;&lt;/a&gt;&amp;lt;body&amp;gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-5" name="rest_code_c94bfc18fdee48de8b561163f538837c-5" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-6" name="rest_code_c94bfc18fdee48de8b561163f538837c-6" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-6"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# get key in namespace&lt;/span&gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-7" name="rest_code_c94bfc18fdee48de8b561163f538837c-7" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-7"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# return status:&lt;/span&gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-8" name="rest_code_c94bfc18fdee48de8b561163f538837c-8" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-8"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#  200: if found&lt;/span&gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-9" name="rest_code_c94bfc18fdee48de8b561163f538837c-9" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-9"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#  404: if not found&lt;/span&gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-10" name="rest_code_c94bfc18fdee48de8b561163f538837c-10" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-10"&gt;&lt;/a&gt;GET&lt;span class="w"&gt; &lt;/span&gt;/kv/&amp;lt;namespace&amp;gt;/&amp;lt;key&amp;gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-11" name="rest_code_c94bfc18fdee48de8b561163f538837c-11" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-11"&gt;&lt;/a&gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-12" name="rest_code_c94bfc18fdee48de8b561163f538837c-12" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-12"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# delete key from namespace&lt;/span&gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-13" name="rest_code_c94bfc18fdee48de8b561163f538837c-13" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-13"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# return status: 200&lt;/span&gt;
&lt;a id="rest_code_c94bfc18fdee48de8b561163f538837c-14" name="rest_code_c94bfc18fdee48de8b561163f538837c-14" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_c94bfc18fdee48de8b561163f538837c-14"&gt;&lt;/a&gt;DELETE&lt;span class="w"&gt; &lt;/span&gt;/kv/&amp;lt;namespace&amp;gt;/&amp;lt;key&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To create an HTTP API we need an HTTP server, in this case we will use &lt;a class="reference external" href="https://ninenines.eu/docs/en/cowboy/2.1/guide/"&gt;Cowboy 2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First we need to &lt;a class="reference external" href="https://github.com/marianoguerra/akvs/commit/c6a8c4ae5d28610f153d13515994f4456209c232#diff-31d7a50c99c265ca2793c20961b60979L1"&gt;add it as a dependency in our rebar.config file in the deps
section and in the release dependencies section&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then we need to &lt;a class="reference external" href="https://github.com/marianoguerra/akvs/blob/c6a8c4ae5d28610f153d13515994f4456209c232/apps/akvs/src/akvs_app.erl#L30"&gt;setup the routes in our application initialization code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are going to have only one route and handler, we are going to use a basic
HTTP to keep it simple, you can read the handler's code here: &lt;a class="reference external" href="https://github.com/marianoguerra/akvs/blob/c6a8c4ae5d28610f153d13515994f4456209c232/apps/akvs/src/akvs_h_kv.erl"&gt;akvs_h_kv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now we can test it by building a release, starting it and playing with the API using curl:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_91dc6170063c46f7b73e9f13ef88f1a6-1" name="rest_code_91dc6170063c46f7b73e9f13ef88f1a6-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_91dc6170063c46f7b73e9f13ef88f1a6-1"&gt;&lt;/a&gt;rebar3&lt;span class="w"&gt; &lt;/span&gt;release
&lt;a id="rest_code_91dc6170063c46f7b73e9f13ef88f1a6-2" name="rest_code_91dc6170063c46f7b73e9f13ef88f1a6-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_91dc6170063c46f7b73e9f13ef88f1a6-2"&gt;&lt;/a&gt;_build/default/rel/akvs/bin/akvs&lt;span class="w"&gt; &lt;/span&gt;console
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In another shell:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-1" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-2" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-2"&gt;&lt;/a&gt;Not&lt;span class="w"&gt; &lt;/span&gt;Found
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-3" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-3" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-4" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-4" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-4"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;POST&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hello world"&lt;/span&gt;
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-5" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-5" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-5"&gt;&lt;/a&gt;Created
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-6" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-6" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-6"&gt;&lt;/a&gt;
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-7" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-7" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-7"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-8" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-8" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-8"&gt;&lt;/a&gt;hello&lt;span class="w"&gt; &lt;/span&gt;world
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-9" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-9" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-9"&gt;&lt;/a&gt;
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-10" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-10" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-10"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;DELETE&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-11" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-11" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-11"&gt;&lt;/a&gt;OK
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-12" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-12" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-12"&gt;&lt;/a&gt;
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-13" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-13" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-13"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-14" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-14" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-14"&gt;&lt;/a&gt;Not&lt;span class="w"&gt; &lt;/span&gt;Found
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-15" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-15" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-15"&gt;&lt;/a&gt;
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-16" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-16" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-16"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;PUT&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hello world"&lt;/span&gt;
&lt;a id="rest_code_6e74d3c78c1a459b90443aa8506c3437-17" name="rest_code_6e74d3c78c1a459b90443aa8506c3437-17" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_6e74d3c78c1a459b90443aa8506c3437-17"&gt;&lt;/a&gt;Method&lt;span class="w"&gt; &lt;/span&gt;Not&lt;span class="w"&gt; &lt;/span&gt;Allowed
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Seems to work fine.&lt;/p&gt;
&lt;p&gt;Now we can build a production release and try it:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_1fbcedf744a64eb99ca544990845c3ea-1" name="rest_code_1fbcedf744a64eb99ca544990845c3ea-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_1fbcedf744a64eb99ca544990845c3ea-1"&gt;&lt;/a&gt;rebar3&lt;span class="w"&gt; &lt;/span&gt;as&lt;span class="w"&gt; &lt;/span&gt;prod&lt;span class="w"&gt; &lt;/span&gt;release
&lt;a id="rest_code_1fbcedf744a64eb99ca544990845c3ea-2" name="rest_code_1fbcedf744a64eb99ca544990845c3ea-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_1fbcedf744a64eb99ca544990845c3ea-2"&gt;&lt;/a&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;_build/prod/rel
&lt;a id="rest_code_1fbcedf744a64eb99ca544990845c3ea-3" name="rest_code_1fbcedf744a64eb99ca544990845c3ea-3" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_1fbcedf744a64eb99ca544990845c3ea-3"&gt;&lt;/a&gt;tar&lt;span class="w"&gt; &lt;/span&gt;-czf&lt;span class="w"&gt; &lt;/span&gt;akvs.tar.gz&lt;span class="w"&gt; &lt;/span&gt;akvs
&lt;a id="rest_code_1fbcedf744a64eb99ca544990845c3ea-4" name="rest_code_1fbcedf744a64eb99ca544990845c3ea-4" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_1fbcedf744a64eb99ca544990845c3ea-4"&gt;&lt;/a&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-
&lt;a id="rest_code_1fbcedf744a64eb99ca544990845c3ea-5" name="rest_code_1fbcedf744a64eb99ca544990845c3ea-5" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_1fbcedf744a64eb99ca544990845c3ea-5"&gt;&lt;/a&gt;mv&lt;span class="w"&gt; &lt;/span&gt;_build/prod/rel/akvs.tar.gz&lt;span class="w"&gt; &lt;/span&gt;/tmp
&lt;a id="rest_code_1fbcedf744a64eb99ca544990845c3ea-6" name="rest_code_1fbcedf744a64eb99ca544990845c3ea-6" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_1fbcedf744a64eb99ca544990845c3ea-6"&gt;&lt;/a&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp
&lt;a id="rest_code_1fbcedf744a64eb99ca544990845c3ea-7" name="rest_code_1fbcedf744a64eb99ca544990845c3ea-7" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_1fbcedf744a64eb99ca544990845c3ea-7"&gt;&lt;/a&gt;tar&lt;span class="w"&gt; &lt;/span&gt;-xzf&lt;span class="w"&gt; &lt;/span&gt;akvs.tar.gz
&lt;a id="rest_code_1fbcedf744a64eb99ca544990845c3ea-8" name="rest_code_1fbcedf744a64eb99ca544990845c3ea-8" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_1fbcedf744a64eb99ca544990845c3ea-8"&gt;&lt;/a&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;akvs
&lt;a id="rest_code_1fbcedf744a64eb99ca544990845c3ea-9" name="rest_code_1fbcedf744a64eb99ca544990845c3ea-9" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_1fbcedf744a64eb99ca544990845c3ea-9"&gt;&lt;/a&gt;./bin/akvs&lt;span class="w"&gt; &lt;/span&gt;start
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The application is started, you can check it's running by pinging it:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_a24f52856a3c4d58beb62a70b4f906d4-1" name="rest_code_a24f52856a3c4d58beb62a70b4f906d4-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_a24f52856a3c4d58beb62a70b4f906d4-1"&gt;&lt;/a&gt;./bin/akvs&lt;span class="w"&gt; &lt;/span&gt;ping
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In case you need, you can attach to it (you should exit with Ctrl+D, using q()
won't only detach your console but also stop the system!):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_cec2083aa96a416c9b8ae48f409921cf-1" name="rest_code_cec2083aa96a416c9b8ae48f409921cf-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_cec2083aa96a416c9b8ae48f409921cf-1"&gt;&lt;/a&gt;./bin/akvs&lt;span class="w"&gt; &lt;/span&gt;attach
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can try it again:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_579b2cd4ffec4e46a62318ff69915a11-1" name="rest_code_579b2cd4ffec4e46a62318ff69915a11-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_579b2cd4ffec4e46a62318ff69915a11-1"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar
&lt;a id="rest_code_579b2cd4ffec4e46a62318ff69915a11-2" name="rest_code_579b2cd4ffec4e46a62318ff69915a11-2" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_579b2cd4ffec4e46a62318ff69915a11-2"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;POST&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hello world"&lt;/span&gt;
&lt;a id="rest_code_579b2cd4ffec4e46a62318ff69915a11-3" name="rest_code_579b2cd4ffec4e46a62318ff69915a11-3" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_579b2cd4ffec4e46a62318ff69915a11-3"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar
&lt;a id="rest_code_579b2cd4ffec4e46a62318ff69915a11-4" name="rest_code_579b2cd4ffec4e46a62318ff69915a11-4" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_579b2cd4ffec4e46a62318ff69915a11-4"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;DELETE&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar
&lt;a id="rest_code_579b2cd4ffec4e46a62318ff69915a11-5" name="rest_code_579b2cd4ffec4e46a62318ff69915a11-5" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_579b2cd4ffec4e46a62318ff69915a11-5"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar
&lt;a id="rest_code_579b2cd4ffec4e46a62318ff69915a11-6" name="rest_code_579b2cd4ffec4e46a62318ff69915a11-6" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_579b2cd4ffec4e46a62318ff69915a11-6"&gt;&lt;/a&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;PUT&lt;span class="w"&gt; &lt;/span&gt;http://localhost:8080/kv/foo/bar&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hello world"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When you are finished, you can stop it:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_ad3e8feed8c144a4aa33453e19412575-1" name="rest_code_ad3e8feed8c144a4aa33453e19412575-1" href="http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/#rest_code_ad3e8feed8c144a4aa33453e19412575-1"&gt;&lt;/a&gt;./bin/akvs&lt;span class="w"&gt; &lt;/span&gt;stop
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now you can upload akvs.tar.gz to any bare server and start akvs there, as long
as the operating system is similar (better if the same) as the one where you
built the release, this is because when building the release we bundle the
erlang runtime for simplicity, this assumes specific versions of libraries like
libssl which may not be available on the target system if it's too different.&lt;/p&gt;
&lt;p&gt;Another way is to build the release without bundling the erlang runtime and
having it available on the target system, just make sure that the erlang
runtime in the target system has the same version you used to build it,
otherwise you may experience errors due to modules/functions not being
available or bytecode incompatibility if the target runtime is older than the
one used for the release.&lt;/p&gt;
&lt;/section&gt;</description><category>erlang</category><guid>http://marianoguerra.org/posts/lets-build-a-key-value-store-in-erlang/</guid><pubDate>Sun, 26 Nov 2017 02:04:25 GMT</pubDate></item><item><title>Multi-Paxos with riak_ensemble Part 2</title><link>http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;p&gt;In the &lt;a class="reference external" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-1/"&gt;previous post&lt;/a&gt; I showed how to use riak_ensemble from the interactive
shell, now I will show how to use rebar3 to use riak_ensemble from a real
project.&lt;/p&gt;
&lt;p&gt;This post assumes that you have erlang and rebar3 installed, I'm using erlang
19.3 and rebar3 3.4.3.&lt;/p&gt;
&lt;p&gt;The source code for this post is at &lt;a class="reference external" href="https://github.com/marianoguerra/cadena"&gt;https://github.com/marianoguerra/cadena&lt;/a&gt;
check the commits for the steps.&lt;/p&gt;
&lt;section id="create-project"&gt;
&lt;h2&gt;Create Project&lt;/h2&gt;
&lt;pre class="literal-block"&gt;rebar3 new app name=cadena
cd cadena&lt;/pre&gt;
&lt;p&gt;The project structure should look like this:&lt;/p&gt;
&lt;pre class="literal-block"&gt;.
├── LICENSE
├── README.md
├── rebar.config
└── src
        ├── cadena_app.erl
        ├── cadena.app.src
        └── cadena_sup.erl

1 directory, 6 files&lt;/pre&gt;
&lt;/section&gt;
&lt;section id="configuring-dev-release"&gt;
&lt;h2&gt;Configuring Dev Release&lt;/h2&gt;
&lt;p&gt;We do the following steps, check the links for comments on what's going on for
each step:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/75f04bd2787e45d407d3ff6f64d09040fee6b3e1/rebar.config#L6"&gt;Add Dependencies&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/75f04bd2787e45d407d3ff6f64d09040fee6b3e1/rebar.config#L12"&gt;Configure relx section&lt;/a&gt;&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;Add overlay variables file &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/75f04bd2787e45d407d3ff6f64d09040fee6b3e1/config/vars.config"&gt;vars.config&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/75f04bd2787e45d407d3ff6f64d09040fee6b3e1/config/sys.config"&gt;sys.config&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/75f04bd2787e45d407d3ff6f64d09040fee6b3e1/config/vm.args"&gt;vm.args&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Build a release to test that everything is setup correctly:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ rebar3 release&lt;/pre&gt;
&lt;p&gt;Run the release interactively with a console:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ _build/default/rel/cadena/bin/cadena console&lt;/pre&gt;
&lt;p&gt;Output (edited and paths redacted for clarity):&lt;/p&gt;
&lt;pre class="literal-block"&gt;Exec: erlexec
        -boot _build/default/rel/cadena/releases/0.1.0/cadena
        -boot_var ERTS_LIB_DIR erts-8.3/../lib
        -mode embedded
        -config    _build/default/rel/cadena/generated.conf/app.1.config
        -args_file _build/default/rel/cadena/generated.conf/vm.1.args
        -vm_args   _build/default/rel/cadena/generated.conf/vm.1.args
        -- console

Root: _build/default/rel/cadena
Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:4:4] [async-threads:64]
                      [kernel-poll:true]

18:31:12.150 [info] Application lager started on node 'cadena@127.0.0.1'
18:31:12.151 [info] Application cadena started on node 'cadena@127.0.0.1'
Eshell V8.3  (abort with ^G)
(cadena@127.0.0.1)1&amp;gt;&lt;/pre&gt;
&lt;p&gt;Quit:&lt;/p&gt;
&lt;pre class="literal-block"&gt;(cadena@127.0.0.1)1&amp;gt; q().
ok&lt;/pre&gt;
&lt;p&gt;Non interactive start:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ _build/default/rel/cadena/bin/cadena start&lt;/pre&gt;
&lt;p&gt;No output is generated if it's started, we can check if it's running by pinging
the application:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ _build/default/rel/cadena/bin/cadena ping&lt;/pre&gt;
&lt;p&gt;We should get:&lt;/p&gt;
&lt;pre class="literal-block"&gt;pong&lt;/pre&gt;
&lt;p&gt;If we want we can attach a console to the running system:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ _build/default/rel/cadena/bin/cadena attach&lt;/pre&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre class="literal-block"&gt;Attaching to /tmp/erl_pipes/cadena@127.0.0.1/erlang.pipe.1 (^D to exit)

(cadena@127.0.0.1)1&amp;gt;&lt;/pre&gt;
&lt;p&gt;If we press Ctrl+d we can dettach the console without stopping the system:&lt;/p&gt;
&lt;pre class="literal-block"&gt;(cadena@127.0.0.1)1&amp;gt; [Quit]&lt;/pre&gt;
&lt;p&gt;We can stop the system whenever we want issuing the stop command:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ _build/default/rel/cadena/bin/cadena stop&lt;/pre&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre class="literal-block"&gt;ok&lt;/pre&gt;
&lt;aside class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;Use Ctrl+d to exit, if we write &lt;cite&gt;q().&lt;/cite&gt; not only we dettach the
console but we also stop the system!&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;Let's try it.&lt;/p&gt;
&lt;p&gt;Non interactive start:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ _build/default/rel/cadena/bin/cadena start&lt;/pre&gt;
&lt;p&gt;No output is generated if it's started, we can check if it's running by pinging
the application:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ _build/default/rel/cadena/bin/cadena ping&lt;/pre&gt;
&lt;p&gt;We should get:&lt;/p&gt;
&lt;pre class="literal-block"&gt;pong&lt;/pre&gt;
&lt;p&gt;If we want we can attach a console to the running system:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ _build/default/rel/cadena/bin/cadena attach&lt;/pre&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre class="literal-block"&gt;Attaching to /tmp/erl_pipes/cadena@127.0.0.1/erlang.pipe.1 (^D to exit)

(cadena@127.0.0.1)1&amp;gt;&lt;/pre&gt;
&lt;p&gt;Now let's quit with q():&lt;/p&gt;
&lt;pre class="literal-block"&gt;(cadena@127.0.0.1)1&amp;gt; q().&lt;/pre&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre class="literal-block"&gt;ok&lt;/pre&gt;
&lt;p&gt;Now let's see if it's alive:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ _build/default/rel/cadena/bin/cadena ping

Node 'cadena@127.0.0.1' not responding to pings.&lt;/pre&gt;
&lt;p&gt;Be careful with how you quit attached consoles in production systems :)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="configure-prod-and-dev-cluster-releases"&gt;
&lt;h2&gt;Configure Prod and Dev Cluster Releases&lt;/h2&gt;
&lt;section id="building-prod-release"&gt;
&lt;h3&gt;Building Prod Release&lt;/h3&gt;
&lt;p&gt;We start by adding a new section to rebar.config called &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/2acf599320bed53c003cfd266a597acd2488caac/rebar.config#L40"&gt;profiles&lt;/a&gt;, and define
4 profiles that override the default release config with specific values,
let's start by trying the &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/2acf599320bed53c003cfd266a597acd2488caac/rebar.config#L48"&gt;prod profile&lt;/a&gt;, which we will use to create production
releases of the project:&lt;/p&gt;
&lt;pre class="literal-block"&gt;rebar3 as prod release&lt;/pre&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre class="literal-block"&gt;===&amp;gt; Verifying dependencies...
...
===&amp;gt; Compiling cadena
===&amp;gt; Running cuttlefish schema generator
===&amp;gt; Starting relx build process ...
===&amp;gt; Resolving OTP Applications from directories:
          _build/prod/lib
          erl-19.3/lib
===&amp;gt; Resolved cadena-0.1.0
===&amp;gt; Including Erts from erl-19.3
===&amp;gt; release successfully created!&lt;/pre&gt;
&lt;p&gt;Notice now that we have a new folder in the _build directory:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ ls -1 _build&lt;/pre&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre class="literal-block"&gt;default
prod&lt;/pre&gt;
&lt;p&gt;The results of the commands run "as prod" are stored in the prod folder.&lt;/p&gt;
&lt;p&gt;You will notice if you explore the prod/rel/cadena folder that there's a folder
called erts-8.3 (the version may differ if you are using a different erlang
version), that folder is there because of the &lt;cite&gt;include_erts&lt;/cite&gt; option we overrided
in the prod profile.&lt;/p&gt;
&lt;p&gt;This means you can zip the _build/prod/rel/cadena folder, upload it to a server
that doesn't have erlang installed in it and still run your release there.&lt;/p&gt;
&lt;p&gt;This is a good way to be sure that the version running in production is the
same you use in development or at build time in your build server.&lt;/p&gt;
&lt;p&gt;Just be careful with deploying to an operating system too different to the one
you used to create the release becase you may have problems with bindings like
libc or openssl.&lt;/p&gt;
&lt;p&gt;Running it is done as usual, only the path changes:&lt;/p&gt;
&lt;pre class="literal-block"&gt;_build/prod/rel/cadena/bin/cadena console

_build/prod/rel/cadena/bin/cadena start
_build/prod/rel/cadena/bin/cadena ping
_build/prod/rel/cadena/bin/cadena attach
_build/prod/rel/cadena/bin/cadena stop&lt;/pre&gt;
&lt;/section&gt;
&lt;section id="building-dev-cluster-releases"&gt;
&lt;h3&gt;Building Dev Cluster Releases&lt;/h3&gt;
&lt;p&gt;To build a cluster we need at least 3 nodes, that's why the last 3 profiles
are &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/2acf599320bed53c003cfd266a597acd2488caac/rebar.config#L61"&gt;node1&lt;/a&gt;, &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/2acf599320bed53c003cfd266a597acd2488caac/rebar.config#L76"&gt;node2&lt;/a&gt; and &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/2acf599320bed53c003cfd266a597acd2488caac/rebar.config#L80"&gt;node3&lt;/a&gt;, they need to have different node names, for that
we use the overlay var files to override the name of each, that is achieved
on &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/2acf599320bed53c003cfd266a597acd2488caac/config/vars_node1.config"&gt;config/vars_node1.config&lt;/a&gt; for node1,
&lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/2acf599320bed53c003cfd266a597acd2488caac/config/vars_node2.config"&gt;config/vars_node2.config&lt;/a&gt; for node2 and
&lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/2acf599320bed53c003cfd266a597acd2488caac/config/vars_node3.config"&gt;config/vars_node3.config&lt;/a&gt; for node3.&lt;/p&gt;
&lt;p&gt;Now let's build them:&lt;/p&gt;
&lt;pre class="literal-block"&gt;rebar3 as node1 release
rebar3 as node2 release
rebar3 as node3 release&lt;/pre&gt;
&lt;p&gt;The output for each should be similar to the one for the prod release.&lt;/p&gt;
&lt;p&gt;Now on three different shells start each node:&lt;/p&gt;
&lt;pre class="literal-block"&gt;./_build/node1/rel/cadena/bin/cadena console&lt;/pre&gt;
&lt;p&gt;Check the name of the node in the shell:&lt;/p&gt;
&lt;pre class="literal-block"&gt;(node1@127.0.0.1)1&amp;gt;&lt;/pre&gt;
&lt;p&gt;Do the same for node2 and node3 on different shells:&lt;/p&gt;
&lt;pre class="literal-block"&gt;./_build/node2/rel/cadena/bin/cadena console
./_build/node3/rel/cadena/bin/cadena console&lt;/pre&gt;
&lt;p&gt;You should get respectively:&lt;/p&gt;
&lt;pre class="literal-block"&gt;(node2@127.0.0.1)1&amp;gt;&lt;/pre&gt;
&lt;p&gt;And:&lt;/p&gt;
&lt;pre class="literal-block"&gt;(node3@127.0.0.1)1&amp;gt;&lt;/pre&gt;
&lt;p&gt;In case you don't remember, you can quit with &lt;cite&gt;q().&lt;/cite&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="joining-the-cluster-together"&gt;
&lt;h2&gt;Joining the Cluster Together&lt;/h2&gt;
&lt;p&gt;Until here we built 3 releases of the same code with slight modifications to
allow running a cluster on one computer, but 3 nodes running doesn't mean
we have a cluster, for that we need to use what we learned in the &lt;a class="reference external" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-1/"&gt;Multi-Paxos with riak_ensemble Part 1&lt;/a&gt; but now on code and not interactively.&lt;/p&gt;
&lt;p&gt;For that we will create a &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/4d44a0b022a7bf7855062d601834f084bafec7f9/src/cadena_console.erl"&gt;cadena_console module&lt;/a&gt; that we will use to make calls
from the outside and trigger actions on each node, the code is similar to the
one presented in &lt;a class="reference external" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-1/"&gt;Multi-Paxos with riak_ensemble Part 1&lt;/a&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-1" name="rest_code_bc5fa069397a4905b09645118f21aa54-1" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;NodeStr&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-2" name="rest_code_bc5fa069397a4905b09645118f21aa54-2" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% node name comes as a list string, we need it as an atom&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-3" name="rest_code_bc5fa069397a4905b09645118f21aa54-3" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;Node&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;list_to_atom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;NodeStr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-4" name="rest_code_bc5fa069397a4905b09645118f21aa54-4" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% check that the node exists and is alive&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-5" name="rest_code_bc5fa069397a4905b09645118f21aa54-5" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;net_adm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-6" name="rest_code_bc5fa069397a4905b09645118f21aa54-6" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c"&gt;% if not, return an error&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-7" name="rest_code_bc5fa069397a4905b09645118f21aa54-7" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;pang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-8" name="rest_code_bc5fa069397a4905b09645118f21aa54-8" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;not_reachable&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-9" name="rest_code_bc5fa069397a4905b09645118f21aa54-9" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c"&gt;% if it replies, let's join him passing our node reference&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-10" name="rest_code_bc5fa069397a4905b09645118f21aa54-10" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;pong&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-11" name="rest_code_bc5fa069397a4905b09645118f21aa54-11" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nn"&gt;riak_ensemble_manager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;node&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-12" name="rest_code_bc5fa069397a4905b09645118f21aa54-12" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-13" name="rest_code_bc5fa069397a4905b09645118f21aa54-13" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-13"&gt;&lt;/a&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-14" name="rest_code_bc5fa069397a4905b09645118f21aa54-14" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-14"&gt;&lt;/a&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-15" name="rest_code_bc5fa069397a4905b09645118f21aa54-15" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% enable riak_ensemble_manager&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-16" name="rest_code_bc5fa069397a4905b09645118f21aa54-16" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nn"&gt;riak_ensemble_manager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-17" name="rest_code_bc5fa069397a4905b09645118f21aa54-17" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% wait until it stabilizes&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-18" name="rest_code_bc5fa069397a4905b09645118f21aa54-18" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;wait_stable&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-19" name="rest_code_bc5fa069397a4905b09645118f21aa54-19" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-19"&gt;&lt;/a&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-20" name="rest_code_bc5fa069397a4905b09645118f21aa54-20" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-20"&gt;&lt;/a&gt;&lt;span class="nf"&gt;cluster_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-21" name="rest_code_bc5fa069397a4905b09645118f21aa54-21" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;riak_ensemble_manager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-22" name="rest_code_bc5fa069397a4905b09645118f21aa54-22" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-23" name="rest_code_bc5fa069397a4905b09645118f21aa54-23" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;not_enabled&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-24" name="rest_code_bc5fa069397a4905b09645118f21aa54-24" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-25" name="rest_code_bc5fa069397a4905b09645118f21aa54-25" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nv"&gt;Nodes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;riak_ensemble_manager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-26" name="rest_code_bc5fa069397a4905b09645118f21aa54-26" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nodes in cluster: &lt;/span&gt;&lt;span class="si"&gt;~p~n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="nv"&gt;Nodes&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-27" name="rest_code_bc5fa069397a4905b09645118f21aa54-27" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-27"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nv"&gt;LeaderNode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;riak_ensemble_manager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_leader_pid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-28" name="rest_code_bc5fa069397a4905b09645118f21aa54-28" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-28"&gt;&lt;/a&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Leader: &lt;/span&gt;&lt;span class="si"&gt;~p~n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="nv"&gt;LeaderNode&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a id="rest_code_bc5fa069397a4905b09645118f21aa54-29" name="rest_code_bc5fa069397a4905b09645118f21aa54-29" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_bc5fa069397a4905b09645118f21aa54-29"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We also need to add the riak_ensemble supervisor to our supervisor tree in &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/4d44a0b022a7bf7855062d601834f084bafec7f9/src/cadena_sup.erl"&gt;cadena_sup&lt;/a&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code erlang"&gt;&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-1" name="rest_code_018f29100a4d4128a3bd13cf968383b9-1" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-1"&gt;&lt;/a&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-2" name="rest_code_018f29100a4d4128a3bd13cf968383b9-2" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% get the configuration from sys.config&lt;/span&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-3" name="rest_code_018f29100a4d4128a3bd13cf968383b9-3" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;DataRoot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;application&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;get_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riak_ensemble&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data_root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"./data"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-4" name="rest_code_018f29100a4d4128a3bd13cf968383b9-4" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% create a unique path for each node to avoid clashes if running more&lt;/span&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-5" name="rest_code_018f29100a4d4128a3bd13cf968383b9-5" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;% than one node in the same computer&lt;/span&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-6" name="rest_code_018f29100a4d4128a3bd13cf968383b9-6" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;NodeDataDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;DataRoot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;atom_to_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;node&lt;/span&gt;&lt;span class="p"&gt;())),&lt;/span&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-7" name="rest_code_018f29100a4d4128a3bd13cf968383b9-7" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-8" name="rest_code_018f29100a4d4128a3bd13cf968383b9-8" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;Ensemble&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;riak_ensemble_sup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-9" name="rest_code_018f29100a4d4128a3bd13cf968383b9-9" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;riak_ensemble_sup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start_link&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-10" name="rest_code_018f29100a4d4128a3bd13cf968383b9-10" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;NodeDataDir&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-11" name="rest_code_018f29100a4d4128a3bd13cf968383b9-11" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;permanent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;riak_ensemble_sup&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-12" name="rest_code_018f29100a4d4128a3bd13cf968383b9-12" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-12"&gt;&lt;/a&gt;
&lt;a id="rest_code_018f29100a4d4128a3bd13cf968383b9-13" name="rest_code_018f29100a4d4128a3bd13cf968383b9-13" href="http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/#rest_code_018f29100a4d4128a3bd13cf968383b9-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;one_for_all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Ensemble&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Before building the dev cluster we need to add the &lt;cite&gt;crypto&lt;/cite&gt; app to &lt;a class="reference external" href="https://github.com/marianoguerra/cadena/blob/4d44a0b022a7bf7855062d601834f084bafec7f9/src/cadena.app.src#L9"&gt;cadena.app.src&lt;/a&gt;
since it's needed by riak_ensemble to create the cluster.&lt;/p&gt;
&lt;p&gt;Now let's build the dev cluster, I created a Makefile to make it simpler:&lt;/p&gt;
&lt;pre class="literal-block"&gt;make devrel&lt;/pre&gt;
&lt;p&gt;On three different shells run one command on each:&lt;/p&gt;
&lt;pre class="literal-block"&gt;make node1-console
make node2-console
make node3-console&lt;/pre&gt;
&lt;p&gt;Let's make an rpc call to enable the riak_ensemble cluster on node1:&lt;/p&gt;
&lt;pre class="literal-block"&gt;./_build/node1/rel/cadena/bin/cadena rpc cadena_console create&lt;/pre&gt;
&lt;p&gt;On node1 you should see something like:&lt;/p&gt;
&lt;pre class="literal-block"&gt;[info] {root,'node1@127.0.0.1'}: Leading&lt;/pre&gt;
&lt;p&gt;Let's join node2 to node1:&lt;/p&gt;
&lt;pre class="literal-block"&gt;./_build/node2/rel/cadena/bin/cadena rpc cadena_console join node1@127.0.0.1&lt;/pre&gt;
&lt;p&gt;On node1 you should see:&lt;/p&gt;
&lt;pre class="literal-block"&gt;[info] join(Vsn): {1,152} :: 'node2@127.0.0.1' :: ['node1@127.0.0.1']&lt;/pre&gt;
&lt;p&gt;On node2:&lt;/p&gt;
&lt;pre class="literal-block"&gt;[info] JOIN: success&lt;/pre&gt;
&lt;p&gt;Finally let's join node3:&lt;/p&gt;
&lt;pre class="literal-block"&gt;./_build/node3/rel/cadena/bin/cadena rpc cadena_console join node1@127.0.0.1&lt;/pre&gt;
&lt;p&gt;Output on node1:&lt;/p&gt;
&lt;pre class="literal-block"&gt;[info] join(Vsn): {1,453} :: 'node3@127.0.0.1' :: ['node1@127.0.0.1','node2@127.0.0.1']&lt;/pre&gt;
&lt;p&gt;On node3:&lt;/p&gt;
&lt;pre class="literal-block"&gt;[info] JOIN: success&lt;/pre&gt;
&lt;p&gt;Let's check that the 3 nodes have the same view of the cluster, let's ask node1
what's the ensemble status:&lt;/p&gt;
&lt;pre class="literal-block"&gt;./_build/node1/rel/cadena/bin/cadena rpc cadena_console ensemble_status&lt;/pre&gt;
&lt;pre class="literal-block"&gt;Nodes in cluster: ['node1@127.0.0.1','node2@127.0.0.1','node3@127.0.0.1']
Leader: 'node1@127.0.0.1'&lt;/pre&gt;
&lt;p&gt;node2:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ ./_build/node2/rel/cadena/bin/cadena rpc cadena_console ensemble_status&lt;/pre&gt;
&lt;pre class="literal-block"&gt;Nodes in cluster: ['node1@127.0.0.1','node2@127.0.0.1','node3@127.0.0.1']
Leader: 'node1@127.0.0.1'&lt;/pre&gt;
&lt;p&gt;node3:&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ ./_build/node3/rel/cadena/bin/cadena rpc cadena_console ensemble_status&lt;/pre&gt;
&lt;pre class="literal-block"&gt;Nodes in cluster: ['node1@127.0.0.1','node2@127.0.0.1','node3@127.0.0.1']
Leader: 'node1@127.0.0.1'&lt;/pre&gt;
&lt;p&gt;Everything looks right, stop the 3 nodes (&lt;cite&gt;q().&lt;/cite&gt;) and start them again, you
will see that after starting up node1 logs:&lt;/p&gt;
&lt;pre class="literal-block"&gt;[info] {root,'node1@127.0.0.1'}: Leading&lt;/pre&gt;
&lt;p&gt;And if you call ensemble_status on any node you get the same outputs as before,
this means they remember the cluster topology even after restarts.&lt;/p&gt;
&lt;/section&gt;</description><category>erlang</category><category>riak</category><category>riak_ensemble</category><guid>http://marianoguerra.org/posts/multi-paxos-with-riak_ensemble-part-2/</guid><pubDate>Sat, 16 Sep 2017 17:29:18 GMT</pubDate></item></channel></rss>