<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Antharas</title>
    <description>The latest articles on DEV Community by Antharas (@antharas).</description>
    <link>https://dev.to/antharas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4166941%2Fda1af8c4-2c25-4368-ac78-4cc95ceba52d.png</url>
      <title>DEV Community: Antharas</title>
      <link>https://dev.to/antharas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/antharas"/>
    <language>en</language>
    <item>
      <title>Consensus without leader election: ORCHID in Grid (Kuramoto phase + quorum)</title>
      <dc:creator>Antharas</dc:creator>
      <pubDate>Tue, 06 Oct 2026 16:55:31 +0000</pubDate>
      <link>https://dev.to/antharas/consensus-without-leader-election-orchid-in-grid-kuramoto-phase-quorum-ikp</link>
      <guid>https://dev.to/antharas/consensus-without-leader-election-orchid-in-grid-kuramoto-phase-quorum-ikp</guid>
      <description>&lt;p&gt;Three nodes, one database, the client sends &lt;code&gt;UPSERT&lt;/code&gt;. Two things must hold at once: &lt;strong&gt;admit a write only when the cluster is synchronized&lt;/strong&gt;, and &lt;strong&gt;never let a network cut leave different versions of the same data in the journals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In a Raft-style stack nodes elect a leader and only the leader writes; each leadership period has a &lt;em&gt;term&lt;/em&gt;; when the leader is gone, they elect again. Grid admits writes differently: &lt;strong&gt;there is no election&lt;/strong&gt;. Nodes exchange a scalar &lt;strong&gt;phase&lt;/strong&gt; (coupled oscillators after Kuramoto) and separately confirm each operation with a &lt;strong&gt;checksum&lt;/strong&gt; (&lt;em&gt;digest&lt;/em&gt;) of its contents. That protocol is &lt;strong&gt;ORCHID&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Recovery after failure means bringing phases back together and collecting digest agreement — not running another election.&lt;/p&gt;




&lt;h2&gt;
  
  
  Context: what Grid means in this article
&lt;/h2&gt;

&lt;p&gt;Grid is a distributed SQL database: hot data in memory, a mutation journal (OpLog) and sealed snapshots on disk, and ORCHID between nodes. A single node with disk and no peers is a normal mode; replication is opt-in.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SQL, catalog&lt;/td&gt;
&lt;td&gt;DDL/DML, schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;Hot working set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk (OpLog + sealed GridMap)&lt;/td&gt;
&lt;td&gt;Survive restart, keep commits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster (ORCHID + replication)&lt;/td&gt;
&lt;td&gt;Who may write and what is durable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;grid://&lt;/code&gt; (and tooling JDBC on the same wire)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rest of this article is write admission only. SQL dialect, sealed layout, and client APIs belong elsewhere; start at &lt;a href="https://github.com/GenCloud/grid-sql/blob/master/docs/en/getting-started/quick-start.md" rel="noopener noreferrer"&gt;quick-start&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two questions — two mechanisms
&lt;/h2&gt;

&lt;p&gt;Keep them apart: they fail and are observed differently. Phase &lt;strong&gt;does not&lt;/strong&gt; replace the checksum.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Phase synchronization&lt;/th&gt;
&lt;th&gt;Checksum agreement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Question&lt;/td&gt;
&lt;td&gt;May the cluster propose a write right now?&lt;/td&gt;
&lt;td&gt;Is this the same operation the others see?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Measure&lt;/td&gt;
&lt;td&gt;Order parameter &lt;code&gt;R&lt;/code&gt; ∈ [0, 1] over phases θ&lt;/td&gt;
&lt;td&gt;Matching digest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Live nodes in the &lt;strong&gt;local&lt;/strong&gt; site&lt;/td&gt;
&lt;td&gt;Nodes from the &lt;strong&gt;configuration&lt;/strong&gt; (+ remote voters when enabled)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;R&lt;/code&gt; below threshold → no proposal&lt;/td&gt;
&lt;td&gt;No majority on one checksum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writer&lt;/td&gt;
&lt;td&gt;Among synced nodes, minimal &lt;code&gt;nodeId&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Same node sends the proposal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Solo write (&lt;code&gt;N = 1&lt;/code&gt;) is allowed &lt;strong&gt;only&lt;/strong&gt; if the peer list was empty from the start. If peers were configured and then the network failed, the survivor does &lt;strong&gt;not&lt;/strong&gt; become a solo writer — otherwise a minority would keep committing in isolation.&lt;/p&gt;

&lt;p&gt;Defaults: &lt;code&gt;order-threshold: 0.85&lt;/code&gt;, &lt;code&gt;tick-ms: 10&lt;/code&gt;, &lt;code&gt;natural-freq-hz: 1.0&lt;/code&gt;, &lt;code&gt;coupling: 15&lt;/code&gt;, &lt;code&gt;digest-quorum: MAJORITY&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  How &lt;code&gt;R&lt;/code&gt; is computed
&lt;/h2&gt;

&lt;p&gt;Order parameter over phases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;R = | (1/N) * Σ_k exp(i · θ_k) |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Closer phases push &lt;code&gt;R&lt;/code&gt; toward 1. In code — mean cos/sin and hypotenuse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;computeR&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;sx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cos&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;phase&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;sy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sin&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;phase&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PeerView&lt;/span&gt; &lt;span class="n"&gt;peer&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;peers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;values&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;countsForPhase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;sx&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cos&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;phase&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;sy&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sin&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;phase&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hypot&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sx&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sy&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every &lt;code&gt;tick-ms&lt;/code&gt; a node updates its phase and exchanges it with local-site peers. Free-running angular speed is &lt;code&gt;natural-freq-hz&lt;/code&gt;; pull strength is &lt;code&gt;coupling&lt;/code&gt;. Convergence needs the free advance per tick to stay well below one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2 · π · natural-freq-hz · tick-ms / 1000  ≪  1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Defaults (&lt;code&gt;1.0&lt;/code&gt; Hz, &lt;code&gt;10&lt;/code&gt; ms) satisfy that. At &lt;code&gt;natural-freq-hz = 50&lt;/code&gt; with the same tick, phase jumps too far per step: &lt;code&gt;R&lt;/code&gt; falls below threshold on a healthy cluster. Lowering &lt;code&gt;order-threshold&lt;/code&gt; “to stop the errors” hides desync instead of fixing frequency / tick / coupling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-DC once.&lt;/strong&gt; &lt;code&gt;R&lt;/code&gt; is local-site only; remote sites do not enter local &lt;code&gt;R&lt;/code&gt;. &lt;code&gt;SYNC_VOTERS_ACROSS_DC&lt;/code&gt; adds digest confirmations from another site (with a WAN timeout) — it is not Kuramoto-over-WAN and not a substitute for local phase lock.&lt;/p&gt;




&lt;h2&gt;
  
  
  How a write proceeds
&lt;/h2&gt;

&lt;p&gt;While &lt;code&gt;R ≥ order-threshold&lt;/code&gt; and the node is the writer (minimal &lt;code&gt;nodeId&lt;/code&gt; among synced nodes):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Digest = hash of previous &lt;code&gt;opSeq&lt;/code&gt; and operation bytes.&lt;/li&gt;
&lt;li&gt;Proposal is broadcast; peers ACK the same digest or NACK.&lt;/li&gt;
&lt;li&gt;Majority is taken from the &lt;strong&gt;configuration&lt;/strong&gt; (not “whoever answered this second”). &lt;code&gt;forgetPeer&lt;/code&gt; does not shrink majority size.&lt;/li&gt;
&lt;li&gt;The record is appended to the OpLog and confirmed on disk &lt;strong&gt;before&lt;/strong&gt; the commit broadcast and &lt;strong&gt;before&lt;/strong&gt; map visibility.&lt;/li&gt;
&lt;li&gt;Only then is the row visible to readers as committed.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;admit(op):
  if configuration has peers but none are reachable → refuse
  if R below threshold → refuse
  if this node is not the writer → refuse / redirect to writer
  digest = hash(prevOpSeq, op bytes)
  broadcast proposal
  wait for majority on the same digest
  append journal, confirmPersisted
  broadcast commit
  apply into the map
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Linearizable reads in the Jepsen sense are from the writer and only from already committed map state. Client connection samples live in &lt;a href="https://github.com/GenCloud/grid-sql/blob/master/docs/en/getting-started/quick-start.md" rel="noopener noreferrer"&gt;quick-start&lt;/a&gt;, not here — they break the protocol narrative.&lt;/p&gt;




&lt;h2&gt;
  
  
  When nodes lose connectivity
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuration&lt;/th&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Who writes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;N = 3&lt;/td&gt;
&lt;td&gt;One node unreachable&lt;/td&gt;
&lt;td&gt;The other two (majority)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;N = 3&lt;/td&gt;
&lt;td&gt;Split 2 / 1&lt;/td&gt;
&lt;td&gt;Only the side of two&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;N = 3&lt;/td&gt;
&lt;td&gt;Two nodes unreachable&lt;/td&gt;
&lt;td&gt;The lone survivor does &lt;strong&gt;not&lt;/strong&gt; write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;N = 2&lt;/td&gt;
&lt;td&gt;Link down&lt;/td&gt;
&lt;td&gt;Nobody writes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;any&lt;/td&gt;
&lt;td&gt;Link restored&lt;/td&gt;
&lt;td&gt;Phases re-lock; lagging node catches up the journal; no election&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;any&lt;/td&gt;
&lt;td&gt;Restart&lt;/td&gt;
&lt;td&gt;Reads stored tip, replays OpLog tail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There is no “promote myself because I see nobody.” Client role change uses &lt;code&gt;ServerMeta&lt;/code&gt; / &lt;code&gt;PROMOTE_NOTIFY&lt;/code&gt; and &lt;code&gt;rediscoverWriter()&lt;/code&gt;, not host hunting in the URL.&lt;/p&gt;

&lt;p&gt;From the model: commit only with majority; one journal slot does not get two different payloads.&lt;/p&gt;




&lt;h2&gt;
  
  
  Evidence
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TLA+ / TLC.&lt;/strong&gt; Single-site and remote-voter specs run in CI: fixed voter set, one phase-ranked writer, no two values on one &lt;code&gt;opSeq&lt;/code&gt;, minority does not commit under partition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jepsen.&lt;/strong&gt; Register and append workloads under network and process faults (one site and multi-site). That is consistency evidence, not a TPS claim: clients must not observe divergence, and the journal must not fork against ORCHID invariants.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lab host numbers
&lt;/h2&gt;

&lt;p&gt;Two nodes (writer + replica), &lt;code&gt;fsync: true&lt;/code&gt;, load over &lt;code&gt;grid://&lt;/code&gt; (JMeter; sync JDBC tooling is not the load path). Host: Intel Core 7 240H (10C/16T), 64 GiB RAM, NVMe.&lt;/p&gt;

&lt;p&gt;Living anchors and ≈95% regression floors on the band lower bound:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Profile&lt;/th&gt;
&lt;th&gt;Mix&lt;/th&gt;
&lt;th&gt;Avg / band&lt;/th&gt;
&lt;th&gt;≈95% floor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WRITE_ONLY&lt;/td&gt;
&lt;td&gt;100% UPSERT&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;4676&lt;/strong&gt; ops/s&lt;/td&gt;
&lt;td&gt;≈&lt;strong&gt;4442&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;READ_ONLY&lt;/td&gt;
&lt;td&gt;EQ 90% / JOIN 10%&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;52261…59430&lt;/strong&gt; ops/s&lt;/td&gt;
&lt;td&gt;≈&lt;strong&gt;52261&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capacity QG&lt;/td&gt;
&lt;td&gt;EQ 50 / UPSERT 40 / JOIN 10&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;8772…11519&lt;/strong&gt; ops/s&lt;/td&gt;
&lt;td&gt;≈&lt;strong&gt;8333&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Numbers are tied to this host and &lt;code&gt;fsync: true&lt;/code&gt;. WRITE ceiling includes ORCHID wait (&lt;code&gt;orchidWaitP50/P99&lt;/code&gt;). Method: &lt;a href="https://github.com/GenCloud/grid-sql/blob/master/docs/en/performance/capacity-slo.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/en/performance/capacity-slo.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;ORCHID admits a write when phases are close enough (&lt;code&gt;R ≥&lt;/code&gt; threshold) &lt;strong&gt;and&lt;/strong&gt; a configuration majority confirmed one digest. No elected leader, no &lt;em&gt;term&lt;/em&gt;. The trade-off is explicit: without majority the write is refused; a two-node split writes nowhere — better a client error than two journals.&lt;/p&gt;

&lt;p&gt;Source and releases: &lt;a href="https://github.com/GenCloud/grid-sql" rel="noopener noreferrer"&gt;github.com/GenCloud/grid-sql&lt;/a&gt;.&lt;br&gt;
On this topic: &lt;a href="https://github.com/GenCloud/grid-sql/blob/master/docs/en/understand/orchid-consensus.md" rel="noopener noreferrer"&gt;&lt;code&gt;orchid-consensus.md&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/GenCloud/grid-sql/blob/master/docs/en/understand/bio-inspired.md" rel="noopener noreferrer"&gt;&lt;code&gt;bio-inspired.md&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/GenCloud/grid-sql/tree/master/docs/spec/orchid" rel="noopener noreferrer"&gt;&lt;code&gt;docs/spec/orchid/&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/GenCloud/grid-sql/tree/master/benchmarks/jepsen" rel="noopener noreferrer"&gt;&lt;code&gt;benchmarks/jepsen/&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/GenCloud/grid-sql/blob/master/docs/en/performance/capacity-slo.md" rel="noopener noreferrer"&gt;&lt;code&gt;capacity-slo.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it.&lt;/strong&gt; Spin up one node with the &lt;a href="https://github.com/GenCloud/grid-sql/blob/master/docs/en/getting-started/quick-start.md" rel="noopener noreferrer"&gt;quick-start&lt;/a&gt; (JDK 25, Maven, &lt;code&gt;grid://&lt;/code&gt;) and run your own &lt;code&gt;UPSERT&lt;/code&gt; — no sidecache, no leader election in the write-admission path. Questions and bugs: Issues in the same repository.&lt;/p&gt;

</description>
      <category>java</category>
      <category>database</category>
      <category>inmemory</category>
      <category>distributedsystems</category>
    </item>
  </channel>
</rss>
