<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Candybox</title><link>http://www.predatorray.me/candybox/</link><description>Recent content on Candybox</description><generator>Hugo</generator><language>en-us</language><atom:link href="http://www.predatorray.me/candybox/index.xml" rel="self" type="application/rss+xml"/><item><title>Configuration</title><link>http://www.predatorray.me/candybox/docs/reference/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.predatorray.me/candybox/docs/reference/configuration/</guid><description>&lt;h1 id="configuration"&gt;Configuration&lt;a class="anchor" href="#configuration"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A node reads &lt;code&gt;conf/candybox.properties&lt;/code&gt;. &lt;strong&gt;Every key can be overridden by an environment variable&lt;/strong&gt;
named &lt;code&gt;CANDYBOX_&amp;lt;KEY&amp;gt;&lt;/code&gt; (dots become underscores, upper-cased) — for example
&lt;code&gt;CANDYBOX_ZOOKEEPER_CONNECT&lt;/code&gt; — and the environment value wins. This makes it easy to ship one image
and configure each instance through the environment.&lt;/p&gt;
&lt;h2 id="common-keys"&gt;Common keys&lt;a class="anchor" href="#common-keys"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Key&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;node.id&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Cluster-unique node id. Falls back to the trailing number in &lt;code&gt;$HOSTNAME&lt;/code&gt; (so a Kubernetes pod &lt;code&gt;candybox-2&lt;/code&gt; becomes node &lt;code&gt;2&lt;/code&gt;).&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;zookeeper.connect&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;ZooKeeper connect string, shared by BookKeeper and Candybox coordination.&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;127.0.0.1:2181&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;server.bind&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Address clients connect to.&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0.0.0.0:9709&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;server.advertised&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Address published to the cluster for routing (set to a reachable hostname).&lt;/td&gt;
 &lt;td&gt;bind address&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;health.port&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;HTTP port for &lt;code&gt;/healthz&lt;/code&gt;, &lt;code&gt;/readyz&lt;/code&gt;, &lt;code&gt;/metrics&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;9710&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;quorum.*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;BookKeeper replication per ledger role (&lt;code&gt;E/Qw/Qa&lt;/code&gt;).&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;3/3/2&lt;/code&gt; (WAL, manifest), &lt;code&gt;3/2/2&lt;/code&gt; (data)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;multipart.upload.ttl.millis&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;How long an abandoned multipart upload is kept before a background sweep aborts it.&lt;/td&gt;
 &lt;td&gt;7 days&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rename.intent.abandon.millis&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Cross-partition rename: how long the source owner keeps a rename intent whose destination rendezvous marker never appears before dropping it (the source stays live).&lt;/td&gt;
 &lt;td&gt;60000 (60 s)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="full-reference"&gt;Full reference&lt;a class="anchor" href="#full-reference"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The complete, commented list of keys lives in
&lt;a href="https://github.com/predatorray/candybox/blob/main/candybox-dist/src/conf/candybox.properties.example"&gt;&lt;code&gt;candybox.properties.example&lt;/code&gt;&lt;/a&gt;,
and the &lt;code&gt;CandyboxConfig&lt;/code&gt; section of
&lt;a href="https://github.com/predatorray/candybox/blob/main/OPERATIONS.md#configuration-reference-candyboxconfig"&gt;&lt;code&gt;OPERATIONS.md&lt;/code&gt;&lt;/a&gt;
documents the operational meaning of each tunable, including the security, consistency, and garbage
collection settings.&lt;/p&gt;</description></item><item><title>Quick start</title><link>http://www.predatorray.me/candybox/docs/getting-started/quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.predatorray.me/candybox/docs/getting-started/quickstart/</guid><description>&lt;h1 id="quick-start"&gt;Quick start&lt;a class="anchor" href="#quick-start"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The fastest way to try Candybox is the bundled Docker Compose stack. It starts the full system —
ZooKeeper, 3 BookKeeper bookies, 3 Candybox nodes, and the S3 gateway (on &lt;code&gt;:9711&lt;/code&gt;) — using the
published &lt;a href="https://hub.docker.com/r/zetaplusae/candybox"&gt;&lt;code&gt;zetaplusae/candybox&lt;/code&gt;&lt;/a&gt; image.&lt;/p&gt;
&lt;h2 id="with-docker-compose-recommended"&gt;With Docker Compose (recommended)&lt;a class="anchor" href="#with-docker-compose-recommended"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;From a checkout of the &lt;a href="https://github.com/predatorray/candybox"&gt;repository&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose run --rm cli create-box photos
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hello candybox&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; docker compose run --rm -T cli put photos hello.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose run --rm cli get photos hello.txt &lt;span class="c1"&gt;# -&amp;gt; hello candybox&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tear it down with &lt;code&gt;docker compose down&lt;/code&gt; (add &lt;code&gt;-v&lt;/code&gt; to also wipe the data volumes).&lt;/p&gt;</description></item><item><title>Concepts</title><link>http://www.predatorray.me/candybox/docs/getting-started/concepts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://www.predatorray.me/candybox/docs/getting-started/concepts/</guid><description>&lt;h1 id="concepts"&gt;Concepts&lt;a class="anchor" href="#concepts"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Candybox borrows the bucket/object model from S3 but gives the pieces its own names.&lt;/p&gt;
&lt;h2 id="vocabulary"&gt;Vocabulary&lt;a class="anchor" href="#vocabulary"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Term&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Box&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;a bucket — a named, flat namespace of keys&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Candy&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;an object — the bytes plus metadata stored under a key&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;CandyKey&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;an object key&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Syrup&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;a data ledger that holds object bytes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;CandyLocator&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;the small pointer the index stores to find a Candy&amp;rsquo;s bytes inside a Syrup&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;(Candy in a box — that&amp;rsquo;s the whole theme.)&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>