Jepsen finds ParticleDB’s default mode losing committed writes among 96 issues
In versions 1.1.4 through 1.1.17 of ParticleDB, advertised as “Full ACID. 159K TPS.”, WHERE 4 = 5 returned the row with primary key 5.
Guarantees tested one node at a time
Orkes advertised ParticleDB, a Postgres-compatible database, as “Full ACID. 159K TPS.” and as “formally proven” with TLA+, wording that Jepsen’s report quotes from the home page.1
On 2026-10-31 Jepsen reported 96 issues from tests of versions 1.1.4 through 1.1.18.11.rc-22 and wrote that the Full ACID claim was “somewhat premature.” The default transaction mode, occ, lost committed writes in normal operation. The TLA+ claim could not be checked, because no specification was available.1
Orkes, the vendor, funded the analysis, which Jepsen says it conducted under its ethics policy. Every test ran on a single node, because the builds Orkes supplied did not support replication.1
Four of six claims met a measured failure
Each row is one advertised guarantee, in the words the report prints, and each cell to its right is what Jepsen recorded against it. Orkes has since rewritten the home page and documentation pages the report quotes, so the report is now the record of that wording.1
| Advertised | Jepsen result | Build and mode |
|---|---|---|
| “Full ACID. 159K TPS.” | Committed writes lost; aborted reads (G1a), where a committed transaction reads a write from an aborted one;2 Lost Update, where a transaction overwrites a concurrent committed write it never observed.3 | 1.1.4 through 1.1.18.9, every mode, no faults |
| “snapshot isolation” | G-single, where a transaction observes one effect of another but misses a second effect of it (#73).4 Read skew (A5A), where it both observes and fails to observe the other’s effects (#106).5 | G-single in rc-1 through rc-22; A5A with table-2pl in rc-18 |
| “formally proven” with TLA+ | Could not be checked. No specification was available. | None tested |
occ is “Jepsen-safe” |
Acknowledged writes discarded on a healthy node: 31 lost among about 20,000 keys, every few minutes (#110). | rc-18 through rc-22, both interfaces |
groupsync gives the “same durability as sync” |
A conflict between documents, not a measured failure. The public docs said sync had “stronger durability,” and Jepsen reports no comparison. Orkes’s current docs say the two give the same guarantee.6 |
Documentation |
| Prepared statements “all work as expected” | Any prepared statement through the Postgres JDBC driver raised an exception, leaving the database “essentially unusable” (#2). | 1.1.4 through 1.1.18.9; appeared fixed by rc-1 |
“Jepsen-safe” was Orkes’s own label. Jepsen printed it and wrote that, since it evaluates safety against documentation and marketing claims, it was not clear how to interpret the term.1
WHERE 4 = 5 returned the row with primary key 5
Jepsen’s example is a table t with columns a, the primary key, and b, holding rows 4 | 5 and 5 | 6. In versions 1.1.4 through 1.1.17, ParticleDB “aggressively interpreted WHERE something = x as a primary-key lookup of x, regardless of the value of something.”1 The query in the diagram therefore asked for key 5 and never compared the 4.
The example is a single statement with no concurrent transaction. Version 1.1.18.4 stopped treating every equality as a key lookup. A related fault appeared only inside a transaction: in 1.1.4 through 1.1.18.8, SELECT * FROM t WHERE TRUE returned no rows (#35), and it seemed improved in 1.1.18.9.1
Ten issues survived to rc-22
Jepsen wrote that by 1.1.18.11.rc-22 all but ten of the 96 issues appeared resolved.1 The chart places seven findings on the builds Jepsen tested, four of them among the ten. A bar spans the builds where the behavior appeared, and a bar that reaches rc-22 was still open when testing ended.
strict-serializable at rc-18, a mode the report says may have been renamed serializable in rc-22, where its Discussion says both still occurred.1
Stale read, the behavior behind #109, is a read that fails to observe an earlier completed write, which strict serializability forbids.7 Jepsen saw it roughly every 300,000 transactions at rc-18. Process kills produced Lost Update under the same mode (#107).1
Jepsen has not evaluated any build after rc-22. It recommended that users halt further deployment of ParticleDB and migrate to other databases as soon as possible. Orkes told Jepsen the issues likely came from an extensive refactor in spring 2026 and that customers who stayed on an earlier version were likely unaffected.1 Orkes’s own post says: “As of ParticleDB 1.1.19, we report that all identified issues have been addressed.”8 Jepsen’s report names the build as 1.1.19-rc.13.
Sources
- Jepsen · ParticleDB 1.1.4 (Kyle Kingsbury, 2026-10-31)
- Jepsen · G1a (Aborted Read)
- Jepsen · P4 (Lost Update)
- Jepsen · G-single
- Jepsen · A5A (Read Skew)
- ParticleDB · operations modes page, durability section
- Jepsen · Stale Read
- Orkes · blog post on ParticleDB and the Jepsen findings, “What we learned from Jepsen”