
Jepsen-आधारित DuckDB के लिए लेन-देन संबंधी सहीता परीक्षण ढांचा, यादृच्छिक कार्यभार और Elle जांचकर्ता के माध्यम से G2-item और SSI उल्लंघन जैसे पृथक्करण विसंगतियों का पता लगाता है।
Jepsen tests for the DucKDB database. यह एक रिमोट क्लस्टर के बजाय स्थानीय रूप से चलता है। यह परीक्षण स्थानीय प्रक्रियाओं का एक समूह उत्पन्न करता है जो स्थानीय रूप से एक DuckDB फ़ाइल खोलते हैं, और उनके साथ STDIN/STDOUT पर इंटरैक्ट करता है।
यह एक प्रारंभिक प्रोटोटाइप है। यह चालू होता है, लेन-देन चलाता है, उनकी सत्यता की जांच करता है, और बग रिपोर्ट करता है, लेकिन मुझे यकीन नहीं है कि वे बग वास्तविक हैं या नहीं।
आपको JDK (21+), Git, Gnuplot, Graphviz, और Leiningen की आवश्यकता होगी। अधिकांश Jepsen परीक्षणों के विपरीत, यह पूरी तरह से स्थानीय रूप से चलता है; आपको मशीनों का क्लस्टर, SSH कुंजियाँ आदि की आवश्यकता नहीं है।
sudo apt install openjdk leiningen gnuplot graphviz
brew install openjdk leiningen gnuplot graphviz
परीक्षण चलाने के लिए, प्रयास करें:
lein run test
DuckDB (मुझे संदेह है) डिफ़ॉल्ट रूप से स्ट्रॉन्ग SI प्रदान करता है, और परीक्षण यही जांचता है। हालांकि, यह G2-item की अनुमति देता है, जो रिपीटेबल रीड का उल्लंघन है। इसे प्रदर्शित करने के लिए, प्रयास करें:
lein run test --time-limit 10 --expected-consistency-model serializable --max-writes-per-key 8
हम दस सेकंड के लिए परीक्षण करने, सीरियलाइज़ेबिलिटी के उल्लंघनों की तलाश करने, और (छोटे, पढ़ने योग्य उदाहरण उत्पन्न करने के लिए) प्रति कुंजी केवल 8 तत्व लिखने का अनुरोध कर रहे हैं। G2-item के उदाहरण store/latest/elle/G2-item में उपलब्ध होने चाहिए।
कई ट्यूनिंग विकल्प उपलब्ध हैं। विभिन्न विकल्पों के लिए सहायता lein run test --help के माध्यम से उपलब्ध है।
परीक्षण परिणाम store/<test-name>/<date>/ में लिखे जाते हैं, और store/latest के रूप में सिमलिंक किए जाते हैं। इनमें से प्रत्येक परीक्षण निर्देशिका स्व-निहित है; आप इसे कॉपी कर सकते हैं, टार कर सकते हैं, बाद में विश्लेषण कर सकते हैं, हटा सकते हैं, इत्यादि। आप परिणाम ब्राउज़ करने के लिए एक वेब सर्वर भी चला सकते हैं।
lein run serve
एक REPL उपलब्ध है; lein repl देखें।
परीक्षण हार्नेस इस निर्देशिका में है; इसकी प्रोजेक्ट फ़ाइल project.clj है, इसका स्रोत src/ में है, इत्यादि।
परीक्षण हार्नेस एक अलग प्रोग्राम चलाता है, "local node", जो DuckDB लाइब्रेरी को एम्बेड करता है और उसके विरुद्ध लेन-देन करता है। परीक्षण हार्नेस दिए गए वर्कलोड के लिए यादृच्छिक लेन-देन उत्पन्न करता है, उन्हें HTTP पर लोकल नोड को सबमिट करता है, और उन लेन-देन के परिणामों को जर्नल करता है, अंत में विभिन्न लेन-देन संबंधी विसंगतियों की जांच करता है। हम एले चेकर (https://github.com/jepsen-io/elle) का उपयोग करके स्ट्रॉन्ग स्नैपशॉट आइसोलेशन की तलाश करते हैं।
लोकल नोड में एक छोटा HTTP सर्वर है जो परीक्षण हार्नेस से अमूर्त लेन-देन (जैसे "read key x, then set y to 5") प्राप्त करता है, और उन्हें DuckDB JDBC ड्राइवर के विरुद्ध चलने वाले लेन-देन में अनुवादित करता है।
हम एक प्रकार की खराबी इंजेक्ट कर सकते हैं: प्रक्रिया को मारना।
हमारे पास दो वर्कलोड हैं।
पहला, append, ऐसे लेन-देन चलाता है जो सूचियों में अद्वितीय पूर्णांक जोड़ते हैं, और उन सूचियों की सामग्री पढ़ते हैं। प्रत्येक सूची एक एकल पंक्ति में रहती है, जो कई तालिकाओं में फैली होती है। सूचियों की पहचान प्राथमिक कुंजी या एक अनुक्रमित द्वितीयक कुंजी द्वारा की जाती है। सूचियाँ या तो टेक्स्ट फ़ील्ड या DuckDB INTEGER{]} सूचियों के रूप में एन्कोडेड होती हैं। उत्परिवर्तन INSERT ON CONFLICT UPDATE या MERGE INTO के साथ किया जाता है।
दूसरा, fkey-register, पूर्णांक रजिस्टरों को पढ़ना और लिखना करता है। DuckDB में, हम उन रजिस्टरों को दो तालिकाओं में संग्रहीत करते हैं। एक logical तालिका, एक विदेशी कुंजी के साथ, कुंजियों को भौतिक ID में मैप करती है। एक physical तालिका भौतिक ID को मानों में मैप करती है। हम पढ़ने के लिए दोनों के बीच एक सीधा JOIN का उपयोग करते हैं। लेखन या तो भौतिक पंक्ति को अपडेट करके, या एक नई भौतिक पंक्ति बनाकर और उसके लिए लॉजिकल पॉइंटर को बदलकर किया जाता है। मैंने आज ही इस वर्कलोड को चालू किया; यह चलता है, लेकिन यह अभी तक पॉलिश नहीं हुआ है।
Copyright © 2026 Jepens, LLC
This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which is available at https://www.eclipse.org/legal/epl-2.0.
This Source Code may also be made available under the following Secondary Licenses when the conditions for such availability set forth in the Eclipse Public License, v. 2.0 are satisfied: GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version, with the GNU Classpath Exception which is available at https://www.gnu.org/software/classpath/license.html.