1"use strict";(self.webpackChunkengula_website=self.webpackChunkengula_website||[]).push([["3726"],{6129:function(e,n,t){t.r(n),t.d(n,{default:()=>c});var i=t(2676),s=t(453);let r=t.p+"static/image/result_report.0ce522fe.png",l=t.p+"static/image/running_interface.c64fe96d.png",a=t.p+"static/image/output_log_example.9e0a3c15.png";function d(e){let n=Object.assign({h1:"h1",a:"a",h2:"h2",ul:"ul",li:"li",strong:"strong",code:"code",h3:"h3",p:"p",img:"img",table:"table",thead:"thead",tr:"tr",th:"th",tbody:"tbody",td:"td",pre:"pre"},(0,s.ah)(),e.components);return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.h1,{id:"engula-kernelcompat-kernel-compatibility-testing-tool",children:["Engula KernelCompat (Kernel Compatibility Testing Tool)",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#engula-kernelcompat-kernel-compatibility-testing-tool",children:"#"})]}),"\n",(0,i.jsxs)(n.h2,{id:"1-statement-and-conclusion",children:["1. Statement and Conclusion",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#1-statement-and-conclusion",children:"#"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Technical approach"}),": Engula implements a kernel-level storage engine replacement within the Redis kernel, reusing Redis's protocol, command processing, and client ecosystem."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Compatibility conclusion"}),": Engula 2.1 performs protocol and semantic validation using Redis 7.2 behavior as the baseline. The published pass rate, failure causes, and impact scope are governed by proof-live. Application migration typically requires no code changes or client replacement."]}),"\n"]}),"\n",(0,i.jsxs)(n.h2,{id:"2-design-goals-and-comparison-methodology",children:["2. Design Goals and Comparison Methodology",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#2-design-goals-and-comparison-methodology",children:"#"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Goal"}),": Validate the degree of compatibility between Engula 2.1 and the Redis 7.2 protocol and data structures."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Metrics"}),": Protocol compatibility, data structure compatibility."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Comparison methodology"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Use Redis 7.2's native ",(0,i.jsx)(n.code,{children:"make test"})," cases as the benchmark, employing the Redis native testing framework to ensure case consistency and reproducibility."]}),"\n",(0,i.jsx)(n.li,{children:"Compare test results item by item, tallying the pass rate and failure causes."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"21-test-metrics",children:["2.1 Test Metrics",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#21-test-metrics",children:"#"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Data structure compatibility"}),": Operational consistency of the String, Hash, List, Set, Sorted Set, Stream, Bitmap, HyperLogLog, and Geo data structures."]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"22-validation-principles",children:["2.2 Validation Principles",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#22-validation-principles",children:"#"})]}),"\n",(0,i.jsxs)(n.p,{children:["Redis uses a Tcl-based testing framework (",(0,i.jsx)(n.code,{children:"test.tcl"})," plus multiple ",(0,i.jsx)(n.code,{children:"unit/*.tcl"})," cases) to drive ",(0,i.jsx)(n.code,{children:"redis-server"})," and ",(0,i.jsx)(n.code,{children:"redis-cli"}),", executing commands over the RESP protocol and verifying the expected output. Tests are run by directly invoking ",(0,i.jsx)(n.code,{children:"runtest.tcl"}),", which supports filtering by module and tag, parallel execution, data directory isolation, and other features, ensuring reproducible results and low coupling to implementation details."]}),"\n",(0,i.jsx)(n.p,{children:"The Engula compatibility validation a
1pproach is as follows:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Select the set of Tcl cases related to the data structures (String, Hash, List, Set, Sorted Set, Stream, Bitmap, HyperLogLog, Geo), use the native test driver script ",(0,i.jsx)(n.code,{children:"runtest.tcl"})," to initiate tests on the client side, and then compare whether the expected output of the test cases matches Engula's actual responses."]}),"\n",(0,i.jsx)(n.li,{children:"Exclude tests that depend on Redis's internal memory layout or debug interfaces (debug/internal representations), which does not change compatibility for user-facing applications."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Tcl file list"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"unit/scan"}),"\n",(0,i.jsx)(n.li,{children:"unit/type/string"}),"\n",(0,i.jsx)(n.li,{children:"unit/type/incr"}),"\n",(0,i.jsx)(n.li,{children:"unit/type/list"}),"\n",(0,i.jsx)(n.li,{children:"unit/type/list-2"}),"\n",(0,i.jsx)(n.li,{children:"unit/type/list-3"}),"\n",(0,i.jsx)(n.li,{children:"unit/type/set"}),"\n",(0,i.jsx)(n.li,{children:"unit/type/zset"}),"\n",(0,i.jsx)(n.li,{children:"unit/type/hash"}),"\n",(0,i.jsx)(n.li,{children:"unit/type/stream"}),"\n",(0,i.jsx)(n.li,{children:"unit/type/stream-cgroups"}),"\n",(0,i.jsx)(n.li,{children:"unit/sort"}),"\n",(0,i.jsx)(n.li,{children:"unit/expire"}),"\n",(0,i.jsx)(n.li,{children:"unit/pubsub"}),"\n",(0,i.jsx)(n.li,{children:"unit/pubsubshard"}),"\n",(0,i.jsx)(n.li,{children:"unit/bitops"}),"\n",(0,i.jsx)(n.li,{children:"unit/bitfield"}),"\n",(0,i.jsx)(n.li,{children:"unit/geo"}),"\n",(0,i.jsx)(n.li,{children:"unit/hyperloglog"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["For more granular test items, see the ",(0,i.jsx)(n.code,{children:"output.log"})," generated by Engula KernelCompat (which contains the execution details of each case):"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)("img",{src:a,alt:"output.log example"})}),"\n",(0,i.jsxs)(n.h2,{id:"quick-usage-summary",children:["Quick Usage Summary",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#quick-usage-summary",children:"#"})]}),"\n",(0,i.jsxs)(n.table,{children:["\n",(0,i.jsxs)(n.thead,{children:["\n",(0,i.jsxs)(n.tr,{children:["\n",(0,i.jsx)(n.th,{children:"Item"}),"\n",(0,i.jsx)(n.th,{children:"Content"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.tbody,{children:["\n",(0,i.jsxs)(n.tr,{children:["\n",(0,i.jsx)(n.td,{children:"Tool overview"}),"\n",(0,i.jsx)(n.td,{children:"Validates Engula's Redis 7.2 command, protocol, and data structure compatibility based on the official Redis testing framework."}),"\n"]}),"\n",(0,i.jsxs)(n.tr,{children:["\n",(0,i.jsx)(n.td,{children:"Prerequisites"}),"\n",(0,i.jsxs)(n.td,{children:["Docker can run locally; prepare the ",(0,i.jsx)(n.code,{children:"output.log"})," and ",(0,i.jsx)(n.code,{children:"summary.html"})," output files."]}),"\n"]}),"\n",(0,i.jsxs)(n.tr,{children:["\n",(0,i.jsx)(n.td,{children:"Quick start"}),"\n",(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"docker run --user $(id -u):$(id -g) -it --rm -v $(pwd)/output.log:/montplex/output.log -v $(pwd)/summary.html:/montplex/summary.html registry.ap-southeast-1.aliyuncs.com/montplex/engula-kernel-compat:latest"})}),"\n"]}),"\n",(0,i.jsxs)(n.tr,{children:["\n",(0,i.jsx)(n.td,{children:"Interpreting output"}),"\n",(0,i.jsxs)(n.td,{children:["Use ",(0,i.jsx)(n.code,{children:"summary.html"})," for the overall pass rate and category statistics; use ",(0,i.jsx)(n.code,{children:"output.log"})," for the details of each failing case."]}),"\n"]}),"\n",(0,i.jsxs)(n.tr,{children:["\n",(0,i.jsx)(n.td,{children:"Full example"}),"\n",(0,i.jsx)(n.td,{children:'See "Running Engula KernelCompat" below.'}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"command-line-arguments",children:["Command-Line Arguments",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#command-line-arguments",children:"#"})]}),"\n",(0,i.jsxs)(n.table,{children:["\n",(0,i.jsxs)(n.thead,{children:["\n",(0,i.jsxs)(n.tr,{children:["\n",(0,i.jsx)(n.th,{children:"Argument"}),"\n",(0,i.jsx)(n.th,{children:"Purpose"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.tbody,{children:["\n",(0,i.jsxs)(n.tr,{children:["\n",(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--user $(id -u):$(id -g)"})}),"\n",(0,i.jsx)(n.td,{children:"Makes the report files owned by the current user."}),"\n"]}),"\n",(0,i.jsxs)(n.tr,{children:["\n",(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"-v $(pwd)/output.log:/montplex/output.log"})}),"\n",(0,i.jsx)(n.td,{children:"Mounts the detailed log output file."}),"\n"]}),"\n",(0,i.jsxs)(n.tr,{children:["\n",(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"-v $(pwd)/summary.html:/montplex/summary.html"})}),"\n",(0,i.jsx)(n.td,{children:"Mounts the HTML summary report output file."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.h2,{id:"3-quick-kernel-compatibility-test-engula-kernelcompat",children:["3. Quick Kernel Compatibility Test (Engula KernelCompat)",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#3-quick-kernel-compatibility-test-engula-kernelcompat",children:"#"})]}),"\n",(0,i.jsxs)(n.h3,{id:"31-download-the-testing-tool",children:["3.1 Download the Testing Tool",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#31-download-the-testing-tool",children:"#"})]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Docker image"}),": ",(0,i.jsx)(n.code,{children:"registry.ap-southeast-1.aliyuncs.com/montplex/engula-kernel-compat:latest"})]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"32-environment-requirements",children:["3.2 Environment Requirements",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#32-environment-requirements",children:"#"})]}),"\n",(0,i.jsx)(n.p,{children:"Engula KernelCompat is provided as a Docker image and can run on Linux or macOS with Docker installed. The recommended environment is as follows:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"CentOS version ⥠7.9"}),"\n",(0,i.jsx)(n.li,{children:"Ubuntu version ⥠18.04"}),"\n",(0,i.jsxs)(n.li,{children:["The official Docker version is recommended (",(0,i.jsx)(n.a,{href:"https://docs.docker.com/engine/install/",target:"_blank",rel:"noopener noreferrer",children:"installation guide"}),"; prepare the image in advance if network access is slow)"]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"33-running-engula-kernelcompat",children:["3.3 Running Engula KernelCompat",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#33-running-engula-kernelcompat",children:"#"})]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker pull registry.ap-southeast-1.aliyuncs.com/montplex/engula-kernel-compat:latest\n\n# In any folder\nmkdir tmp_test && cd tmp_test\ntouch output.log\ntouch summary.html\n\ndocker run --user $(id -u):$(id -g) -it --rm \\\n -v $(pwd)/output.log:/montplex/output.log \\\n -v $(pwd)/summary.html:/montplex/summary.html \\\n registry.ap-southeast-1.aliyuncs.com/montplex/engula-kernel-compat:latest\n"})}),"\n",(0,i.jsx)(n.p,{children:"Running interface illustration:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)("img",{src:l,alt:"Running interface illustration"})}),"\n",(0,i.jsxs)(n.h3,{id:"34-viewing-the-results",children:["3.4 Viewing the Results",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#34-viewing-the-results",children:"#"})]}),"\n",(0,i.jsxs)(n.p,{children:["After the run completes, a ",(0,i.jsx)(n.code,{children:"summary.html"})," file is generated, which can be opened in a browser to view the results."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)("img",{src:r,alt:"Result report"})}),"\n",(0,i.jsx)(n.p,{children:"The report includes:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Compatibility pass statistics"}),"\n",(0,i.jsx)(n.li,{children:"Major and minor category breakdowns of passing commands"}),"\n"]}),"\n",(0,i.jsxs)(n.h2,{id:"4-faq",children:["4. FAQ",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#4-faq",children:"#"})]}),"\n",(0,i.jsxs)(n.h3,{id:"is-this-the-full-set-of-data-structure-cases-have-any-been-removed",children:["Is this the full set of data structure cases? Have any been removed?",(0,i.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#is-this-the-full-set-of-data-structure-cases-have-any-been-removed",children:"#"})]}),"\n",(0,i.jsx)(n.p,{children:"Yes, some have been removed. Some debug-type test cases rely on Redis's original internal data structures for testing. Because Engula's storage format differs from Redis's, these cases have been converted to the format of Engula's in-memory storage. Such cases generally do not affect Redis usage and do not affect Redis compatibility."})]})}function o(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:n}=Object.assign({},(0,s.ah)(),e.components);return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}let c=o;o.__RSPRESS_PAGE_META={},o.__RSPRESS_PAGE_META["en%2Fdocs%2Ftools%2Fkernelcompat.md"]={toc:[{text:"1. Statement and Conclusion",id:"1-statement-and-conclusion",depth:2},{text:"2. Design Goals and Comparison Methodology",id:"2-design-goals-and-comparison-methodology",depth:2},{text:"2.1 Test Metrics",id:"21-test-metrics",depth:3},{text:"2.2 Validation Principles",id:"22-validation-principles",depth:3},{text:"Quick Usage Summary",id:"quick-usage-summary",depth:2},{text:"Command-Line Arguments",id:"command-line-arguments",depth:3},{text:"3. Quick Kernel Compatibility Test (Engula KernelCompat)",id:"3-quick-kernel-compatibility-test-engula-kernelcompat",depth:2},{text:"3.1 Download the Testing Tool",id:"31-download-the-testing-tool",depth:3},{text:"3.2 Environment Requirements",id:"32-environment-requirements",depth:3},{text:"3.3 Running Engula KernelCompat",id:"33-running-engula-kernelcompat",depth:3},{text:"3.4 Viewing the Results",id:"34-viewing-the-results",depth:3}
1,{text:"4. FAQ",id:"4-faq",depth:2},{text:"Is this the full set of data structure cases? Have any been removed?",id:"is-this-the-full-set-of-data-structure-cases-have-any-been-removed",depth:3}],title:"Engula KernelCompat (Kernel Compatibility Testing Tool)",headingTitle:"Engula KernelCompat (Kernel Compatibility Testing Tool)",frontmatter:{}}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.