<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Highlights on INFINI Pizza</title><link>/docs/highlightings/</link><description>Recent content in Highlights on INFINI Pizza</description><generator>Hugo</generator><language>en</language><atom:link href="/docs/highlightings/index.xml" rel="self" type="application/rss+xml"/><item><title>In-place columns for hot counters and flags</title><link>/docs/highlightings/inplace-columns/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/highlightings/inplace-columns/</guid><description>&lt;h1 id="in-place-columns-for-hot-counters-and-flags">
 In-place columns for hot counters and flags
 &lt;a class="anchor" href="#in-place-columns-for-hot-counters-and-flags">#&lt;/a>
&lt;/h1>
&lt;p>Fields that change constantly — view counters, stock levels, feature
flags, ranking scores — used to pay a full document rebuild on every
partial update. Marking a numeric or boolean field with
&lt;code>&amp;quot;inplace&amp;quot;: true&lt;/code> gives it a dedicated typed column instead:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">PUT /my-collection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;properties&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;title&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span> &lt;span class="s2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;keyword&amp;#34;&lt;/span> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;views&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span> &lt;span class="s2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;integer&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;inplace&amp;#34;&lt;/span>: &lt;span class="nb">true&lt;/span> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;score&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span> &lt;span class="s2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;double&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;inplace&amp;#34;&lt;/span>: &lt;span class="nb">true&lt;/span> &lt;span class="o">}&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;active&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span> &lt;span class="s2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;boolean&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;inplace&amp;#34;&lt;/span>: &lt;span class="nb">true&lt;/span> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Partial updates on such fields become O(1) column writes — no fetch,
merge, and re-index of the document. Atomic-style operators work
directly against the column:&lt;/p></description></item><item><title>Runtime node settings and dynamic log level</title><link>/docs/highlightings/node-settings/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/highlightings/node-settings/</guid><description>&lt;h1 id="runtime-node-settings-and-dynamic-log-level">
 Runtime node settings and dynamic log level
 &lt;a class="anchor" href="#runtime-node-settings-and-dynamic-log-level">#&lt;/a>
&lt;/h1>
&lt;p>Node-local knobs no longer require a restart. &lt;code>GET/PUT /_node/_local/settings&lt;/code> exposes transient overrides over the &lt;code>pizza.yml&lt;/code>
values — search lane budgets, the slowlog threshold, the default search
timeout, trash retention — and they take effect immediately:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># drop the slowlog threshold to 200ms on one node, effective immediately&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -X PUT http://127.0.0.1:28000/_node/_local/settings &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H &lt;span class="s1">&amp;#39;Content-Type: application/json&amp;#39;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -d &lt;span class="s1">&amp;#39;{&amp;#34;node.search.slow_threshold_ms&amp;#34;: 200}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The flagship: &lt;code>log.level&lt;/code> flips live — no restart, no dropped requests —
which turns &amp;ldquo;turn on debug logging on the suspicious node&amp;rdquo; into a
one-liner while preserving target-specific directives like
&lt;code>openraft=warn&lt;/code>.&lt;/p></description></item><item><title>Collection-wide manual compaction</title><link>/docs/highlightings/manual-compaction/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/highlightings/manual-compaction/</guid><description>&lt;h1 id="collection-wide-manual-compaction">
 Collection-wide manual compaction
 &lt;a class="anchor" href="#collection-wide-manual-compaction">#&lt;/a>
&lt;/h1>
&lt;p>Reclaiming disk no longer means waiting for the background cadence or
poking shards one by one. One request runs a merge pass on every started
primary copy of the collection, cluster-wide:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">curl -X POST http://127.0.0.1:28000/my-collection/_compact &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H &lt;span class="s1">&amp;#39;Authorization: Bearer pz_bootstrap_key&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The response reports the queued batch job per hosting node — job id plus
how many local primary passes it covers — so a node-level failure fails
the row, not the request:&lt;/p></description></item><item><title>FIRE storage explorer in the console</title><link>/docs/highlightings/storage-explorer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/highlightings/storage-explorer/</guid><description>&lt;h1 id="fire-storage-explorer-in-the-console">
 FIRE storage explorer in the console
 &lt;a class="anchor" href="#fire-storage-explorer-in-the-console">#&lt;/a>
&lt;/h1>
&lt;p>
 &lt;img src="/img/console/storage-explorer.png" alt="FIRE storage explorer with a per-field cost treemap" />&lt;/p>
&lt;p>The web console (&lt;code>/_ui/&lt;/code>) gained a FIRE storage explorer: drill from a
node&amp;rsquo;s shards down to a single segment&amp;rsquo;s &lt;code>.fire&lt;/code> files and see exactly
where the bytes go — a per-field cost treemap of the columnar FIRE
storage, next to the inverted index and stored-field payloads. In the
screenshot above, the collection&amp;rsquo;s &lt;strong>Storage&lt;/strong> tab sizes every field by
its on-disk cost, each block split into storage categories — so the
question &amp;ldquo;which field is eating my disk&amp;rdquo; is answered by the biggest
rectangle on screen.&lt;/p></description></item><item><title>semantic_text — one-field semantic search</title><link>/docs/highlightings/semantic-text/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/highlightings/semantic-text/</guid><description>&lt;h1 id="semantic_text--one-field-semantic-search">
 semantic_text — one-field semantic search
 &lt;a class="anchor" href="#semantic_text--one-field-semantic-search">#&lt;/a>
&lt;/h1>
&lt;p>Semantic search used to mean wiring two fields: a &lt;code>text&lt;/code> field for the
source, a &lt;code>dense_vector&lt;/code> field with &lt;code>vector_options&lt;/code> pointing back at
it. The ES-style &lt;code>semantic_text&lt;/code> type (Elasticsearch 8.15+ alignment)
collapses all of that into one declaration:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">PUT /my-collection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;schema&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;properties&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;body&amp;#34;&lt;/span>: &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;type&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;semantic_text&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;service&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;zai&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;model&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;GLM-4.6V&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;dims&amp;#34;&lt;/span>: &lt;span class="m">3072&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>From there everything derives. Writes carry plain text — the vector is
embedded server-side at write time, in bulk and after partial updates
alike. Search needs no field names and no vectors:&lt;/p></description></item><item><title>Keystore hot-reload</title><link>/docs/highlightings/keystore-hot-reload/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/highlightings/keystore-hot-reload/</guid><description>&lt;h1 id="keystore-hot-reload">
 Keystore hot-reload
 &lt;a class="anchor" href="#keystore-hot-reload">#&lt;/a>
&lt;/h1>
&lt;p>Rotating a secret no longer restarts the node. &lt;code>${keystore:...}&lt;/code>
references re-resolve into the running configuration on demand: console
edits trigger the reload themselves, and out-of-band changes (a CLI
edit, a replaced mounted Secret) are one call away.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">curl -X POST http://127.0.0.1:28000/_node/_local/keystore/_reload &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H &lt;span class="s1">&amp;#39;Authorization: Bearer pz_bootstrap_key&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The answer says exactly what happened — key names only, values stay
write-only:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;entries&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;read_only&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;references&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;changed&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;node.embedding.endpoints&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;catalog.join_token&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;unchanged&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;failed&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A rotated embedding API key applies to the next inference call; a
rotated &lt;code>catalog.join_token&lt;/code> to the next join attempt. A reference
whose entry disappeared keeps its running value and lands in &lt;code>failed&lt;/code>
until the entry returns — reload never aborts the node the way a
missing entry aborts boot.&lt;/p></description></item><item><title>Model features &amp; the /_chat facade</title><link>/docs/highlightings/model-features/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/highlightings/model-features/</guid><description>&lt;h1 id="model-features--the-_chat-facade">
 Model features &amp;amp; the /_chat facade
 &lt;a class="anchor" href="#model-features--the-_chat-facade">#&lt;/a>
&lt;/h1>
&lt;p>Every model in the AI-services registry can now declare what it is
&lt;strong>for&lt;/strong> and what it &lt;strong>accepts&lt;/strong> — &lt;code>features&lt;/code> (&lt;code>embedding&lt;/code> or
&lt;code>generation&lt;/code>) and &lt;code>inputs&lt;/code> (&lt;code>text&lt;/code> or &lt;code>image&lt;/code>). The two axes are
orthogonal: &amp;ldquo;multimodal&amp;rdquo; is not a category of its own but an &lt;code>inputs&lt;/code>
list beyond text.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">node&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">embedding&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">endpoints&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">zai&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://api.z.ai/api/coding/paas/v4/embeddings&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chat_url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://api.z.ai/api/coding/paas/v4/chat/completions&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">api_key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sk-…&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">models&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">embedding-3 &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># embedding + text (the defaults)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">id: GLM-4.6V, dims&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">3072&lt;/span>}&lt;span class="w"> &lt;/span>&lt;span class="c"># embedding, dims declared&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">id: glm-4-flash, features&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">generation]} &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># text generation&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">id: glm-4v, features: [generation], inputs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">text, image]} &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># vision LLM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">id: clip-v2, features: [embedding], inputs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">text, image]} &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># multimodal embedder&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Omitted fields keep the historical defaults, so every existing
plain-string listing still means embedding + text — nothing to migrate.&lt;/p></description></item><item><title>Cluster-wide recycle bin</title><link>/docs/highlightings/cluster-trash/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/highlightings/cluster-trash/</guid><description>&lt;h1 id="cluster-wide-recycle-bin">
 Cluster-wide recycle bin
 &lt;a class="anchor" href="#cluster-wide-recycle-bin">#&lt;/a>
&lt;/h1>
&lt;p>Accidental deletes used to be a race against the sweeper: deleting a
namespace only dropped metadata, and the data directories drifted into
the trash WITHOUT a recovery snapshot — permanently unrestorable. The
recycle bin is now a first-class, cluster-wide surface with a
namespace-centric view, a pre-restore integrity check, and one-request
restore:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># One cluster-wide list — every node&amp;#39;s trash merged by item, grouped by&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># namespace, with the delete-time snapshot summary of each item.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">GET /_cluster/trash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Deleting a namespace captures a restore snapshot for every collection it
contains, so the WHOLE namespace comes back as a unit — original
schemas, shard UUIDs, partition routing and placements included:&lt;/p></description></item></channel></rss>