PageSourceSearch

https://montplex.com/static/js/async/1343.337e4220.js

js montplex.com collected 2026-10-03 21:16:11 UTC 94,259 bytes, 9 lines download raw bytes

1"use strict";(self.webpackChunkengula_website=self.webpackChunkengula_website||[]).push([["1343"],{9905:function(e,t,s){s.d(t,{Z:()=>e5});var a=s(2676),r=s(5271),l=s(7203),i=s(9547),n=s(3496),d=s(1071),o=s(726);function c(e){let{data:t,loading:s=!1}=e,r=(0,o.Xo)().proof.hero,i=(0,o.bh)(),{runtest:c,snapshot:m}=t,p=c.totalSubtests??0,x=c.passedSubtests??0,h=c.failedSubtests??Math.max(0,p-x),f=p>0?Math.round(x/p*1e4)/100:0,g=s?"—":String(x),b=s?"—":String(p),v=s?"—":String(h),y=s?"—":`${f.toFixed(2)}%`,j=s?"—":c.runId||"—",S=s?"—":function(e){if(!e)return"—";let t=Math.floor(e/60),s=e%60;return s>0?`${t}m${s}s`:`${t}m`}(c.durationSec);return(0,a.jsx)("header",{"data-cmp":"ProofHero",className:"pt-44 pb-16 md:pt-48 md:pb-20",children:(0,a.jsx)(l.W2,{children:(0,a.jsxs)("div",{className:"mx-auto max-w-4xl text-center",children:[(0,a.jsx)(d.E.p,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},transition:{duration:.4},className:"section-kicker",children:r.kicker}),(0,a.jsx)(d.E.h1,{initial:{opacity:0,y:12},animate:{opacity:1,y:0},transition:{duration:.5,delay:.05},className:"font-display text-4xl md:text-6xl font-bold tracking-tight text-text",style:"en"===i?{lineHeight:1.15,fontSize:"clamp(1.35rem, 3.2vw, 1.75rem)"}:{lineHeight:1.15,fontSize:"clamp(1.9rem, 4.8vw, 2.7rem)"},children:r.title}),(0,a.jsxs)(d.E.p,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},transition:{duration:.5,delay:.1},className:"mt-5 text-base md:text-lg text-muted text-pretty",children:[r.introBefore," ",(0,a.jsx)("span",{className:"tabular-nums text-text",children:g})," ","/"," ",(0,a.jsx)("span",{className:"tabular-nums text-text",children:b})," ",r.introMid,(0,a.jsx)("span",{className:"tabular-nums text-text",children:y}),(0,a.jsx)(l.On,{children:r.introAfter})]}),(0,a.jsx)(d.E.p,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},transition:{duration:.5,delay:.12},className:"mx-auto mt-3 max-w-3xl text-sm leading-relaxed text-muted",children:r.subIntro}),(0,a.jsxs)(d.E.div,{initial:{opacity:0,y:12},animate:{opacity:1,y:0},transition:{duration:.5,delay:.15},className:"mt-10 grid grid-cols-1 sm:grid-cols-3 gap-3",children:[(0,a.jsx)(u,{label:r.statCoverage,value:b,hint:r.statCoverageHint}),(0,a.jsx)(u,{label:r.statPassed,value:g,hint:r.statPassedHint(s?"—":f.toFixed(2)),positive:!0}),(0,a.jsx)(u,{label:r.statFailed,value:v,hint:r.statFailedHint})]}),(0,a.jsxs)(d.E.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},transition:{duration:.5,delay:.2},className:"mt-6 font-mono text-[0.72rem] tracking-wider text-muted",children:[r.runPrefix,j," \xb7 ",r.durationPrefix," ",S," ","\xb7"," ",(0,a.jsx)(n.rU,{href:"https://github.com/redis/redis/tree/7.2.11/tests",target:"_blank",rel:"noopener noreferrer",className:"hover:underline text-text",children:r.sourceLink})]}),(0,a.jsxs)(d.E.div,{initial:{opacity:0,y:12},animate:{opacity:1,y:0},transition:{duration:.5,delay:.25},className:"mt-8 flex flex-wrap items-center justify-center gap-3",children:[(0,a.jsx)(n.rU,{href:"#live-proof",className:"inline-flex min-h-[44px] items-center justify-center rounded-xl bg-text px-5 py-2 text-sm font-medium text-[var(--cs-bg)] transition-opacity hover:opacity-90",children:r.ctaLive}),(0,a.jsx)("a",{href:m.resultsHref||"/proof",target:"_blank",rel:"noopener noreferrer",className:"inline-flex min-h-[44px] items-center justify-center rounded-xl border border-line px-5 py-2 text-sm font-medium text-text transition-colors hover:bg-card",children:r.ctaFull})]})]})})})}function u(e){let{label:t,value:s,hint:r,positive:l=!1}=e;return(0,a.jsxs)("div",{className:"surface-card px-5 py-6",children:[(0,a.jsx)("div",{className:"font-mono text-[0.65rem] tracking-[0.22em] uppercase text-muted",children:t}),(0,a.jsx)("div",{className:"mt-2 font-display text-3xl md:text-4xl font-bold tabular-nums",style:{color:l?"rgb(22,163,74)":"var(--cs-text)"},children:s}),r&&(0,a.jsx)("div",{className:"mt-1 text-xs text-muted",children:r})]})}var m=s(6606);function p(e){let{data:t,loading:s=!1}=e,r=(0,o.Xo)().proof.summary,{runtest:i,snapshot:d}=t,c=i.totalSubtests??m.$G.totalSubtests,u=i.passedSubtests??m.$G.passedSubtests,p=i.failedSubtests??Math.max(0,c-u),x=c>0?`${(u/c*100).toFixed(2)}%`:m.$G.passRate,h=i.units.filter(e=>"fail"===e.status).reduce((e,t)=>
1{var s;return e+((null==(s=t.failedSubtests)?void 0:s.length)??0)},0),f=[{label:r.compat,value:s?"—":x,detail:s?"":r.compatDetail(u,c),href:"#runtest"},{label:r.failures,value:s?"—":`${h||p}`,detail:r.failuresDetail,href:"#runtest-failures"},{label:r.rdb,value:`${m.oG.bgsaveSpeedup} / ${m.oG.rdbLoadSpeedupMax}`,detail:r.rdbDetail,href:"#rdb"},{label:r.live,value:s?"—":d.latestRunId||"—",detail:s?r.liveDetailAuto:d.latestRunAt?r.liveDetailAt(d.latestRunAt):r.liveDetailAuto,href:"#live-proof"}];return(0,a.jsx)("section",{"data-cmp":"ProofSummary",className:"pb-4",children:(0,a.jsx)(l.W2,{children:(0,a.jsx)("div",{className:"mx-auto grid max-w-[var(--max-w)] grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4",children:f.map(e=>(0,a.jsxs)(n.rU,{href:e.href,className:"surface-card block p-5 transition-colors hover:bg-bg",children:[(0,a.jsx)("p",{className:"font-mono text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-muted",children:e.label}),(0,a.jsx)("div",{className:"mt-3 font-display text-2xl font-bold tabular-nums text-text",children:e.value}),(0,a.jsx)("p",{className:"mt-2 text-sm leading-relaxed text-muted",children:e.detail})]},e.label))})})})}var x=s(8597);let h={"unit/type/incr":{reason:"engula 把 keyspace 字符串值统一指向独立对象(携带 embedded key + expire),不复用 0-9999 的共享整数池;redis 在非 LFU/LRU 策略下会复用。",impact:"\uD83D\uDFE2 零业务影响:INCR 返回值与并发安全完全等价;仅 OBJECT REFCOUNT 报 1(redis 报 ≥2),是内存池 introspection 差异。",status:"noted"},"unit/type/set":{reason:"小 set 在 engula 上一旦经过 hashtable 转换就停在 hashtable 编码,没有 hashtable → listpack 的回退路径;hashtable 桶链探测序列也与 redis dict.c 不同。",impact:"\uD83D\uDFE2 零业务影响:SMOVE / SRANDMEMBER 行为完全等价。8GB set 类型实测 engula 比 redis 仍少 21% 内存(5120 vs 6503 MB)。",status:"noted"},"unit/other":{reason:"redis 在 fork 出 BGSAVE 子进程期间会跳过 dict rehash 以避免 COW 翻倍;engula 用渐进式扩容,没有显式的 child-running 门闩。",impact:"\uD83D\uDFE1 理论上 BGSAVE 期间 rehash 可能导致 COW 翻倍;但 engula 实测 8GB BGSAVE 期间 usedMemory 是 redis 的 55%(4134 vs 7485 MB),整体仍优。建议补门闩作为额外安全 net。",status:"noted"},"integration/rdb":{reason:"测试断言重启后 INFO persistence 含 rdb_last_load_keys_loaded / rdb_last_load_keys_expired 两个计数;engula 的 rdbLoad() 没暴露这两个 stat。",impact:"\uD83D\uDFE1 数据正确性 OK(过期键正常丢弃);监控仪表盘抓这两个字段会拿不到值。低成本工程修复。",status:"noted"},"integration/psync2-master-restart":{reason:"redis 用 RDB aux fields 在持久化时保存 repl-id / repl-offset,重启后基于 aux 做 partial resync;engula 当前对 RDB aux 写入与重启时回放的覆盖度需要核对。",impact:"\uD83D\uDD34 master 重启场景的真实痛点:失败会强制 replica full resync,大数据集下分钟级不可读 + 全量带宽消耗。建议高优先级修复。",status:"noted"},"unit/maxmemory":{reason:"失败收敛三类:A 小整数共享池(与 incr 同源,engula createStringObjectFromLongLongForValue 永不共享);B volatile-* 策略且无易失键时未按 redis 返回 OOM 拒写;C client 查询缓冲 / replica 输出缓冲 / tracking 推送的淘汰记账(mem_not_counted_for_evict)边界与 redis 不同。",impact:"\uD83D\uDFE1 边界 / 监控可见:A 仅 introspection 差异(\uD83D\uDFE2);B 属 volatile-* 反模式配置;C 极端缓冲场景下淘汰时机/错误码与 redis 不同,正常负载不受影响。",status:"noted"},"unit/memefficiency":{reason:"Active defrag 全家(含 big keys / big list / edge case / eval scripts)卡在前置断言 assert {frag >= 1.4}:engula 分配器不产生 jemalloc 式外部碎片,allocator_frag_ratio 远低于 1.4,active defrag 无碎片可整理。",impact:"\uD83D\uDFE2 零业务影响:engula 分配器设计本质免疫碎片,active-defrag 体系不适用;perf-3.5 实测 8GB 内存占用仍优于 redis。",status:"noted"},"unit/tracking":{reason:"eviction 触发时 invalidation push 没在触发命令的 reply buffer flush 之前发出 —— GETBIT 的响应已经送给客户端,invalidate volatile-key 的推送丢失。",impact:"\uD83D\uDD34 启用 RESP3 client tracking(如 Lettuce 默认)的应用会在 eviction 窗口里读到本地缓存的陈旧值;不启用 tracking 不受影响。建议高优先级。",status:"noted"}};function f(e){return h[e]||{reason:"补充中",impact:"补充中",status:"placeholder"}}var g=s(7902);let b="%c[proof-demo]",v="color:#fff;background:#626262;padding:1px 5px;border-radius:3px",y="proof-demo:debug",j=function(){try{if("undefined"!=typeof window){let e=window.localStorage.getItem(y);if("1"===e)return!0}}catch{}return!1}();function S(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];j&&console.log(b,v,...t)}function B(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];j&&console.warn(b,v,...t)}if("undefined"!=typeof window){let e=window;e.DEBUG_ON=function(){j=!0;try{window.localStorage.setItem(y,"1")}catch{}console.log(b,v,"debug ON(已持久化,刷新仍生效)。DEBUG_OFF() 关闭。")},e.DEBUG_OFF=function(){j=!1;try{window.localStorage.setItem(y,"0")}catch{}console.log(b,v,"debug OFF(已持久化)。DEBUG_ON() 打开。")},j&&console.log(b,v,"debug 默认开启(开发模式)。控制台输入 DEBUG_OFF() 关闭;生产默认关闭。")}let M=[{id:"runtest",label:"Run test",subItemId:"1.1"},{id:"moduleapi",label:"Module API",subItemId:"1.16"},{id:"sentinel",label:"Sentinel",subItemId:"1.14"},{id:"cluster",label:"Cluster",subItemId:"1.15"}];async function k(e,t){let s=await fetch(`${(0,g.r9)()}${e}`,{cache:"no-store",signal:t});if(!s.ok)throw Error(`${e} ${s.status}`);return await s.json()}function N(e,t){return k(`/report-json/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)}let w=e=>Math.round(100*e)/100,$={jedis:"jedis_version","redis-py":"redis_py_version","go-redis":"go_redis_version","node-redis":"node_redis_version"}
1,F=e=>e.toUpperCase().replace("GB","G");function R(e,t){let s=new Map;for(let t of e){let e=`${t.maxMemory}|${t.type}`,a=s.get(e)??{};"engula"===t.db?a.engula=t:a.redis=t,s.set(e,a)}let a=[];return s.forEach((e,s)=>{if(!e.engula||!e.redis)return;let[r,l]=s.split("|"),i="save"===t?e.engula.saveTimeSec:e.engula.loadTimeSec,n="save"===t?e.redis.saveTimeSec:e.redis.loadTimeSec,d=n/i;a.push({dimensions:{datasetSize:F(r),type:l,op:t},unit:"s",lowerIsBetter:!0,engula:i,baseline:n,ratio:w(d),verdict:d>=1?"pass":"fail"})}),a}function _(e){return"mixed-deploy"===e?"mixed":e}async function T(e,t){try{let s=await t;return S("fetch ✓",e),s}catch(t){return B("fetch ✗",e,"→ 该段回退静态 mock",(null==t?void 0:t.message)??t),null}}async function P(e){var t,s,a,r,l,i,n;S("开始拉取真实 proof-web API(经 /proof-api 反代)…");let[d,o,c,u,m,p,x,h,g]=await Promise.all([Promise.all(M.map(e=>T(`compat/${e.id}`,N("compat",e.id)))),T("perf/throughput",N("perf","throughput")),T("perf/rdb-save-load",N("perf","rdb-save-load")),Promise.all(e.clients.items.map(e=>T(`client/${e.id}`,N("client",e.id)))),Promise.all(e.compatSubsuites.map(e=>T(`compat/${e.id}`,N("compat",e.id)))),Promise.all(e.haScenarios.map(e=>T(`ha/${_(e.id)}`,N("ha",_(e.id))))),T("platform/linux-x86_64",N("platform","linux-x86_64")),T("logs/runs?compat",k("/logs/runs?suite_name=compat&limit=1")),T("hardware-info",k("/hardware-info"))]),y=M.map((e,t)=>({cfg:e,blob:d[t]})).filter(e=>!!e.blob),F=(null==(t=y.find(e=>"runtest"===e.cfg.id))?void 0:t.blob)??null,P=null==h||null==(a=h.runs)||null==(s=a[0])?void 0:s.run_id,C=function(e){if(!e||"object"!=typeof e)return null;let t={};for(let[s,a]of Object.entries(e))"$comment"!==s&&"string"==typeof a&&a.trim()&&(t[s]=a);return Object.keys(t).length?t:null}(g),E={},I={};function D(e,t){try{let s=t();if(void 0===s){I[e]="MOCK(静态兜底\xb7无 API 数据)";return}E[e]=s,I[e]="API(真实接口)"}catch(t){I[e]="MOCK(转换异常)",B("transform ✗",e,(null==t?void 0:t.message)??t)}}D("hardware",()=>C??void 0),D("meta",()=>{var t,s,a,r;return o||F||P||C?(t=o??{},s=F??{raw:{sub_tests:[]}},a=e.meta,{...a,machineSpec:function(e){if(!e)return;let t=[e.cpu,e.os,e.ecs].filter(e=>!!e&&e.trim().length>0);return t.length?t.join(" \xb7 "):void 0}(C)??a.machineSpec,engulaBinary:(null==C?void 0:C.engula_ver)??a.engulaBinary,redisVersion:(null==C?void 0:C.redis_ver)??function(e){if(!e)return;let t=e.match(/v=([0-9][0-9.]*)/);return t?`Redis ${t[1]}`:void 0}(null==(r=t.environment)?void 0:r.redis_version)??a.redisVersion,runtestRunId:P??a.runtestRunId,runtestDurationSec:null!=s.duration_ns?Math.round(s.duration_ns/1e9):a.runtestDurationSec,fetchedAt:new Date().toISOString()}):void 0});let A=y.length?function(e,t,s,a,r){let l=e.map(e=>{let{cfg:t,blob:s}=e,a=s.raw,r="number"==typeof a.total_ok_count?a.total_ok_count:0,l="number"==typeof a.total_err_count?a.total_err_count:0,i=a.sub_tests.map(e=>{var s;let a="pass"===(s=e.status)||"fail"===s||"running"===s?s:"skipped"===s||"skip"===s?"skip":"fail";if("fail"!==a)return{name:e.name,status:a,group:t.id};let r=Array.from(new Set((e.message??"").split("; ").map(e=>e.replace(/\s+in tests\/.*$/,"").trim()).filter(Boolean))),l=f(e.name);return{name:e.name,status:a,group:t.id,failedCount:r.length||void 0,failedSubtests:r.length?r:void 0,reason:l.reason,impact:l.impact}});return{group:{id:t.id,label:t.label,subItemId:t.subItemId,verdict:"pass"===s.status?"pass":"fail",totalUnits:a.sub_tests.length,passedUnits:a.passed,failedUnits:a.failed,totalSubtests:r+l,passedSubtests:r,failedSubtests:l,durationSec:null!=s.duration_ns?Math.round(s.duration_ns/1e9):void 0},units:i}}),i=l.map(e=>e.group),n=l.flatMap(e=>e.units),d=e=>i.reduce((t,s)=>t+e(s),0);return{groups:i,runtest:{...t,totalUnits:d(e=>e.totalUnits),passedUnits:d(e=>e.passedUnits),failedUnits:d(e=>e.failedUnits),totalSubtests:d(e=>e.totalSubtests),passedSubtests:d(e=>e.passedSubtests),failedSubtests:d(e=>e.failedSubtests),durationSec:d(e=>e.durationSec??0)||t.durationSec,runId:a??t.runId,redisVersion:s??t.redisVersion,binary:r??t.binary,units:n}}}(y,e.runtest,null==(r=E.meta)?void 0:r.redisVersion,P,null==C?void 0:C.engula_ver):null;D("runtest",()=>null==A?void 0:A.runtest),D("runtestGroups",()=>null==A?void 0:A.groups),D("clients",()=>{if(!u.some(Boolean))return;let t=e.clients.items.map((e,t)=>{let s=u[t];return s?function(e,t){var s,a,r;let l=null==(s=t.raw)?void 0:s.gate;if(!l)return e;let i=$[e.id],n=i?null==(a=t.raw)?void 0:a[i]:void 0;return{...e,verdict:l.Pass?"pass":"fail",passRate:l.CompatPassRate,passed:l.EngulaPassedAmongRedisPassed,total:l.RedisPassedSpecs,engulaOnlyFailures:l.EngulaOnlyFailures,sharedFailures:Array.isArray(null==(r=t.raw)?void 0:r.shared_failures)?t.raw.shared_failures.length:0,version:"string"==typeof n&&n.trim()?n:e.version}}(e,s):e});return{summary:{totalSdks:t.length,passedSdks:t.filter(e=>"pass"===e.verdict).length},items:t}}),D("compatSubsuites",()=>m.some(Boolean)?e.compatSubsuites.map((e,t)=>{let s=m[t];return s?function(e,t){var s;let a,r,l=(null==(s=t.raw)?void 0:s.result)??{};return(l.sub_tests&&"number"==typeof l.sub_tests.total?(a=l.sub_tests.passed,r=l.sub_tests.total):"number"==typeof l.supported?(a=l.supported,r=l.total_redis??l.total_engula??l.supported):"number"==typeof l.match&&(a=l.match,r=l.total),null==a||null==r)?e:{...e,passed:a,total:r,verdict:"pass"===t.status?"pass":"fail"}}
1(e,s):e}):void 0),D("perfMatrix",()=>{var e,t;return(null==o||null==(t=o.raw)||null==(e=t.results)?void 0:e.length)?function(e){let t=new Map;for(let s of e){let e=`${s.ratio??"2:8"}|${s.ioThreads}|${s.valueLength}`,a=t.get(e)??{};"engula"===s.db?a.engula=s:a.redis=s,t.set(e,a)}let s=[];return t.forEach(e=>{if(!e.engula||!e.redis)return;let t=e.engula.ioThreads,a=e.engula.valueLength,r=e.engula.ops/e.redis.ops,l=e.engula.p99,i=e.redis.p99;s.push({dimensions:{threads:t,valueSize:a,writeRatio:e.engula.ratio??"2:8"},unit:"ops/s",lowerIsBetter:!1,engula:e.engula.ops,baseline:e.redis.ops,ratio:w(r),verdict:r>=1?"pass":"fail",secondary:null!=l&&null!=i?{label:"P99",unit:"ms",lowerIsBetter:!0,engula:l,baseline:i,ratio:w(i/l)}:void 0})}),s}(o.raw.results):void 0});let L=(null==c||null==(i=c.raw)||null==(l=i.results)?void 0:l.length)?c.raw.results:null;D("rdbMatrix",()=>L?R(L,"save"):void 0),D("rdbLoadMatrix",()=>L?R(L,"load"):void 0),D("memMatrix",()=>L?function(e){let t=e.filter(e=>"8gb"===e.maxMemory),s=[];for(let e of["string","hash","set"]){let a=t.find(t=>"engula"===t.db&&t.type===e),r=t.find(t=>"redis"===t.db&&t.type===e);if(!a||!r)continue;let l=r.usedMemoryMB/a.usedMemoryMB;s.push({dimensions:{type:e,datasetSize:"8G"},unit:"MB",lowerIsBetter:!0,engula:a.usedMemoryMB,baseline:r.usedMemoryMB,ratio:w(l),verdict:l>=1?"pass":"fail"})}return s}(L):void 0);let G=p.some(Boolean)?e.haScenarios.map((e,t)=>{let s=p[t];return s?{...e,verdict:"pass"===s.status?"pass":"fail"}:e}):null;D("haScenarios",()=>G??void 0),D("haSummary",()=>G?{total:e.haSummary.total,passed:G.filter(e=>"pass"===e.verdict).length,items:G.map(e=>({subItemId:e.id,name:e.title,status:e.verdict,summary:e.headline}))}:void 0);let U=function(e){if(Array.isArray(e)&&0!==e.length)return e.map(e=>({id:String(e.platform_id??""),image:String(e.docker_image??e.platform_id??""),arch:String(e.arch??""),glibc:e.glibc_version?String(e.glibc_version):void 0,status:"pass"===e.status?"pass":"fail"}))}(null==x||null==(n=x.raw)?void 0:n.checks),O=x?e.platformItems.map(e=>{var t;return"linux-x86_64"===e.id?{...e,verdict:(null==(t=x.raw)?void 0:t.overall_status)==="pass"||"pass"===x.status?"pass":"fail",osChecks:U??e.osChecks}:e}):null;return D("platformItems",()=>O??void 0),D("platformSummary",()=>O?{total:e.platformSummary.total,passed:O.filter(e=>"pass"===e.verdict).length,items:O.map(e=>({subItemId:e.id,name:e.title,status:e.verdict,summary:e.headline}))}:void 0),j&&(console.log(b,v,"各 section 数据来源(API = 真实接口;MOCK = 静态 src/data/proof/*.json)"),console.table(I)),E}var C=s(5741),E=JSON.parse('{"Sp":{"totalSdks":4,"passedSdks":4},"ev":[{"id":"jedis","name":"Jedis","language":"Java","version":"v6.2.0","verdict":"pass","passRate":0.999,"passed":8661,"total":8670,"engulaOnlyFailures":9,"sharedFailures":0,"runId":"client-2.1-jedis-logs/20260427T162509"},{"id":"redis-py","name":"redis-py","language":"Python","version":"master","verdict":"pass","passRate":0.9991,"passed":3275,"total":3278,"engulaOnlyFailures":3,"sharedFailures":16,"runId":"client-2.2-redis-py-logs/20260427T184525"},{"id":"go-redis","name":"go-redis","language":"Go","version":"v9.3.1","verdict":"pass","passRate":1.0,"passed":580,"total":580,"engulaOnlyFailures":0,"sharedFailures":89,"runId":"client-2.3-go-redis-logs/20260427T195718"},{"id":"node-redis","name":"node-redis","language":"Node.js","version":"stable","verdict":"pass","passRate":1.0,"passed":2139,"total":2139,"engulaOnlyFailures":0,"sharedFailures":0,"runId":"client-2.4-node-redis-logs/20260427T200043"}]}'),I=JSON.parse('{"e":[{"id":"coverage","title":"Coverage","subtitle":"命令覆盖","passed":370,"total":370,"verdict":"pass","extra":"Coverage rate 100.0% \xb7 Engula 382 commands \xb7 Supported 370 / Unsupported 0","runId":"compat-1.2-coverage-logs/20260427T194628"},{"id":"protocol","title":"Protocol","subtitle":"RESP2 + RESP3","passed":50,"total":50,"verdict":"pass","extra":"RESP2 25/25 match \xb7 RESP3 25/25 match \xb7 0 mismatches","runId":"compat-1.3-protocol-logs/20260427T194629"},{"id":"lua","title":"Lua","subtitle":"EVAL / FCALL","passed":23,"total":23,"verdict":"pass","runId":"compat-1.4-lua-logs/20260427T194630"},{"id":"transaction","title":"Transaction","subtitle":"MULTI / EXEC / WATCH","passed":12,"total":12,"verdict":"pass","runId":"compat-1.5-transaction-logs/20260427T194632"},{"id":"pubsub","title":"Pub/Sub","subtitle":"频道 / 模式订阅","passed":12,"total":12,"verdict":"pass","runId":"compat-1.6-pubsub-logs/20260427T194634"},{"id":"stream","title":"Stream","subtitle":"XADD / XREAD / XGROUP","passed":15,"total":15,"verdict":"pass","runId":"compat-1.7-stream-logs/20260427T194640"},{"id":"persistence","title":"Persistence","subtitle":"RDB 持久化","passed":10,"total":10,"verdict":"pass","runId":"compat-1.8-persistence-logs/20260427T194642"},{"id":"errors","title":"Errors","subtitle":"错误码 / WRONGTYPE","passed":10,"total":10,"verdict":"pass","runId":"compat-1.9-errors-logs/20260427T194715"},{"id":"modules","title":"Modules","subtitle":"BloomFilter / RedisJSON 等","passed":25,"total":25,"verdict":"pass","runId":"compat-1.10-modules-logs/20260427T194716"}
1,{"id":"acl","title":"ACL","subtitle":"访问控制","passed":14,"total":14,"verdict":"pass","runId":"compat-1.11-acl-logs/20260427T194717"},{"id":"config","title":"Config","subtitle":"CONFIG GET/SET 行为","passed":8,"total":8,"verdict":"pass","extra":"Common keys 190 \xb7 Value matches 185 \xb7 SET matches 22 \xb7 168 项无测试值跳过","runId":"compat-1.12-config/20260427T194719"},{"id":"keyspace","title":"Keyspace","subtitle":"Notification 通道","passed":7,"total":7,"verdict":"pass","runId":"compat-1.13-keyspace-logs/20260427T194720"}]}'),D=JSON.parse('{"Sp":{"bC":"2:8"},"ik":[{"db":"engula","valueLength":16,"ioThreads":1,"ops":307413,"p99":1.087,"p999":1.423,"memUsedMB":361,"memRssMB":418,"cpuPercent":99},{"db":"redis","valueLength":16,"ioThreads":1,"ops":357879,"p99":1.079,"p999":1.215,"memUsedMB":551,"memRssMB":566,"cpuPercent":94},{"db":"engula","valueLength":16,"ioThreads":2,"ops":425186,"p99":1.039,"p999":1.287,"memUsedMB":363,"memRssMB":389,"cpuPercent":189},{"db":"redis","valueLength":16,"ioThreads":2,"ops":374880,"p99":1.031,"p999":1.159,"memUsedMB":554,"memRssMB":570,"cpuPercent":189},{"db":"engula","valueLength":16,"ioThreads":4,"ops":719842,"p99":0.551,"p999":0.975,"memUsedMB":392,"memRssMB":449,"cpuPercent":358},{"db":"redis","valueLength":16,"ioThreads":4,"ops":476641,"p99":0.679,"p999":0.959,"memUsedMB":570,"memRssMB":586,"cpuPercent":377},{"db":"engula","valueLength":32,"ioThreads":1,"ops":293147,"p99":1.103,"p999":1.679,"memUsedMB":465,"memRssMB":526,"cpuPercent":97},{"db":"redis","valueLength":32,"ioThreads":1,"ops":347505,"p99":1.103,"p999":1.295,"memUsedMB":646,"memRssMB":662,"cpuPercent":94},{"db":"engula","valueLength":32,"ioThreads":2,"ops":406184,"p99":1.087,"p999":1.279,"memUsedMB":464,"memRssMB":503,"cpuPercent":189},{"db":"redis","valueLength":32,"ioThreads":2,"ops":378863,"p99":1.023,"p999":1.103,"memUsedMB":653,"memRssMB":669,"cpuPercent":188},{"db":"engula","valueLength":32,"ioThreads":4,"ops":673418,"p99":0.567,"p999":0.895,"memUsedMB":509,"memRssMB":561,"cpuPercent":361},{"db":"redis","valueLength":32,"ioThreads":4,"ops":484373,"p99":0.663,"p999":0.719,"memUsedMB":673,"memRssMB":689,"cpuPercent":376},{"db":"engula","valueLength":64,"ioThreads":1,"ops":287038,"p99":0.919,"p999":1.391,"memUsedMB":577,"memRssMB":654,"cpuPercent":98},{"db":"redis","valueLength":64,"ioThreads":1,"ops":346535,"p99":1.119,"p999":1.255,"memUsedMB":888,"memRssMB":909,"cpuPercent":94},{"db":"engula","valueLength":64,"ioThreads":2,"ops":402516,"p99":1.143,"p999":1.655,"memUsedMB":593,"memRssMB":647,"cpuPercent":188},{"db":"redis","valueLength":64,"ioThreads":2,"ops":366716,"p99":1.047,"p999":1.183,"memUsedMB":894,"memRssMB":915,"cpuPercent":187},{"db":"engula","valueLength":64,"ioThreads":4,"ops":566742,"p99":0.559,"p999":0.927,"memUsedMB":656,"memRssMB":710,"cpuPercent":369},{"db":"redis","valueLength":64,"ioThreads":4,"ops":449737,"p99":0.751,"p999":1.295,"memUsedMB":917,"memRssMB":938,"cpuPercent":374},{"db":"engula","valueLength":128,"ioThreads":1,"ops":263675,"p99":1.119,"p999":1.599,"memUsedMB":840,"memRssMB":873,"cpuPercent":98},{"db":"redis","valueLength":128,"ioThreads":1,"ops":314548,"p99":1.327,"p999":2.239,"memUsedMB":1367,"memRssMB":1393,"cpuPercent":92},{"db":"engula","valueLength":128,"ioThreads":2,"ops":391127,"p99":1.279,"p999":3.503,"memUsedMB":843,"memRssMB":900,"cpuPercent":192},{"db":"redis","valueLength":128,"ioThreads":2,"ops":369625,"p99":1.039,"p999":1.103,"memUsedMB":1383,"memRssMB":1409,"cpuPercent":185},{"db":"engula","valueLength":128,"ioThreads":4,"ops":539587,"p99":0.575,"p999":0.975,"memUsedMB":940,"memRssMB":991,"cpuPercent":367},{"db":"redis","valueLength":128,"ioThreads":4,"ops":457215,"p99":0.719,"p999":0.991,"memUsedMB":1421,"memRssMB":1448,"cpuPercent":370}]}'),A=JSON.parse('{"jq":[{"$comment":"stability-4.9 \xb7 1GB cap \xb7 5M keys \xd7 128B \xb7 读写比 8:2 \xb7 32 clients \xd7 pipeline=1 \xb7 2 cycles。源:engula.io tmp/results-1/stability-4.9-bgsave-logs/20260428T212835。peak=各 cycle fork-tree-pss 峰值取最大;sec=各 cycle 平均。","preset":"1GB \xb7 5M ke
1ys \xd7 128B \xb7 读写比 8:2","engulaSec":0.65,"redisSec":6.36,"speedup":9.7,"engulaPeakPssMB":957,"redisPeakPssMB":1906,"peakSavingPct":49.8,"engulaSpikeRatio":1.2,"redisSpikeRatio":1.86},{"$comment":"stability-4.9 \xb7 4GB cap \xb7 20M keys \xd7 128B \xb7 读写比 8:2。源:20260428T213201。","preset":"4GB \xb7 20M keys \xd7 128B \xb7 读写比 8:2","engulaSec":2.0,"redisSec":25.76,"speedup":12.9,"engulaPeakPssMB":3282,"redisPeakPssMB":7635,"peakSavingPct":57.0,"engulaSpikeRatio":1.17,"redisSpikeRatio":1.86},{"$comment":"stability-4.9 \xb7 8GB cap \xb7 40M keys \xd7 128B \xb7 读写比 8:2(headline)。源:20260428T213638 / guide \xa72。","preset":"8GB \xb7 40M keys \xd7 128B \xb7 读写比 8:2","engulaSec":3.71,"redisSec":50.86,"speedup":13.7,"engulaPeakPssMB":6259,"redisPeakPssMB":15229,"peakSavingPct":58.9,"engulaSpikeRatio":1.18,"redisSpikeRatio":1.86}],"ik":[{"db":"engula","type":"string","maxMemory":"1gb","saveTimeSec":0.262,"loadTimeSec":0.334,"rdbSizeMB":477,"usedMemoryMB":510},{"db":"redis","type":"string","maxMemory":"1gb","saveTimeSec":2.448,"loadTimeSec":1.773,"rdbSizeMB":599,"usedMemoryMB":909},{"db":"engula","type":"string","maxMemory":"4gb","saveTimeSec":0.904,"loadTimeSec":1.213,"rdbSizeMB":1954,"usedMemoryMB":2079},{"db":"redis","type":"string","maxMemory":"4gb","saveTimeSec":10.236,"loadTimeSec":7.241,"rdbSizeMB":2473,"usedMemoryMB":3743},{"db":"engula","type":"string","maxMemory":"8gb","saveTimeSec":2.116,"loadTimeSec":2.391,"rdbSizeMB":3889,"usedMemoryMB":4134},{"db":"redis","type":"string","maxMemory":"8gb","saveTimeSec":20.972,"loadTimeSec":14.624,"rdbSizeMB":4956,"usedMemoryMB":7485},{"db":"engula","type":"hash","maxMemory":"1gb","saveTimeSec":0.368,"loadTimeSec":0.485,"rdbSizeMB":611,"usedMemoryMB":620},{"db":"redis","type":"hash","maxMemory":"1gb","saveTimeSec":2.155,"loadTimeSec":1.570,"rdbSizeMB":562,"usedMemoryMB":955},{"db":"engula","type":"hash","maxMemory":"4gb","saveTimeSec":1.200,"loadTimeSec":1.598,"rdbSizeMB":2443,"usedMemoryMB":2468},{"db":"redis","type":"hash","maxMemory":"4gb","saveTimeSec":8.652,"loadTimeSec":6.147,"rdbSizeMB":2258,"usedMemoryMB":3835},{"db":"engula","type":"hash","maxMemory":"8gb","saveTimeSec":2.557,"loadTimeSec":2.996,"rdbSizeMB":4894,"usedMemoryMB":4943},{"db":"redis","type":"hash","maxMemory":"8gb","saveTimeSec":17.355,"loadTimeSec":12.124,"rdbSizeMB":4526,"usedMemoryMB":7684},{"db":"engula","type":"list","maxMemory":"1gb","saveTimeSec":0.710,"loadTimeSec":4.461,"rdbSizeMB":569,"usedMemoryMB":615},{"db":"redis","type":"list","maxMemory":"1gb","saveTimeSec":0.917,"loadTimeSec":4.631,"rdbSizeMB":569,"usedMemoryMB":615},{"db":"engula","type":"list","maxMemory":"4gb","saveTimeSec":2.784,"loadTimeSec":17.863,"rdbSizeMB":2287,"usedMemoryMB":2466},{"db":"redis","type":"list","maxMemory":"4gb","saveTimeSec":3.642,"loadTimeSec":18.472,"rdbSizeMB":2287,"usedMemoryMB":2467},{"db":"engula","type":"list","maxMemory":"8gb","saveTimeSec":5.643,"loadTimeSec":35.956,"rdbSizeMB":4584,"usedMemoryMB":4942},{"db":"redis","type":"list","maxMemory":"8gb","saveTimeSec":7.140,"loadTimeSec":36.908,"rdbSizeMB":4584,"usedMemoryMB":4943},{"db":"engula","type":"set","maxMemory":"1gb","saveTimeSec":0.404,"loadTimeSec":0.499,"rdbSizeMB":636,"usedMemoryMB":645},{"db":"redis","type":"set","maxMemory":"1gb","saveTimeSec":2.156,"loadTimeSec":1.316,"rdbSizeMB":565,"usedMemoryMB":809},{"db":"engula","type":"set","maxMemory":"4gb","saveTimeSec":1.437,"loadTimeSec":1.664,"rdbSizeMB":2540,"usedMemoryMB":2559},{"db":"redis","type":"set","maxMemory":"4gb","saveTimeSec":8.654,"loadTimeSec":5.161,"rdbSizeMB":2268,"usedMemoryMB":3245},{"db":"engula","type":"set","maxMemory":"8gb","saveTimeSec":2.969,"loadTimeSec":3.195,"rdbSizeMB":5086,"usedMemoryMB":5120},{"db":"redis","type":"set","maxMemory":"8gb","saveTimeSec":17.268,"loadTimeSec":10.254,"rdbSizeMB":4546,"usedMemoryMB":6503}]}'),L=JSON.parse('{"Sp":{"a":6,"I":6},"ev":[{"id":"sentinel","title":"Sentinel 故障切换","verdict":"pass","headline":"切换 6.5s 完成","metrics":[{"label":"Failover 用时","value":"6.5s"},{"label":"可观测错误时长","value":"0.0s"},{"label":"客户端报错","value":"65"}],"runId":"ha-7.1-sentinel-logs/20260427T200740"},{"id":"cluster","title":"Cluster 故障切换","verdict":"pass","headline":"切换 8.0s 完成","metrics":[{"label":"Failover 用时","value":"8.0s"},{"label":"客户端报错","value":"3"},{"label":"验证写入","value":"1000/1000 keys 全部命中"}],"runId":"ha-7.2-cluster-failover-logs/20260427T200756"},{"id":"replica-sync","title":"Replica 同步","verdict":"pass","headline":"5 类型 + 10000 keys \xb7 offset_diff = 0","metrics":[{"label":"类型测试","value":"5/5 通过"},{"label":"Bulk 校验","value":"10000 keys 全量一致"},{"label":"Master/Replica offset","value":"638195 / 638195"},{"label":"偏移量差","value":"0 ≤ 1000 (容差)"}],"runId":"ha-7.3-replica-sync-logs/20260427T200818"},{"id":"reshard","title":"Reshard 重分片","verdict":"pass","headline":"重分片 21.0s 完成","metrics":[{"label":"重分片总时长","value":"21.0s"},{"label":"错误率","value":"0.00%"},{"label":"DBSIZE 校验","value":"before/after 一致 (1000000 → 1000230)"}],"runId":"ha-7.4-reshard-logs/20260427T200826"},{"id":"mixed-deploy","title":"混合部署 (Redis ↔ Engula)","verdict":"pass","headline":"Redis ↔ Engula 双向 failover 均 6.0s","metrics":[{"label":"Scenario A \xb7 Redis primaries","value":"failover 6.0s"},{"label":"Scenario B \xb7 Engula primaries","value":"failover 6.0s"}],"runId":"ha-7.5-mixed-deploy-logs/20260427T200934"},{"id":"network-partition","title":"网络分区与恢复","verdict":"pass","headline":"iptables 分区 \xb7 副本提升后写入恢复","metrics":[{"label":"分区检测 → 提升耗时","value":"≈ 23s"},{"label":"目标 master","value":"127.0.0.12:7461"},{"label":"目标 replica","value":"127.0.0.16:7465"},{"label":"恢复后写入","value":"post-recovery 写入并校验一致"}],"runId":"ha-7.6-network-partition-logs/20260509T151652"}]}'),G=JSON.parse('{"Sp":{"$":5,"Y":5},"ev":[{"id":"bgsave-stability","title":"BGSAVE 稳定性","verdict":"pass","headline":"20 轮 BGSAVE \xb7 spike ratio ≤ 1.10","metrics":[{"label":"Baseline p99 / p99.9","value":"0.31ms / 0.50ms"},{"label":"BGSAVE 期 p99 / p99.9","value":"0.34ms / 0.66ms"},{"label":"Spike ratio (p99)","value":"≤ 1.10\xd7"},{"label":"Fork 延迟","value":"0 \xb5s"},{"label":"BGSAVE 周期","value":"2/2 完成"}],"runId":"stability-4.9-bgsave-logs/20260428T214359"},{"id":"linux-x86_64","title":"平台兼容性 \xb7 Linux x86_64","verdict":"pass","headline":"7 项平台检查全部通过","metrics":[{"label":"目标平台","value":"Linux 5.15 x86_64 \xb7 glibc 2.28"},{"label":"检查项","value":"7/7"}]}]}'),U=s(8892),O=JSON.parse('{"lz":{"ue":"https://engula.com/proof","wt":{"compat":{"path":"/proof/part/compat","title":"兼容性(含 runtest 与 12 个 compat 子套件)"},"compat-client":{"path":"/proof/part/compat-client","title":"客户端兼容性(jedis / redis-py / go-redis / node-redis)"},"perf":{"path":"/proof/part/perf","title":"性能(throughput / latency / cpu / memory-efficiency)"},"rdb":{"path":"/proof/part/rdb","title":"RDB save / bgsave / load"},"ha":{"path":"/proof/part/ha","title":"高可用与集群(sentinel / cluster / replica-sync / reshard / mixed / partition)"}
1,"platform":{"path":"/proof/part/platform","title":"平台兼容性(Linux x86_64 等)"}}},"ju":{"runtest_unit":{"target":"/proof/part/compat","label":"查看 Runtest 全套"},"compat_subsuite":{"target":"/proof/part/compat","label":"查看 兼容性 子套件"},"client_sdk":{"target":"/proof/part/compat-client","label":"查看 客户端兼容性"},"perf_cell":{"target":"/proof/part/perf","label":"查看 性能"},"rdb_cell":{"target":"/proof/part/rdb","label":"查看 RDB"},"memory_cell":{"target":"/proof/part/perf","label":"查看 内存效率"},"ha_scenario":{"target":"/proof/part/ha","label":"查看 高可用"},"platform_cell":{"target":"/proof/part/platform","label":"查看 平台"}}}'),V=JSON.parse('{"$comment":"GET https://engula.com/proof/api/hardware-info 的静态种子(兜底)。生成于 2026-06-30T13:46:15.042Z。","ecs":"ecs.c9i.2xlarge","ecs_ssd":"ecs.i4g.8xlarge","os":"ubuntu 22.04","cpu":"Intel(R) Xeon(R) 6982P-C","engula_ver":"engula2.2.0.linux-amd64.el7","redis_ver":"redis7.2.11"}');function z(e){if(!e)return"—";let t=e.trim(),s=t.match(/^([a-z][a-z-]*)\s*v?([0-9]+(?:\.[0-9]+)*)/i);return s?`${s[1]} ${s[2]}`:t}let H={base:O.lz.ue,partPages:O.lz.wt,cellMap:O.ju};function X(){return{snapshot:x.I,runtest:function(){let e=C.Sp,t=C.Dl.map(e=>{let t={name:e.name,status:e.status,group:e.group};if("fail"!==e.status)return t;let s=f(e.name);return{...t,failedCount:e.failedCount,failedSubtests:e.failedSubtests,reason:s.reason,impact:s.impact}});return{totalUnits:e.totalUnits,passedUnits:e.passedUnits,failedUnits:e.failedUnits,totalSubtests:e.totalSubtests,passedSubtests:e.passedSubtests,failedSubtests:e.failedSubtests,durationSec:e.durationSec,binary:J().engula_ver??U.Bt,redisVersion:J().redis_ver??U.eC,runId:e.runId,units:t}}(),runtestGroups:C.Xx.map(e=>({...e,verdict:"pass"===e.verdict?"pass":"fail"})),clients:{summary:E.Sp,items:E.ev},compatSubsuites:I.e,perfMatrix:function(){let e=D.Sp.bC,t=new Map;for(let s of D.ik){let a=`${s.ratio??e}|${s.ioThreads}|${s.valueLength}`,r=t.get(a)??{};"engula"===s.db?r.engula=s:r.redis=s,t.set(a,r)}let s=[];return t.forEach(t=>{if(!t.engula||!t.redis)return;let a=t.engula.ioThreads,r=t.engula.valueLength,l=t.engula.ops/t.redis.ops,i=t.engula.p99,n=t.redis.p99;s.push({dimensions:{threads:a,valueSize:r,writeRatio:t.engula.ratio??e},unit:"ops/s",lowerIsBetter:!1,engula:t.engula.ops,baseline:t.redis.ops,ratio:Math.round(100*l)/100,verdict:l>=1?"pass":"fail",secondary:null!=i&&null!=n?{label:"P99",unit:"ms",lowerIsBetter:!0,engula:i,baseline:n,ratio:Math.round(n/i*100)/100}:void 0})}),s}(),rdbMatrix:function(){let e=e=>e.toUpperCase().replace("GB","G"),t=new Map;for(let e of A.ik){let s=`${e.maxMemory}|${e.type}`,a=t.get(s)??{};"engula"===e.db?a.engula=e:a.redis=e,t.set(s,a)}let s=[];return t.forEach((t,a)=>{if(!t.engula||!t.redis)return;let[r,l]=a.split("|"),i=t.redis.saveTimeSec/t.engula.saveTimeSec;s.push({dimensions:{datasetSize:e(r),type:l,op:"save"},unit:"s",lowerIsBetter:!0,engula:t.engula.saveTimeSec,baseline:t.redis.saveTimeSec,ratio:Math.round(100*i)/100,verdict:i>=1?"pass":"fail"})}),s}(),rdbLoadMatrix:function(){let e=e=>e.toUpperCase().replace("GB","G"),t=new Map;for(let e of A.ik){let s=`${e.maxMemory}|${e.type}`,a=t.get(s)??{};"engula"===e.db?a.engula=e:a.redis=e,t.set(s,a)}let s=[];return t.forEach((t,a)=>{if(!t.engula||!t.redis)return;let[r,l]=a.split("|"),i=t.redis.loadTimeSec/t.engula.loadTimeSec;s.push({dimensions:{datasetSize:e(r),type:l,op:"load"},unit:"s",lowerIsBetter:!0,engula:t.engula.loadTimeSec,baseline:t.redis.loadTimeSec,ratio:Math.round(100*i)/100,verdict:i>=1?"pass":"fail"})}),s}(),rdbBgsave:function(){let e=A.jq;return Array.isArray(e)?e.map(e=>({preset:e.preset,engulaSec:e.engulaSec,redisSec:e.redisSec,speedup:e.speedup,engulaPeakPssMB:e.engulaPeakPssMB,redisPeakPssMB:e.redisPeakPssMB,peakSavingPct:e.peakSavingPct,engulaSpikeRatio:e.engulaSpikeRatio,redisSpikeRatio:e.redisSpikeRatio})):[]}(),memMatrix:function(){let e=A.ik.filter(e=>"8gb"===e.maxMemory),t=[];for(let s of["string","hash","set"]){let a=e.find(e=>"engula"===e.db&&e.type===s),r=e.find(e=>"redis"===e.db&&e.type===s);if(!a||!r)continue;let l=r.usedMemoryMB/a.usedMemoryMB;t.push({dimensions:{type:s,datasetSize:"8G"},unit:"MB",lowerIsBetter:!0,engula:a.usedMemoryMB,baseline:r.usedMemoryMB,ratio:Math.round(100*l)/100,verdict:l>=1?"pass":"fail"})}return t}(),haScenarios:L.ev,platformItems:G.ev,haSummary:function(){let e=L.ev.map(e=>({subItemId:e.id,name:e.title,status:e.verdict,summary:e.headline}));return{total:L.Sp.a,passed:L.Sp.I,items:e}}(),platformSummary:function(){let e=G.ev.map(e=>({subItemId:e.id,name:e.title,status:e.verdict,summary:e.headline}));return{total:G.Sp.$,passed:G.Sp.Y,items:e}}(),meta:function(){let e=J();return{machineSpec:function(e){let t=[e.cpu,e.os,e.ecs].filter(e=>!!e&&e.trim().length>0);return t.length?t.join(" \xb7 "):void 0}(e)??U.IZ,engulaBinary:e.engula_ver??U.Bt,redisVersion:e.redis_ver??U.eC,runtestRunId:U.C5,runtestDurationSec:U.lj,fetchedAt:U.Oj}}(),hardware:J(),drilldown:H}}async function W(){let e=X(),[t,s]=await Promise.all([x.E.load().catch(()=>x.I),P(e).catch(e=>(S("overlay 整体失败 → 全页回退静态 mock",(null==e?void 0:e.message)??e),{}))]),a=Object.keys(s);return S(`snapshot \u{6570}\u{636E}\u{6E90}\u{FF1A}${t.categories.length>0?"API(LiveProof 实时)":"MOCK/空(接口未命中)"}`),S(a.length>0?`\u{5DF2}\u{7528}\u{771F}\u{5B9E} API \u{8986}\u{76D6} ${a.length} \u{4E2A} section\u{FF1A}${a.join(", ")}`:"无任何 section 被真实 API 覆盖 —— 当前整页是静态 mock 数据"),{...e,...s,snapshot:t}}function J(){let e={};for(let[t,s]of Object.entries(V))"$comment"!==t&&"string"==typeof s&&s.trim()&&(e[t]=s);return e}function K(e){let t=(0,o.bh)(),s=e.titleClassName??("en"===t?"section-title--fit":void 0);return(0,a.jsx)(l.$0,{...e,titleClassName:s,lockup:e.lockup??!1})}function Z(e){let{data:t,loading:s=!1,onSubtestClick:r}=e,l=(0,o.Xo)().proof.runtestMatrix,{runtest:i,snapshot:n}=t,d=n.resultsHref||"/proof",c=i.totalSubtests??0,u=i.passedSubtests??0,m=i.failedSubtests??Math.max(0,c-u),p=c>0?Math.round(u/c*1e4)/100:0,x=s?"—":String(u),h=s?"—":String(c),f=s?"—":`${p.toFixed(2)}%`,g=s?"—":z(i.binary),b=s?"—":z(i.redisVersion),v=i.units.filter(e=>"fail"===e.status).flatMap(e=>(e.failedSubtests||[]).map(t=>({unit:e,name:t}))),y=i.units.filter(e=>"fail"===e.status).length;return(0,a.jsx)(K,{cmp:"RuntestMatrix",id:"runtest",kicker:l.kicker,title:l.title,de
1sc:(0,a.jsxs)(a.Fragment,{children:[l.descA,(0,a.jsx)("span",{className:"whitespace-nowrap",children:l.descB})]}),children:(0,a.jsxs)("div",{className:"surface-card px-4 py-6 md:px-8 md:py-8",children:[(0,a.jsxs)("div",{className:"flex flex-wrap items-baseline justify-between gap-3 mb-6",children:[(0,a.jsxs)("div",{className:"flex items-baseline gap-3",children:[(0,a.jsxs)("span",{className:"font-display text-2xl font-semibold text-text tabular-nums",children:[x," / ",h]}),(0,a.jsxs)("span",{className:"text-sm text-muted",children:[l.subtestsPassed," ",(0,a.jsx)("span",{className:"tabular-nums",children:f})]})]}),(0,a.jsxs)("div",{className:"font-mono text-[0.7rem] tracking-wider text-muted",children:[g," ","\xb7 vs"," ",b]})]}),s?(0,a.jsx)("div",{id:"runtest-failures",className:"scroll-mt-24 rounded-lg border border-line bg-card px-4 py-6 text-center text-sm text-muted",children:"—"}):v.length>0?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{id:"runtest-failures",className:"mb-3 flex scroll-mt-24 items-baseline justify-between gap-3",children:[(0,a.jsx)("h3",{className:"text-sm font-semibold text-text",children:l.failuresHeading}),(0,a.jsx)("span",{className:"font-mono text-[0.7rem] text-muted",children:l.failuresCount(y,v.length,m)})]}),(0,a.jsx)("ul",{className:"grid gap-2 md:grid-cols-2",children:v.map(e=>(0,a.jsx)("li",{children:(0,a.jsxs)("button",{type:"button",onClick:()=>null==r?void 0:r(e.unit,e.name),className:"group flex w-full items-start gap-3 rounded-lg border border-line bg-card px-3 py-2.5 text-left transition-colors hover:bg-bg",children:[(0,a.jsx)("span",{className:"mt-1.5 inline-block w-1.5 h-1.5 rounded-full shrink-0",style:{background:"rgb(248,113,113)"}}),(0,a.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,a.jsx)("span",{className:"block text-sm leading-snug text-text break-words",children:e.name}),(0,a.jsx)("span",{className:"mt-0.5 block font-mono text-[0.68rem] text-muted",children:e.unit.name})]}),(0,a.jsx)("span",{className:"shrink-0 font-mono text-xs text-muted opacity-0 transition-opacity group-hover:opacity-100",children:"→"})]})},`${e.unit.name}::${e.name}`))})]}):(0,a.jsx)("div",{id:"runtest-failures",className:"scroll-mt-24 rounded-lg border border-line bg-card px-4 py-6 text-center text-sm text-muted",children:l.allPass}),(0,a.jsx)("div",{className:"mt-6 flex items-center justify-end font-mono text-[0.7rem] text-muted",children:(0,a.jsx)("a",{href:d,className:"text-text hover:underline",target:"_blank",rel:"noopener noreferrer",children:l.fullReport})})]})})}function Y(e){let{data:t,loading:s=!1,onCellClick:r}=e,l=(0,o.Xo)().proof.clientCompat,i=(0,o.bh)(),{items:n,summary:d}=t.clients,c="zh"===i?l.title.indexOf(","):-1,u=c>=0?(0,a.jsxs)(a.Fragment,{children:[l.title.slice(0,c+1),(0,a.jsx)("br",{}),l.title.slice(c+1)]}):l.title;return(0,a.jsxs)(K,{cmp:"ClientCompat",id:"client-compat",kicker:l.kicker,title:u,desc:l.desc,children:[(0,a.jsx)("div",{className:"mb-4 text-sm text-muted",children:s?"—":l.sdkPassed(d.passedSdks,d.totalSdks)}),(0,a.jsx)("div",{className:"grid gap-4 md:grid-cols-2 lg:grid-cols-4",children:n.map(e=>(0,a.jsx)(Q,{item:e,loading:s,onClick:r?()=>r(e):void 0},e.id))})]})}function Q(e){let{item:t,loading:s=!1,onClick:r}=e,l=(0,o.Xo)().proof.clientCompat,i=(100*t.passRate).toFixed(2);return(0,a.jsxs)(r?"button":"div",{...r?{type:"button",onClick:r,className:"surface-card surface-card-hover px-5 py-4 flex flex-col gap-3 text-left transition-colors hover:bg-card cursor-pointer"}:{className:"surface-card px-5 py-4 flex flex-col gap-3"},children:[(0,a.jsxs)("div",{className:"flex items-baseline gap-2",children:[(0,a.jsx)("span",{className:"font-ui text-sm font-semibold text-text",children:t.name}),(0,a.jsxs)("span",{className:"font-mono text-[0.62rem] text-muted",children:[t.language," \xb7 ",s?"—":t.version]})]}),(0,a.jsxs)("div",{className:"flex items-baseline justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-mono text-[0.58rem] tracking-[0.18em] uppercase text-muted mb-1",children:l.passedCase}),(0,a.jsx)("div",{className:"font-mono text-sm text-text tabular-nums",children:s?"—":`${t.passed} / ${t.total}`})]}),(0,a.jsxs)("div",{className:"text-right",children:[(0,a.jsx)("div",{className:"font-mono text-[0.58rem] tracking-[0.18em] uppercase text-muted mb-1",children:l.passRate}),(0,a.jsx)("div",{className:"font-display text-xl font-semibold tabular-nums",style:{color:"var(--cs-text)"},children:s?"—":`${i}%`})]})]})]})}function q(e){let{data:t,loading:s=!1,onGroupClick:r}=e,i=(0,o.Xo)().proof.runtestModules,n=t.runtestGroups.filter(e=>e.totalSubtests>0);return 0===n.length?null:(0,a.jsx)("section",{"data-cmp":"RuntestModulesSection",id:"runtest-modules",className:"pb-8 md:pb-12",children:(0,a.jsx)(l.W2,{children:(0,a.jsxs)("div",{className:"mx-auto max-w-[var(--max-w)]",children:[(0,a.jsx)("p",{className:"mb-3 text-sm text-muted",children:i.desc}),(0,a.jsx)("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-4",children:n.map(e=>{var l,n;let d=r?{type:"button",onClick:()=>r(e,t.runtest.units.filter(t=>t.group===e.id)),className:"surface-card surface-card-hover px-5 py-4 flex flex-col gap-3 text-left transition-colors hover:bg-card cursor-pointer"}:{className:"surface-card px-5 py-4 flex flex-col gap-3"};return(0,a.jsxs)(r?"button":"div",{...d,children:[(0,a.jsx)("div",{className:"flex items-baseline gap-2",children:(0,a.jsx)("span",{className:"font-ui text-sm font-semibold text-text",children:e.label})}),(0,a.jsxs)("div",{className:"flex items-baseline justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-mono text-[0.58rem] tracking-[0.18em] uppercase text-muted mb-1",children:i.passedCase}),(0,a.jsx)("div",{className:"font-mono text-sm text-text tabular-nums",children:s?"—":`${e.passedSubtests} / ${e.totalSubtests}`})]}),(0,a.jsxs)("div",{className:"text-right",children:[(0,a.jsx)("div",{className:"font-mono text-[0.58rem] tracking-[0.18em] uppercase text-muted mb-1",children:i.passRate}),(0,a.jsx)("div",{className:"font-display text-xl font-semibold tabular-nums",style:{color:"var(--cs-text)"},children:s?"—":(l=e.passedSubtests,(n=e.totalSubtests)<=0?"—":`${(l/n*100).toFixed(2)}%`)})]})]})]},e.id)})})]})})})}let ee="rgb(22,163,74)",et="rgb(220,38,38)";function es(e){var t;let{cell:s,onClick:r}=e,l=(0,o.Xo)().proof.metricCell;if("unknown"===s.verdict||null==s.engula||null==s.baseline)return(0,a.jsxs)("div",{className:"rounded-xl px-3 py-3 flex flex-col gap-1 items-center justify-center text-center",style:{border:"1px dashed var(--cs-line)",background:"transparent",minHeight:96},children:[(0,a.jsx)("div",{className:"font-mono text-[0.62rem] tracking-wider text-muted",children:l.pending}),s.unit&&(0,a.jsxs)("div",{className:"font-mono text-[0.6rem] text-muted opacity-70",children:[l.unitLabel," ",s.unit]})]});let i=r?"button":"div",n=r?{type:"button",onClick:r,className:"surface-card surface-card-hover px-3 py-3 flex flex-col gap-1.5 text-left transition-colors hover:bg-card cursor-pointer w-full",style:{minHeight:96}}:{className:"surface-card px-3 py-3 flex flex-col gap-1.5",style:{minHeight:96}},d=s.secondary;if(null!=d&&null!=d.engula&&null!=d.baseline){let e=s.engula>=s.baseline?ee:et,t=d.engula<=d.baseline?ee:et;return(0,a.jsx)(i,{...n,children:(0,a.jsx)("div",{style:{flex:1,display:"flex",flexDirection:"column",justifyContent:"center"},children:(0,a.jsxs)("div",{className:"font-mono text-[0.72rem]",style:{display:"grid",gridTemplateColumns:"auto 1fr 1fr",gap:"5px 10px",alignItems:"baseline"},children:[(0,a.jsx)("span",{}),(0,a.jsx)("span",{className:"text-right text-[0.56rem] uppercase tracking-wider text-muted",children:s.unit}),(0,a.jsx)("span",{className:"text-right text-[0.56rem] uppercase tracking-wider text-muted",children:`${d.label} ${d.unit}`}),(0,a.jsx)("span",{className:"text-[0.6rem] tracking-wide text-muted",children:"engula"}),(0,a.jsxs)("span",{className:"text-right tabular-nums",children:[(0,a.jsx)("span",{className:"font-semibold text-text",children:er(s.engula)})," ",(0,a.jsx)("span",{className:"font-semibold",style:{color:e},children:ea(s.engula,s.baseline)})]}),(0,a.jsxs)("span",{className:"text-right tabular-nums",children:[(0,a.jsx)("span",{className:"font-semibold text-text",children:er(d.engula)})," ",(0,a.jsx)("span",{className:"font-semibold",style:{color:t},children:ea(d.engula,d.baseline)})]}),(0,a.jsx)("span",{className:"text-[0.6rem] tracking-wide text-muted",children:"redis"}),(0,a.jsx)("span",{className:"text-right tabular-nums text-muted",children:er(s.baseline)}),(0,a.jsx)("span",{className:"text-right tabular-nums text-muted",children:er(d.baseline)})]})})})}let c=s.ratio??(null==(t=s).engula||null==t.baseline||0===t.baseline?1:t.lowerIsBetter?t.baseline/t.engula:t.engula/t.baseline),u=c>=1,m=u?ee:et,p=u?l.better:l.worse;return(0,a.jsxs)(i,{...n,children:[(0,a.jsxs)("div",{className:"flex items-baseline justify-between gap-2",children:[(0,a.jsxs)("span",{className:"font-display text-lg font-semibold tabular-nums",style:{color:m},children:[c.toFixed(2),"\xd7"]}),(0,a.jsx)("span",{className:"font-mono text-[0.6rem] tracking-wider px-1.5 py-0.5 rounded",style:{background:u?"rgba(22,163,74,0.12)":"rgba(220,38,38,0.12)",color:m},children:p})]}),(0,a.jsxs)("div",{className:"font-mono text-[0.65rem] leading-relaxed text-muted",children:[(0,a.jsxs)("div",{children:["engula"," ",(0,a.jsx)("span",{className:"text-text tabular-nums",children:er(s.engula,s.unit)})]}),(0,a.jsxs)("div",{children:["redis"," ",(0,a.jsx)("span",{className:"text-text tabular-nums",children:er(s.baseline,s.unit)})]})]})]})}function ea(e,t){if(!t)return"";let s=Math.round((e-t)/t*100);return`${s>0?"+":s<0?"−":"\xb1"}${Math.abs(s)}%`}function er(e,t){return e>=1e4?`${(e/1e3).toFixed(1)}k${t?` ${t}`:""}`:Number.isInteger(e)?`${e}${t?` ${t}`:""}`:`${e.toFixed(2)}${t?` ${t}`:""}`}function el(e){let{rows:t,cols:s,rowLabel:r,colLabel:l,pickCell:i,onCellClick:n,loading:d=!1}=e,c=(0,o.Xo)().proof.matrix;return(0,a.jsxs)("div",{className:"surface-card",children:[(0,a.jsx)("div",{className:"sm:hidden grid gap-5 p-3",children:t.map((e,t)=>(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"font-mono text-[0.6rem] tracking-[0.2em] uppercase text-muted mb-2",children:[r," \xb7 ",e]}),(0,a.jsx)("div",{className:"grid grid-cols-2 gap-2",children:s.map((e,s)=>{let r=i(t,s);return(0,a.jsxs)("div",{className:"grid gap-1 min-w-0",children:[(0,a.jsx)("div",{className:"font-mono text-[0.58rem] tracking-wider text-muted text-center truncate",children:e}),r&&!d?(0,a.jsx)(es,{cell:r,onClick:n?()=>n(r):void 0}):(0,a.jsx)("div",{className:"rounded-xl px-3 py-3 flex items-center justify-center text-muted",style:{border:"1px dashed var(--cs-line)",minHeight:96},children:"—"})]},e)})})]},e))}),(0,a.jsx)("div",{className:"hidden sm:block overflow-x-auto",children:(0,a.jsxs)("table",{className:"w-full",style:{borderCollapse:"separate",borderSpacing:8},children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{className:"font-mono text-[0.6rem] tracking-[0.22em] uppercase text-muted text-left align-bottom",style:{minWidth:90},children:c.rowColHeader(r,l)}),s.map(e=>(0,a.jsx)("th",{className:"font-mono text-[0.65rem] tracking-wider text-muted text-center px-2",children:e},e))]})}),(0,a.jsx)("tbody",{children:t.map((e,t)=>(0,a.jsxs)("tr",{children:[(0,a.jsx)("td",{className:"font-mono text-[0.7rem] text-text font-medium align-middle",children:e}),s.map((e,s)=>{let r=i(t,s);return(0,a.jsx)("td",{className:"align-middle",style:{minWidth:110},children:r&&!d?(0,a.jsx)(es,{cell:r,onClick:n?()=>n(r):void 0}):(0,a.jsx)("div",{className:"rounded-xl px-3 py-3 flex items-center justify-center text-muted",style:{border:"1px dashed var(--cs-line)",minHeight:96},children:"—"})},e)})]},e))})]})})]})}let ei=[1,2,4],en=[16,32,64,128];function ed(e){let{data:t,loading:s=!1,onCellClick:r}=e,l=(0,o.Xo)().proof.perf,i=e=>{let[t,s]=e.split(":").map(Number);if(!Number.isFinite(t)||!Number.isFinite(s)||t+s===0)return"";let a=Math.round(s/(t+s)*100);return l.rwGloss(a,100-a)},n=t.perfMatrix??[],d=Array.from(new Set(n.map(e=>e.dimensions.writeRatio).filter(e=>!!e))).sort();return(0,a.jsxs)(K,{cmp:"PerfSection",id:"perf",kicker:l.kicker,title:l.title,de
1sc:(0,a.jsxs)(a.Fragment,{children:[l.descA," ",(0,a.jsx)("span",{className:"whitespace-nowrap",children:l.descRw}),l.descB," ",(0,a.jsx)("span",{className:"whitespace-nowrap",children:l.descC})]}),children:[(0,a.jsx)("div",{className:"grid gap-8",children:d.map(e=>(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-3",children:[(0,a.jsx)("h3",{className:"font-display text-lg font-semibold text-text",children:l.ratioHeading(function(e){let t=e.split(":");return 2===t.length?`${t[1]}:${t[0]}`:e}(e))}),(0,a.jsxs)("p",{className:"mt-0.5 text-sm text-muted",children:[l.descRw," \xb7 ",i(e)]})]}),(0,a.jsx)(el,{rowLabel:l.rowLabel,colLabel:l.colLabel,rows:ei.map(e=>l.threadsUnit(e)),cols:en.map(e=>`${e} B`),pickCell:(t,s)=>n.find(a=>a.dimensions.writeRatio===e&&a.dimensions.threads===ei[t]&&a.dimensions.valueSize===en[s]),loading:s,onCellClick:r})]},e))}),(0,a.jsx)("p",{className:"mt-5 text-xs text-muted",children:l.footnote})]})}let eo=["1G","4G","8G"],ec=["string","hash","set"],eu="rgb(22,163,74)";function em(e){let{data:t,loading:s=!1,onCellClick:r}=e,l=(0,o.Xo)().proof.rdb;return(0,a.jsx)(K,{cmp:"RdbSection",id:"rdb",kicker:l.kicker,title:l.title,desc:l.desc,children:(0,a.jsxs)("div",{className:"grid gap-8",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"grid gap-8",children:[(0,a.jsx)(ep,{title:l.saveTitle,subtitle:l.saveSubtitle,rows:eo.map(e=>l.datasetSuffix(e)),cols:ec.map(e=>e),pickCell:(e,s)=>t.rdbMatrix.find(t=>t.dimensions.datasetSize===eo[e]&&t.dimensions.type===ec[s]),rowLabel:l.rowLabel,colLabel:l.colLabel,loading:s,onCellClick:r}),(0,a.jsx)(ep,{title:l.loadTitle,subtitle:l.loadSubtitle,rows:eo.map(e=>l.datasetSuffix(e)),cols:ec.map(e=>e),pickCell:(e,s)=>t.rdbLoadMatrix.find(t=>t.dimensions.datasetSize===eo[e]&&t.dimensions.type===ec[s]),rowLabel:l.rowLabel,colLabel:l.colLabel,loading:s,onCellClick:r})]}),(0,a.jsx)("p",{className:"mt-4 text-xs text-muted",children:l.footnoteMatrix})]}),t.rdbBgsave.length>0&&(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-3",children:[(0,a.jsx)("h3",{className:"font-display text-lg font-semibold text-text",children:l.bgsaveTitle}),(0,a.jsx)("p",{className:"mt-0.5 text-sm text-muted",children:l.bgsaveSubtitle}),(0,a.jsx)("p",{className:"mt-1 text-xs text-muted leading-relaxed",children:l.spikeNote})]}),(0,a.jsx)("div",{className:"grid gap-4",children:t.rdbBgsave.map(e=>(0,a.jsx)(ex,{b:e,loading:s},e.preset))})]})]})})}function ep(e){let{title:t,subtitle:s,rows:r,cols:l,rowLabel:i,colLabel:n,pickCell:d,onCellClick:o,loading:c=!1}=e;return(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"mb-3",children:[(0,a.jsx)("h3",{className:"font-display text-lg font-semibold text-text",children:t}),(0,a.jsx)("p",{className:"mt-0.5 text-sm text-muted",children:s})]}),(0,a.jsx)(el,{rowLabel:i,colLabel:n,rows:r,cols:l,pickCell:d,loading:c,onCellClick:o})]})}function ex(e){let{b:t,loading:s=!1}=e,r=(0,o.Xo)().proof.rdb,l="en"===(0,o.bh)()?t.preset.replace("读写比","read/write"):t.preset;return(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"mb-2 font-mono text-xs font-semibold text-text break-words",children:l}),(0,a.jsxs)("div",{className:"surface-card grid gap-4 p-5 md:grid-cols-2",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("div",{className:"font-mono text-[0.62rem] tracking-[0.22em] uppercase text-muted break-words",children:r.bgsaveTime}),(0,a.jsxs)("div",{className:"mt-2 flex items-baseline gap-3",children:[(0,a.jsx)("span",{className:"font-display text-3xl font-semibold tabular-nums",style:{color:eu},children:s?"—":`${t.speedup.toFixed(1)}\xd7`}),(0,a.jsx)("span",{className:"text-sm text-muted",children:r.faster})]}),(0,a.jsxs)("div",{className:"mt-2 font-mono text-xs text-muted leading-relaxed",children:["engula"," ",(0,a.jsx)("span",{className:"text-text tabular-nums",children:s?"—":`${t.engulaSec.toFixed(2)}s`}),(0,a.jsx)("span",{className:"mx-2 opacity-50",children:"\xb7"}),"redis"," ",(0,a.jsx)("span",{className:"text-text tabular-nums",children:s?"—":`${t.redisSec.toFixed(2)}s`})]})]}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("div",{className:"font-mono text-[0.62rem] tracking-[0.22em] uppercase text-muted break-words",children:r.peakMem}),(0,a.jsxs)("div",{className:"mt-2 flex items-baseline gap-3",children:[(0,a.jsx)("span",{className:"font-display text-3xl font-semibold tabular-nums",style:{color:eu},children:s?"—":`${t.peakSavingPct.toFixed(1)}%`}),(0,a.jsx)("span",{className:"text-sm text-muted",children:r.leaner})]}),(0,a.jsxs)("div",{className:"mt-2 font-mono text-xs text-muted leading-relaxed",children:["engula"," ",(0,a.jsx)("span",{className:"text-text tabular-nums",children:s?"—":`${t.engulaPeakPssMB.toLocaleStr
1ing()} MB`}),(0,a.jsx)("span",{className:"mx-2 opacity-50",children:"\xb7"}),"redis"," ",(0,a.jsx)("span",{className:"text-text tabular-nums",children:s?"—":`${t.redisPeakPssMB.toLocaleString()} MB`})]})]}),(0,a.jsxs)("div",{className:"md:col-span-2 min-w-0 border-t border-line pt-3",children:[(0,a.jsx)("div",{className:"font-mono text-[0.6rem] tracking-[0.22em] uppercase text-muted mb-1.5 break-words",children:r.spikeRatio}),(0,a.jsxs)("div",{className:"font-mono text-xs text-muted leading-relaxed break-words",children:["engula"," ",(0,a.jsx)("span",{className:"text-text tabular-nums",children:s?"—":`${t.engulaSpikeRatio.toFixed(2)}\xd7`})," ","\xb7 redis"," ",(0,a.jsx)("span",{className:"text-text tabular-nums",children:s?"—":`${t.redisSpikeRatio.toFixed(2)}\xd7`})]})]})]})]})}s(3221);var eh=s(9591);let ef=(e,t)=>(e/t).toFixed(2),eg=(e,t)=>Math.round(e/t*100);function eb(){let e="en"===(0,o.bh)(),t=(t,s)=>e?s:t,[s,l]=(0,r.useState)(eh),[i,n]=(0,r.useState)(0);(0,r.useEffect)(()=>{let e=!0,t=(0,g.r9)(),s=e=>fetch(`${t}${e}`,{cache:"no-store"}).then(e=>e.ok?e.json():null).catch(()=>null);return Promise.all([s("/report-json/ha/adv-fullsync"),s("/report-json/ha/adv-cow-storm")]).then(t=>{let[s,a]=t;e&&l(e=>{var t,r,l,i,n;let d={fullsync:{...e.fullsync},cowStorm:{...e.cowStorm}},o=null==s||null==(t=s.raw)?void 0:t.metrics;o&&"number"==typeof o.engula_comp_sync_secs&&(d.fullsync.syncSecs={engula:+o.engula_comp_sync_secs.toFixed(2),redis:+o.redis_comp_sync_secs.toFixed(2)},d.fullsync.rdbMB={engula:Math.round(o.engula_comp_payload_bytes/1e6),redis:Math.round(o.redis_comp_payload_bytes/1e6)});let c=null==a||null==(l=a.raw)||null==(r=l.details)?void 0:r.engula,u=null==a||null==(n=a.raw)||null==(i=n.details)?void 0:i.redis;return c&&u&&"number"==typeof c.fork_tree_pss_peak_bytes&&(d.cowStorm.forkPssMB={engula:Math.round(c.fork_tree_pss_peak_bytes/1e6),redis:Math.round(u.fork_tree_pss_peak_bytes/1e6)},d.cowStorm.replBufMB={engula:Math.round(c.repl_buffers_peak_bytes/1e5)/10,redis:Math.round(u.repl_buffers_peak_bytes/1e5)/10},d.cowStorm.syncSecs={engula:+c.max_sync_secs.toFixed(2),redis:+u.max_sync_secs.toFixed(2)}),d})}),()=>{e=!1}},[]),(0,r.useEffect)(()=>{if("undefined"==typeof window)return;let e="#replication"===window.location.hash;try{"replication"===sessionStorage.getItem("engula:scroll-to")&&(e=!0,sessionStorage.removeItem("engula:scroll-to"))}catch{}if(!e)return;let t=e=>{let t=document.getElementById("replication");t&&window.scrollTo({top:t.getBoundingClientRect().top+window.scrollY-88,behavior:e})},s=[setTimeout(()=>t("smooth"),300),setTimeout(()=>t("auto"),1e3),setTimeout(()=>t("auto"),1700)];return()=>s.forEach(clearTimeout)},[]);let d=s.fullsync,c=s.cowStorm,u=[{no:"01",tab:{tt:t("单副本全量同步","Single-replica full-sync"),td:t("副本加入,对同一份数据做 full-sync","A replica joins and full-syncs the same data")},cap:t("单副本全量同步(full-sync)","Single-replica full-sync"),tri:!1,nodes:[{tt:t("主实例","Primary"),s:t("同一份逻辑数据","Same logical data"),m:"10.37M keys \xb7 8GB"},{tt:t("新副本","New replica"),s:t("加入并追平","Joins & catches up"),m:t("一致性校验通过","Consistency verified")}],arrows:[t("全量同步(RDB)","Full-sync (RDB)")],bars:[{name:t("全量同步时长","Full-sync time"),ratio:`${ef(d.syncSecs.redis,d.syncSecs.engula)}\xd7 ${t("更快","faster")}`,e:`${d.syncSecs.engula}s`,r:`${d.syncSecs.redis}s`,ew:eg(d.syncSecs.engula,d.syncSecs.redis)},{name:t("RDB 文件大小","RDB file size"),ratio:`${ef(d.rdbMB.redis,d.rdbMB.engula)}\xd7 ${t("更小","smaller")}`,e:`${d.rdbMB.engula} MB`,r:`${d.rdbMB.redis} MB`,ew:eg(d.rdbMB.engula,d.rdbMB.redis)}],idx:t("01 — Full-sync 全量同步","01 — Full-sync"),h3:t("同一份数据,副本追平更快","Same data, the replica catches up faster"),lead:t("新副本对同一份数据执行 full-sync,对比同步耗时、RDB 文件大小与内存占用。","A new replica full-resyncs the same dataset; comparing sync time, RDB size and memory usage."),setup:["10.37M keys",t("内存上限 8 GB","8 GB memory cap")],facts:[{b:t("同步窗口更短","Faster sync"),tx:t(`\u{FF1A}${d.syncSecs.engula}s vs ${d.syncSecs.redis}s\u{FF08}${ef(d.syncSecs.redis,d.syncSecs.engula)}\xd7\u{FF09}\u{FF0C}\u{526F}\u{672C}\u{8FFD}\u{5E73}\u{65F6}\u{95F4}\u{7F29}\u{77ED}\u{3002}`,`: ${d.syncSecs.engula}s vs ${d.syncSecs.redis}s (${ef(d.syncSecs.redis,d.syncSecs.engula)}\xd7), a shorter window while the replica is behind.`)},{b:t("RDB 文件更小","Less data to ship"),tx:t(`\u{FF1A}RDB ${d.rdbMB.engula} MB vs ${d.rdbMB.redis} MB\u{FF08}${ef(d.rdbMB.redis,d.rdbMB.engula)}\xd7\u{FF09}\u{FF0C}\u{843D}\u{76D8}\u{4E0E}\u{590D}\u{5236}\u{6210}\u{672C}\u{964D}\u{4F4E}\u{3002}`,`: RDB ${d.rdbMB.engula} MB vs ${d.rdbMB.redis} MB (${ef(d.rdbMB.redis,d.rdbMB.engula)}\xd7), cheaper to write and replicate.`)},{b:t("同数据更省内存","Lower memory, same data"),tx:t(`\u{FF1A}${d.memMB.engula} MB\u{FF08}${d.memPct.engula}%\u{FF09}vs ${d.memMB.redis} MB\u{FF08}${d.memPct.redis}%\u{FF09}\u{3002}`,`: ${d.memMB.engula} MB (${d.memPct.engula}%) vs ${d.memMB.redis} MB (${d.memPct.redis}%).`)}]},{no:"02",tab:{tt:t("重连风暴(COW storm)","Reconnect storm (COW)"),td:t("2 副本同时重连 + 16 客户端写入","2 replicas reconnect while 16 clients write")},cap:t("重连风暴(COW storm)","Reconnect storm (COW)"),tri:!0,nodes:[{tt:t("16 客户端","16 clients"),s:t("读写比例 8:2","8:2 read/write"),m:t(c.targetQps.zh,c.targetQps.en)},{tt:t("主实例","Primary"),s:t("单次 BGSAVE","Single BGSAVE"),m:""},{tt:t("2 个副本","2 replicas"),s:t("同时重连","Reconnect together"),m:""}],arrows:[t("写入","Write"),t("全量同步","Full-sync")],bars:[{name:t("BGSAVE 内存峰值","BGSAVE memory peak"),ratio:`${ef(c.forkPssMB.redis,c.forkPssMB.engula)}\xd7 ${t("更低","lower")}`,e:`${c.forkPssMB.engula} MB`,r:`${c.forkPssMB.redis} MB`,ew:eg(c.forkPssMB.engula,c.forkPssMB.redis)},{name:t("复制缓冲峰值","Replication buffer peak"),ratio:`${ef(c.replBufMB.redis,c.replBufMB.engula)}\xd7 ${t("更低","lower")}`,e:`${c.replBufMB.engula} MB`,r:`${c.replBufMB.redis} MB`,ew:eg(c.replBufMB.engula,c.replBufMB.redis)}],idx:t("02 — Reconnect storm 重连风暴","02 — Reconnect storm"),h3:t("同一次 BGSAVE 下,primary 压力更小","Under the same single BGSAVE, less pressure on the primary"),lead:t("2 个副本同时重连,16 个客户端持续写入;对比同一次 BGSAVE 下的 primary 内存峰值与复制缓冲。","2 replicas reconnect while 16 clients keep writing during BGSAVE; comparing peak memory and replication buffers under the same BGSAVE."),setup:["10.36M keys",t("内存上限 8 GB","8 GB memory cap"),t("2 副本","2 replicas"),t("16 客户端 \xb7 读写 8:2","16 clients \xb7 8:2 read/write")],facts:[{b:t("内存峰值更低","Lower memory peak"),tx:t(`\u{FF1A}${c.forkPssMB.engula} vs ${c.forkPssMB.redis} MB\u{FF08}${ef(c.forkPssMB.redis,c.forkPssMB.engula)}\xd7\u{FF09}\u{FF0C}BGSAVE \u{671F}\u{95F4}\u{989D}\u{5916}\u{5185}\u{5B58}\u{5360}\u{7528}\u{964D}\u{4F4E}\u{3002}`,`: ${c.forkPssMB.engula} vs ${c.forkPssMB.redis} MB (${ef(c.forkPssMB.redis,c.forkPssMB.engula)}\xd7), far less extra memory during BGSAVE.`)},{b:t("复制缓冲更低","Lower replication buffers"),tx:t(`\u{FF1A}${c.replBufMB.engula} vs ${c.replBufMB.redis} MB\u{FF08}${ef(c.replBufMB.redis,c.replBufMB.engula)}\xd7\u{FF09}\u{FF0C}primary \u{4FA7}\u{7F13}\u{51B2}\u{5806}\u{79EF}\u{51CF}\u{5C11}\u{3002}`,`: ${c.replBufMB.engula} vs ${c.replBufMB.redis} MB (${ef(c.replBufMB.redis,c.replBufMB.engula)}\xd7), much less pile-up on the primary.`)},{b:t("同步窗口更短","Shorter sync window"),tx:t(`\u{FF1A}${c.syncSecs.engula}s vs ${c.syncSecs.redis}s\u{FF08}${ef(c.syncSecs.redis,c.syncSecs.engula)}\xd7\u{FF09}\u{FF0C}\u{91CD}\u{8FDE}\u{573A}\u{666F}\u{66F4}\u{5FEB}\u{6536}\u{655B}\u{3002}`,`: ${c.syncSecs.engula}s vs ${c.syncSecs.redis}s (${ef(c.syncSecs.redis,c.syncSecs.engula)}\xd7), the storm converges faster.`)}]}],m=t("测试条件:可压缩数据集、loopback 链路,两端均单次 BGSAVE;RDB 体积按磁盘文件大小计。","Conditions: compressible dataset over loopback, a single BGSAVE on both sides; RDB size is measured as the on-disk file."),p=e=>n((e+u.length)%u.length);return(0,a.jsx)("div",{className:"repl",children:(0,a.jsxs)(K,{cmp:"ReplicationSection",id:"replication",kicker:t("复制 \xb7 副本接入 / 重连","Replication \xb7 bring-up & reconnect"),title:t("更快复制,更稳重连","Faster replication, steadier reconnect"),desc:t("副本接入与批量重连会触发全量同步,并叠加 BGSAVE 带来的内存压力。以下两个场景对比 Engula 与 Redis 的同步窗口、RDB 体积与 primary 内存峰值。","A replica joining needs a full resync, and a reconnect collides with BGSAVE — the moments most likely to stretch the sync window and spike the primary’s memory and replication buffers. The two measured scenarios below compare Engula and Redis right there."),children:[(0,a.jsx)("div",{className:"repl-tabs",role:"tablist","aria-label":t("场景切换","scenarios"),children:u.map((e,t)=>(0,a.jsxs)("button",{type:"button",className:"repl-tab",role:"tab","aria-selected":t===i,onClick:()=>p(t),children:[(0,a.jsx)("span",{className:"no",children:e.no}),(0,a.jsxs)("span",{children:[(0,a.jsx)("span",{className:"tt",children:e.tab.tt}),(0,a.jsx)("span",{className:"td",children:e.tab.td})]})]},e.no))}),(0,a.jsx)("div",{className:"repl-viewport",children:(0,a.jsx)("div",{className:"repl-track",style:{transform:`translateX(${-(100*i)}%)`},children:u.map(e=>(0,a.jsx)("div",{className:"repl-slide",role:"tabpanel",children:(0,a.jsxs)("div",{className:"repl-story",children:[(0,a.jsxs)("div",{className:"repl-figure",children:[(0,a.jsxs)("div",{className:"repl-cap",children:[(0,a.jsx)("span",{className:"dot"}),e.cap]}),(0,a.jsx)("div",{className:`flowd${e.tri?" tri":""}`,children:e.nodes.map((t,s)=>(0,a.jsxs)("div",{style:{display:"contents"},children:[(0,a.jsxs)("div",{className:"fnode",children:[(0,a.jsx)("div",{className:"t",children:t.tt}),(0,a.jsx)("div",{className:"s",children:t.s}),t.m?(0,a.jsx)("div",{className:"m",children:t.m}):null]}),s<e.arrows.length?(0,a.jsxs)("div",{className:"farrow",children:[(0,a.jsx)("span",{className:"lab",children:e.arrows[s]}),(0,a.jsx)("span",{className:"ln"})]}):null]},t.tt))}),(0,a.jsx)("div",{className:"bars",children:e.bars.map(e=>(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"bar-head",children:[(0,a.jsx)("span",{className:"bar-name",children:e.name}),(0,a.jsx)("span",{className:"bar-ratio",children:e.ratio})]}),(0,a.jsxs)("div",{className:"lanes",children:[(0,a.jsxs)("div",{className:"lane e",children:[(0,a.jsx)("span",{className:"who",children:"engula"}),(0,a.jsx)("span",{className:"fill",style:{width:`${e.ew}%`}}),(0,a.jsx)("span",{className:"val",children:e.e})]}),(0,a.jsxs)("div",{className:"lane r",children:[(0,a.jsx)("span",{className:"who",children:"redis"}),(0,a.jsx)("span",{className:"fill",style:{width:"100%"}}),(0,a.jsx)("span",{className:"val",children:e.r})]})]})]},e.name))})]}),(0,a.jsxs)("div",{className:"repl-text",children:[(0,a.jsx)("p",{className:"idx",children:e.idx}),(0,a.jsx)("h3",{children:e.h3}),(0,a.jsx)("p",{className:"lead",children:e.lead}),(0,a.jsx)("div",{className:"repl-setup",children:e.setup.map(e=>(0,a.jsx)("span",{className:"s",children:e},e))}),(0,a.jsx)("ul",{className:"repl-facts",children:e.facts.map(e=>(0,a.jsxs)("li",{children:[(0,a.jsx)("span",{className:"mk"}),(0,a.jsxs)("span",{children:[(0,a.jsx)("b",{children:e.b}),e.tx]})]},e.b))})]})]})},e.no))})}
1),(0,a.jsxs)("div",{className:"repl-controls",children:[(0,a.jsx)("button",{type:"button",className:"repl-arrow","aria-label":t("上一个","Previous"),onClick:()=>p(i-1),children:"‹"}),(0,a.jsx)("div",{className:"repl-dots",children:u.map((e,t)=>(0,a.jsx)("button",{type:"button",className:"repl-dot","aria-selected":t===i,"aria-label":e.tab.tt,onClick:()=>p(t)},e.no))}),(0,a.jsx)("button",{type:"button",className:"repl-arrow","aria-label":t("下一个","Next"),onClick:()=>p(i+1),children:"›"})]}),(0,a.jsx)("p",{className:"repl-note",children:m})]})})}let ev="rgb(74,222,128)",ey="rgb(248,113,113)",ej={sentinel:{title:"Sentinel failover",headline:"Failover completed in 6.5s",metrics:[{label:"Failover duration"},{label:"Observable error window"},{label:"Client errors"}]},cluster:{title:"Cluster failover",headline:"Failover completed in 8.0s",metrics:[{label:"Failover duration"},{label:"Client errors"},{label:"Verified writes",value:"1000/1000 keys hit"}]},"replica-sync":{title:"Replica sync",headline:"5 data types + 10,000 keys \xb7 offset_diff = 0",metrics:[{label:"Type checks",value:"5/5 passed"},{label:"Bulk check",value:"10,000 keys fully consistent"},{label:"Master/Replica offset"},{label:"Offset diff",value:"0 ≤ 1000 (tolerance)"}]},reshard:{title:"Reshard",headline:"Reshard completed in 21.0s",metrics:[{label:"Total reshard time"},{label:"Error rate"},{label:"DBSIZE check",value:"before/after consistent (1000000 → 1000230)"}]},"mixed-deploy":{title:"Mixed deployment (Redis ↔ Engula)",headline:"Redis ↔ Engula bidirectional failover completed in 6.0s"},"network-partition":{title:"Network partition and recovery",headline:"iptables partition \xb7 writes recovered after replica promotion",metrics:[{label:"Partition detection → promotion"},{label:"Target master"},{label:"Target replica"},{label:"Post-recovery writes",value:"post-recovery writes verified consistent"}]},"bgsave-stability":{title:"BGSAVE stability",headline:"20 BGSAVE rounds \xb7 spike ratio ≤ 1.10",metrics:[{label:"Baseline p99 / p99.9"},{label:"During BGSAVE p99 / p99.9"},{label:"Spike ratio (p99)"},{label:"Fork latency"},{label:"BGSAVE cycles",value:"2/2 completed"}]},"linux-x86_64":{title:"Platform compatibility \xb7 Linux x86_64",headline:"7 platform checks all passed",metrics:[{label:"Target platform"},{label:"Checks"}]}};function eS(e,t){if("en"!==t)return e;let s=ej[e.id];return s?{...e,title:s.title,headline:s.headline,metrics:e.metrics.map((e,t)=>{var a;let r=null==(a=s.metrics)?void 0:a[t];return r?{label:r.label,value:r.value??e.value}:e})}:e}function eB(e){let{data:t,loading:s=!1,onHaClick:r,onPlatformClick:l}=e,i=(0,o.Xo)().proof.haPlatform,n=(0,o.bh)(),d=t.haScenarios.map(e=>eS(e,n)),c=t.platformItems.map(e=>eS(e,n));return(0,a.jsx)(K,{cmp:"HaPlatformSection",id:"ha-platform",kicker:i.kicker,title:i.title,desc:(0,a.jsxs)(a.Fragment,{children:[i.descA,(0,a.jsx)("span",{className:"whitespace-nowrap",children:i.descB})]}),children:(0,a.jsxs)("div",{className:"grid gap-5 md:grid-cols-2",children:[(0,a.jsx)(eM,{title:i.groupHa,items:d,loading:s,totalLabel:s?"—":`${d.filter(e=>"pass"===e.verdict).length} / ${d.length}`,onItemClick:r}),(0,a.jsx)(eM,{title:i.groupPlatform,items:c,loading:s,totalLabel:s?"—":`${c.filter(e=>"pass"===e.verdict).length} / ${c.length}`,onItemClick:l})]})})}function eM(e){let{title:t,items:s,totalLabel:r,onItemClick:l,loading:i=!1}=e,n=(0,o.Xo)().proof.haPlatform,d=s.length>0&&s.every(e=>"pass"===e.verdict);return(0,a.jsxs)("div",{className:"surface-card px-5 py-5 flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-baseline justify-between",children:[(0,a.jsx)("h3",{className:"font-display text-xl font-semibold text-text",children:t}),(0,a.jsx)("span",{className:"font-mono text-sm tabular-nums",style:{color:i?"var(--cs-muted)":d?ev:ey},children:r})]}),0===s.length&&(0,a.jsx)("p",{className:"text-sm text-muted",children:n.empty}),(0,a.jsx)("ul",{className:"grid gap-2",children:s.map(e=>{let t="pass"===e.verdict,s=l?{type:"button",onClick:()=>l(e),className:"flex items-start gap-3 w-full text-left rounded-lg px-2 py-1.5 -mx-2 transition-colors hover:bg-card cursor-pointer"}:{className:"flex items-start gap-3"};return(0,a.jsx)("li",{children:(0,a.jsxs)(l?"button":"div",{...s,children:[(0,a.jsx)("span",{className:"mt-1.5 inline-block w-1.5 h-1.5 rounded-full shrink-0",style:{background:i?"var(--cs-line-2)":t?ev:ey}}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("div",{className:"text-sm font-medium text-text truncate",children:e.title}),(0,a.jsx)("div",{className:"font-mono text-xs text-muted truncate",children:i?"—":e.headline})]})]})},e.id)})})]})}var ek=JSON.parse('{"$comment":"本地维护的阿里云 ECS 实例规格映射(展示用)。后端 hardware-info 只返回实例规格名,/proof-live 硬件信息区由本表补全配置。来源:阿里云官方文档(计算型 c 系列 / 本地 SSD 型 i 系列规格表),核对日期 2026-06-11。新增实例类型时在此追加;规格写法保持语言中立(中英文页面共用)。","ecs.c9i.2xlarge":"8 vCPU \xb7 16GiB \xb7 Intel Xeon Granite Rapids 3.2/3.6GHz \xb7 6/15 Gbit/s","ecs.i4g.8xlarge":"32 vCPU \xb7 128GiB \xb7 1\xd71788GiB NVMe SSD \xb7 Intel Xeon Ice Lake 2.7/3.5GHz \xb7 16/25 Gbit/s"}');let eN=["cpu","os","ecs","ecs_ssd","engula_ver","redis_ver"],ew=new Set(["engula_ver","redis_ver"]);function e$(e){let{value:t}=e;if(!t)return(0,a.jsx)(a.Fragment,{children:"—"});let s=ek[t.trim()];return s?(0,a.jsxs)(a.Fragment,{children:[t,(0,a.jsx)(l.Ob,{ariaLabel:`${t} specs`,title:t,children:s})]}):(0,a.jsx)(a.Fragment,{children:t})}function eF(e){let{data:t,loading:s=!1}=e,r=(0,o.Xo)().proof.footerMeta,i=r.hwLabels,{runtest:d,meta:c,snapshot:u,hardware:m}=t,p=m??{},x=[...eN.filter(e=>p[e]),...Object.keys(p).filter(e=>!eN.includes(e)&&p[e])];return(0,a.jsx)("section",{"data-cmp":"ProofFooterMeta",className:"py-16",children:(0,a.jsx)(l.W2,{children:(0,a.jsxs)("div",{className:"surface-card px-6 py-6 md:px-8 md:py-8 grid gap-6 md:grid-cols-2",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"section-kicker",children:r.kicker}),(0,a.jsx)("h3",{className:"font-display text-2xl font-semibold text-text mt-2",children:r.title}),(0,a.jsx)("p",{className:"mt-3 text-sm leading-relaxed text-muted",children:r.desc})]}),(0,a.jsxs)("dl",{className:"grid grid-cols-1 gap-3 text-sm",children:[!s&&x.length>0?x.map(e=>(0,a.jsx)(eR,{label:i[e]??e,children:ew.has(e)?z(p[e]):"ecs"===e||"ecs_ssd"===e?(0,a.jsx)(e$,{value:p[e]}):p[e]},e)):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(eR,{label:r.rowMachine,children:s?"—":c.machineSpec||"—"}),(0,a.jsx)(eR,{label:r.rowEngulaVer,children:s?"—":d.binary||"—"}),(0,a.jsx)(eR,{label:r.rowRedisVer,children:s?"—":d.redisVersion||"Redis 7.2.11"})]}),(0,a.jsx)(eR,{label:r.rowCollection,children:r.collectionValue}),(0,a.jsx)(eR,{label:r.rowSource,children:(0,a.jsx)(n.rU,{href:"https://github.com/redis/redis/tree/7.2.11/tests",target:"_blank",rel:"noopener noreferrer",className:"text-text hover:underline",children:"github.com/redis/[email protected]/tests ↗"})}),(0,a.jsx)(eR,{label:r.rowDashboard,children:(0,a.jsx)("a",{href:u.resultsHref||"/proof",target:"_blank",rel:"noopener noreferrer",className:"text-text hover:underline",children:r.dashboardLink})})]})]})})})}function eR(e){let{label:t,children:s}=e;return(0,a.jsxs)("div",{className:"grid grid-cols-[92px_1fr] gap-3 items-baseline",children:[(0,a.jsx)("dt",{className:"font-mono text-[0.65rem] tracking-[0.18em] uppercase text-muted",children:t}),(0,a.jsx)("dd",{className:"text-text min-w-0 break-words",children:s})]})}var e_=s(9156);function eT(){let e=(0,r.useRef)(!1);return(0,e_.L)(()=>(e.current=!0,()=>{e.current=!1}),[]),e}var eP=s(2663),eC=s(1307),eE=s(1322),eI=s(6610);class eD extends r.Component{getSnapshotBeforeUpdate(e){let t=this.props.childRef.current;if(t&&e.isPresent&&!this.props.isPresent){let e=this.props.sizeRef.current;e.height=t.offsetHeight||0,e.width=t.offsetWidth||0,e.top=t.offsetTop,e.left=t.offsetLeft}return null}componentDidUpdate(){}render(){return this.props.children}}function eA({children:e,isPresent:t}){let s=(0,r.useId)(),l=(0,r.useRef)(null),i=(0,r.useRef)({width:0,height:0,top:0,left:0}),{nonce:n}=(0,r.useContext)(eI._);return(0,r.useInsertionEffect)(()=>{let{width:e,height:a,top:r,left:d}=i.current;if(t||!l.current||!e||!a)return;l.current.dataset.motionPopId=s;let o=document.createElement("style");return n&&(o.nonce=n),document.head.appendChild(o),o.sheet&&o.sheet.insertRule(`
2          [data-motion-pop-id="${s}"] {
3            position: absolute !important;
4            width: ${e}px !important;
5            height: ${a}px !important;
6            top: ${r}px !important;
7            left: ${d}px !important;
8          }
9        `),()=>{document.head.removeChild(o)}},[t]),(0,a.jsx)(eD,{isPresent:t,childRef:l,sizeRef:i,children:r.cloneElement(e,{ref:l})})}let eL=({children:e,initial:t,isPresent:s,onExitComplete:l,custom:i,presenceAffectsLayout:n,mode:d})=>{let o=(0,eE.h)(eG),c=(0,r.useId)(),u=(0,r.useMemo)(()=>({id:c,initial:t,isPresent:s,custom:i,onExitComplete:e=>
9{for(let t of(o.set(e,!0),o.values()))if(!t)return;l&&l()},register:e=>(o.set(e,!1),()=>o.delete(e))}),n?[Math.random()]:[s]);return(0,r.useMemo)(()=>{o.forEach((e,t)=>o.set(t,!1))},[s]),r.useEffect(()=>{s||o.size||!l||l()},[s]),"popLayout"===d&&(e=(0,a.jsx)(eA,{isPresent:s,children:e})),(0,a.jsx)(eC.O.Provider,{value:u,children:e})};function eG(){return new Map}var eU=s(4589),eO=s(6857);let eV=e=>e.key||"",ez=({children:e,custom:t,initial:s=!0,onExitComplete:l,exitBeforeEnter:i,presenceAffectsLayout:n=!0,mode:d="sync"})=>{var o;(0,eO.k)(!i,"Replace exitBeforeEnter with mode='wait'");let c=(0,r.useContext)(eU.p).forceRender||function(){let e=eT(),[t,s]=(0,r.useState)(0),a=(0,r.useCallback)(()=>{e.current&&s(t+1)},[t]);return[(0,r.useCallback)(()=>eP.Wi.postRender(a),[a]),t]}()[0],u=eT(),m=function(e){let t=[];return r.Children.forEach(e,e=>{(0,r.isValidElement)(e)&&t.push(e)}),t}(e),p=m,x=(0,r.useRef)(new Map).current,h=(0,r.useRef)(p),f=(0,r.useRef)(new Map).current,g=(0,r.useRef)(!0);if((0,e_.L)(()=>{g.current=!1,m.forEach(e=>{let t=eV(e);f.set(t,e)}),h.current=p}),o=()=>{g.current=!0,f.clear(),x.clear()},(0,r.useEffect)(()=>()=>o(),[]),g.current)return(0,a.jsx)(a.Fragment,{children:p.map(e=>(0,a.jsx)(eL,{isPresent:!0,initial:!!s&&void 0,presenceAffectsLayout:n,mode:d,children:e},eV(e)))});p=[...p];let b=h.current.map(eV),v=m.map(eV),y=b.length;for(let e=0;e<y;e++){let t=b[e];-1!==v.indexOf(t)||x.has(t)||x.set(t,void 0)}return"wait"===d&&x.size&&(p=[]),x.forEach((e,s)=>{if(-1!==v.indexOf(s))return;let r=f.get(s);if(!r)return;let i=b.indexOf(s),o=e;o||(o=(0,a.jsx)(eL,{isPresent:!1,onExitComplete:()=>{x.delete(s);let e=Array.from(f.keys()).filter(e=>!v.includes(e));if(e.forEach(e=>f.delete(e)),h.current=m.filter(t=>{let a=eV(t);return a===s||e.includes(a)}),!x.size){if(!1===u.current)return;c(),l&&l()}},custom:t,presenceAffectsLayout:n,mode:d,children:r},eV(r)),x.set(s,o)),p.splice(i,0,o)}),p=p.map(e=>{let t=e.key;return x.has(t)?e:(0,a.jsx)(eL,{isPresent:!0,presenceAffectsLayout:n,mode:d,children:e},eV(e))}),(0,a.jsx)(a.Fragment,{children:x.size?p:p.map(e=>(0,r.cloneElement)(e))})};var eH=s(3867);let eX={runtest_unit:"View full Runtest",compat_subsuite:"View compatibility suites",client_sdk:"View client compatibility",perf_cell:"View performance",rdb_cell:"View RDB",memory_cell:"View memory efficiency",ha_scenario:"View high availability",platform_cell:"View platform"};function eW(e){let{data:t,payload:s,onClose:l}=e,i=(0,eH.QT)(),n=(0,o.bh)();(0,r.useEffect)(()=>{if(!s)return;let e=e=>{"Escape"===e.key&&l()};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[s,l]);let c=s?t.drilldown.cellMap[s.drilldownKey]:void 0,u=c?c.target:void 0,m="en"===n?"Close":i("menu.close"),p=c?"en"===n?eX[(null==s?void 0:s.drilldownKey)??""]??c.label:c.label:"";return(0,a.jsx)(ez,{children:s&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(d.E.div,{initial:{opacity:0}
9,animate:{opacity:1},exit:{opacity:0},transition:{duration:.15},onClick:l,className:"fixed inset-0 z-40 bg-black/35 backdrop-blur-[2px]","aria-hidden":"true"},"backdrop"),(0,a.jsx)("div",{className:"pointer-events-none fixed inset-0 z-50 flex items-end justify-center p-3 sm:items-center",children:(0,a.jsxs)(d.E.div,{role:"dialog","aria-modal":"true","aria-label":s.title,initial:{opacity:0,y:24},animate:{opacity:1,y:0},exit:{opacity:0,y:12},transition:{duration:.22,ease:[.2,.8,.2,1]},className:"pointer-events-auto flex max-h-[85vh] w-full max-w-[720px] flex-col rounded-2xl border border-line bg-bg shadow-[0_24px_64px_-32px_rgba(0,0,0,0.45)]",children:[(0,a.jsxs)("div",{className:"flex shrink-0 items-start justify-between gap-3 border-b border-line px-5 py-4",children:[(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("h2",{className:"font-display text-lg font-semibold text-text truncate",children:s.title}),s.subtitle&&(0,a.jsx)("p",{className:"mt-1 font-mono text-xs text-muted",children:s.subtitle})]}),(0,a.jsx)("button",{type:"button",onClick:l,"aria-label":m,className:"shrink-0 rounded-lg border border-line px-2 py-1 text-sm text-muted transition-colors hover:bg-card hover:text-text",children:"\xd7"})]}),(0,a.jsx)("div",{className:"min-h-0 flex-1 overflow-y-auto px-5 py-4 text-sm leading-relaxed text-text",children:s.body}),c&&u&&(0,a.jsxs)("div",{className:"flex shrink-0 items-center justify-end gap-2 border-t border-line px-5 py-3",children:[(0,a.jsx)("button",{type:"button",onClick:l,className:"rounded-lg px-3 py-2 text-sm text-muted transition-colors hover:bg-card hover:text-text",children:m}),(0,a.jsxs)("a",{href:u,target:"_blank",rel:"noopener noreferrer",className:"inline-flex min-h-[40px] items-center justify-center rounded-lg bg-text px-4 py-2 text-sm font-medium text-[var(--cs-bg)] transition-opacity hover:opacity-90",children:[p," ","↗"]})]})]},"panel")})]})})}let eJ="rgb(22,163,74)",eK="rgb(220,38,38)",eZ=/[\u4E00-\u9FFF]/;function eY(e){return"en"===e}function eQ(e,t,s){if(e)return eY(t)&&eZ.test(e)?s:e}function eq(e){if(!e)return"—";let t=e.split(":");return 2===t.length?`${t[1]}:${t[0]}`:e}function e0(e){let{item:t,lang:s}=e,r=eY(s);return(0,a.jsxs)("div",{className:"grid gap-3",children:[(0,a.jsx)(e1,{k:"VERDICT",v:t.verdict.toUpperCase(),positive:"pass"===t.verdict,mono:!0}),t.metrics.map(e=>(0,a.jsx)(e1,{k:e.label,v:e.value},e.label)),t.runId&&(0,a.jsx)(e1,{k:"Run ID",v:t.runId,mono:!0}),t.osChecks&&t.osChecks.length>0&&(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-mono text-[0.65rem] tracking-[0.2em] uppercase text-muted mb-2",children:r?`Verified operating systems (${t.osChecks.length})`:(0,a.jsxs)(a.Fragment,{children:["已验证操作系统(共"," ",t.osChecks.length,")"]})}),(0,a.jsx)("div",{className:"grid gap-1.5",children:t.osChecks.map(e=>(0,a.jsxs)("div",{className:"flex items-baseline justify-between gap-3 rounded-md border border-line px-3 py-2",children:[(0,a.jsxs)("span",{className:"min-w-0 font-mono text-[0.8rem] text-text break-all",children:[e.image,(0,a.jsxs)("span",{className:"text-muted",children:[" \xb7 ",e.arch,e.glibc?` \xb7 glibc ${e.glibc}`:""]})]}),(0,a.jsx)("span",{className:"shrink-0 font-mono text-[0.72rem]",style:{color:"pass"===e.status?eJ:eK},children:"pass"===e.status?"✓":"✗"})]},e.id))})]})]})}function e1(e){let{k:t,v:s,positive:r,mono:l}=e;return(0,a.jsxs)("div",{className:"grid grid-cols-[max-content_1fr] gap-3 items-baseline",children:[(0,a.jsx)("span",{className:"font-mono text-[0.65rem] tracking-[0.2em] uppercase text-muted whitespace-nowrap",children:t}),(0,a.jsx)("span",{className:l?"font-mono text-[0.85rem]":"tabular-nums",style:{color:r?eJ:"var(--cs-text)"},children:s})]})}function e2(e){return null==e?"—":e>=1e4?`${(e/1e3).toFixed(1)}k`:Number.isInteger(e)?String(e):e.toFixed(2)}let e9="engula:proof-data:v4",e6="undefined"!=typeof document?r.useLayoutEffect:r.useEffect;function e5(){let e=(0,o.bh)(),[t,s]=(0,r.useState)(()=>X()),[n,d]=(0,r.useState)(!0),[u,m]=(0,r.useState)(null);return e6(()=>{try{let e=localStorage.getItem(e9);e&&(s(t=>({...t,...JSON.parse(e)})),d(!1))}catch{}},[]),(0,r.useEffect)(()=>{let e=!0;return W().then(t=>{if(e){s(t),d(!1);try{localStorage.setItem(e9,JSON.stringify(t))}catch{}}}).catch(()=>{e&&d(!1)}),()=>{e=!1}},[]),(0,a.jsx)(l.kz,{children:(0,a.jsxs)("main",{children:[(0,a.jsx)(c,{data:t,loading:n}),(0,a.jsx)(p,{data:t,loading:n}),(0,a.jsx)(q,{data:t,loading:n,onGroupClick:(t,s)=>m(function(e,t,s){let r=e.totalSubtests>0?`${(e.passedSubtests/e.totalSubtests*100).toFixed(2)}%`:"—",l=t.filter(e=>"fail"===e.status),i=0===e.failedSubtests&&0===e.failedUnits,n=eY(s);return{title:e.label,subtitle:n?`runtest suite \xb7 cases ${e.passedSubtests} / ${e.totalSubtests} \xb7 ${r}`:`runtest \u{5957}\u{4EF6} \xb7 \u{7528}\u{4F8B} ${e.passedSubtests} / ${e.totalSubtests} \xb7 ${r}`,drilldownKey:"runtest_unit",body:(0,a.jsxs)("div",{className:"grid gap-4",children:[(0,a.jsxs)("div",{className:"grid gap-3",children:[(0,a.jsx)(e1,{k:n?"Passed cases":"通过用例",v:`${e.passedSubtests} / ${e.totalSubtests}`,positive:i}),(0,a.jsx)(e1,{k:n?"Pass rate":"通过占比",v:r,positive:i}),(0,a.jsx)(e1,{k:n?"Test units":"测试单元",v:`${e.passedUnits} / ${e.totalUnits}`,positive:0===e.failedUnits}),(0,a.jsx)(e1,{k:n?"Duration":"用时",v:function(e){if(null==e)return"—";if(e<60)return`${Math.round(e)}s`;let t=Math.floor(e/60),s=Math.round(e%60);return s?`${t}m${s}s`:`${t}m`}(e.durationSec)})]}),l.length>0?(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-mono text-[0.65rem] tracking-[0.2em] uppercase text-muted mb-2",children:n?`Failed units (${l.length})`:(0,a.jsxs)(a.Fragment,{children:["未通过单元(共"," ",l.length,")"]})}),(0,a.jsx)("div",{className:"grid gap-3",children:l.map(e=>{let t=eQ(e.reason,s,"See the linked report for the detailed root-cause note."),r=eQ(e.impact,s,"See the linked report for the impact assessment.");return(0,a.jsxs)("div",{className:"rounded-lg border border-line p-3",children:[(0,a.jsx)("h3",{className:"font-mono text-[0.85rem] text-text break-all mb-2",children:e.name}),t&&(0,a.jsxs)("div",{className:"mb-2",children:[(0,a.jsx)("div",{className:"font-mono text-[0.62rem] tracking-[0.2em] uppercase text-muted mb-0.5",children:n?"Reason":"原因"}),(0,a.jsx)("p",{className:"text-[0.85rem] leading-relaxed",children:t})]}),r&&(0,a.jsxs)("div",{className:"mb-2",children:[(0,a.jsx)("div",{className:"font-mono text-[0.62rem] tracking-[0.2em] uppercase text-muted mb-0.5",children:n?"Impact":"影响面"}),(0,a.jsx)("p",{className:"text-[0.85rem] leading-relaxed",children:r})]}),e.failedSubtests&&e.failedSubtests.length>0&&(0,a.jsxs)("details",{className:"mt-2",children:[(0,a.jsxs)("summary",{className:"cursor-pointer font-mono text-[0.7rem] text-muted hover:text-text",children:[e.failedSubtests.length," ",n?"failing subtests ↓":"项未通过子用例 ↓"]}),(0,a.jsx)("ul",{className:"mt-2 grid gap-1 pl-2 text-[0.78rem] font-mono text-text",children:e.failedSubtests.map(e=>(0,a.jsxs)("li",{className:"break-words",children:["\xb7"," ",e]},e))})]})]},e.name)})})]}):(0,a.jsx)("div",{className:"rounded-md border border-line bg-card px-3 py-3 text-sm text-muted leading-relaxed",children:n?`This group has ${e.totalUnits} test units / ${e.totalSubtests} cases. ${i?"All passed.":"See the counts above."}`:(0,a.jsxs)(a.Fragment,{children:["本组"," ",e.totalUnits," 个测试单元 / ",e.totalSubtests," 个用例 ",i?"全部通过。":"——见上方计数。"]})})]})}}(t,s,e))}),(0,a.jsx)(Z,{data:t,loading:n,onSubtestClick:(t,s)=>m(function(e,t,s){let r=f(e.name),l=eY(s),i=eQ(r.reason,s,"See the linked report for the detailed root-cause note."),n=eQ(r.impact,s,"See the linked report for the impact assessment.");return{title:t,subtitle:l?`runtest unit \xb7 ${e.name}`:`runtest \u{5355}\u{5143} \xb7 ${e.name}`,drilldownKey:"runtest_unit",body:(0,a.jsxs)("div",{className:"grid gap-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"font-mono text-[0.7rem] tracking-wider px-1.5 py-0.5 rounded",style:{background:"rgba(220,38,38,0.12)",color:eK},children:"FAIL"}),(0,a.jsx)("span",{className:"font-mono text-[0.7rem] text-muted",children:l?"Unit":"所属单元"}),(0,a.jsx)("span",{className:"font-mono text-[0.78rem] text-text",children:e.name})]}),i&&(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-mono text-[0.65rem] tracking-[0.2em] uppercase text-muted mb-1",children:l?"Reason":"原因"}),(0,a.jsx)("p",{className:"leading-relaxed",children:i})]}),n&&(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:"font-mono text-[0.65rem] tracking-[0.2em] uppercase text-muted mb-1",children:l?"Impact":"影响面"}),(0,a.jsx)("p",{className:"leading-relaxed",children:n})]}),e.failedSubtests&&e.failedSubtests.length>1&&(0,a.jsx)("div",{className:"rounded-md border border-line bg-card px-3 py-2 text-xs text-muted leading-relaxed",children:l?`This unit (${e.name}) has ${e.failedSubtests.length} failing subtests. The other items share the same root cause, with the same compatibility difference detected by multiple assertions.`:(0,a.jsxs)(a.Fragment,{children:["该单元(",e.name,")共"," ",e.failedSubtests.length," ","项未通过;其他项属于同一兼容性差异。"]})})]})}}(t,s,e))}),(0,a.jsx)(Y,{data:t,loading:n,onCellClick:t=>m(function(e,t){let s=(100*e.passRate).toFixed(2),r=eY(t);return{title:`${e.name} \xb7 ${e.language}
9`,subtitle:r?`Client compatibility \xb7 ${e.version} \xb7 ${e.passed} / ${e.total} \xb7 ${s}%`:`\u{5BA2}\u{6237}\u{7AEF}\u{517C}\u{5BB9} \xb7 ${e.version} \xb7 ${e.passed} / ${e.total} \xb7 ${s}%`,drilldownKey:"client_sdk",body:(0,a.jsxs)("div",{className:"grid gap-3",children:[(0,a.jsx)(e1,{k:r?"Pass rate":"通过占比",v:`${s}%`,positive:"pass"===e.verdict}),(0,a.jsx)(e1,{k:r?"Passed / total":"通过 / 总数",v:`${e.passed} / ${e.total}`}),(0,a.jsx)(e1,{k:r?"engula-only failures":"仅 Engula 未通过",v:String(e.engulaOnlyFailures)}),(0,a.jsx)(e1,{k:r?"shared failures (informational)":"共同未通过(信息项)",v:String(e.sharedFailures)}),(0,a.jsx)(e1,{k:"Run ID",v:e.runId,mono:!0}),(0,a.jsx)("p",{className:"text-xs text-muted leading-relaxed",children:r?(0,a.jsxs)(a.Fragment,{children:["Shared failures are cases where both Engula and Redis fail under the same client test. They are usually caused by the test framework or known Redis-side issues and are informational only; they do not affect the verdict (",(0,a.jsx)("span",{className:"whitespace-nowrap",children:"threshold 0.95"}),")."]}):(0,a.jsxs)(a.Fragment,{children:["共同未通过指 Engula 与 Redis 在同一客户端用例下均未通过,通常由测试框架或 Redis 已知问题触发; 仅作信息披露,不影响结论(",(0,a.jsx)("span",{className:"whitespace-nowrap",children:"阈值 0.95"}),")。"]})})]})}}(t,e))}),(0,a.jsx)(ed,{data:t,loading:n,onCellClick:t=>m(function(e,t){let s=e.dimensions,r=e.ratio??1,l=eY(t);return{title:`${l?"Performance":"性能"} \xb7 ${s.threads}-thread \xd7 value ${s.valueSize}B`,subtitle:l?`read/write ratio ${eq(s.writeRatio)} (read:write) \xb7 ratio ${r.toFixed(2)}\xd7`:`\u{8BFB}\u{5199}\u{6BD4}\u{4F8B} ${eq(s.writeRatio)}\u{FF08}\u{8BFB}:\u{5199}\u{FF09}\xb7 ratio ${r.toFixed(2)}\xd7`,drilldownKey:"perf_cell",body:(0,a.jsxs)("div",{className:"grid gap-3",children:[(0,a.jsx)(e1,{k:"engula",v:`${e2(e.engula)} ops/s`}),(0,a.jsx)(e1,{k:"redis",v:`${e2(e.baseline)} ops/s`}),(0,a.jsx)(e1,{k:l?"ratio (engula / redis)":"比值(engula / redis)",v:`${r.toFixed(2)}\xd7`,positive:r>=1}),(0,a.jsx)("p",{className:"text-xs text-muted leading-relaxed",children:l?"The dataset comes from real perf-3.1-throughput runs. Use the bottom link to inspect the latest 10-run history plus p99, memory and CPU details.":"数据集来自 perf-3.1-throughput 真实跑测;点击底部按钮查看历史 10 次 run 与 p99 / 内存 / CPU 详情。"})]})}}(t,e))}),(0,a.jsx)(em,{data:t,loading:n,onCellClick:t=>m(function(e,t){var s,r;let l=e.dimensions,i=e.ratio??1,n="load"===l.op,d=n?"LOAD":"SAVE",o=eY(t);return{title:`RDB ${d} \xb7 ${l.datasetSize} ${l.type}`,subtitle:o?`engula is ${i.toFixed(2)}\xd7 faster than redis`:`engula \u{6BD4} redis \u{5FEB} ${i.toFixed(2)}\xd7`,drilldownKey:"rdb_cell",body:(0,a.jsxs)("div",{className:"grid gap-3",children:[(0,a.jsx)(e1,{k:o?`engula ${d.toLowerCase()} time`:`engula ${d.toLowerCase()} \u{8017}\u{65F6}`,v:`${null==(s=e.engula)?void 0:s.toFixed(2)} s`}),(0,a.jsx)(e1,{k:o?`redis ${d.toLowerCase()} time`:`redis ${d.toLowerCase()} \u{8017}\u{65F6}`,v:`${null==(r=e.baseline)?void 0:r.toFixed(2)} s`}),(0,a.jsx)(e1,{k:o?"Ratio":"比值",v:`${i.toFixed(2)}\xd7`,positive:i>=1}),(0,a.jsx)("p",{className:"text-xs text-muted leading-relaxed",children:o?(0,a.jsxs)(a.Fragment,{children:["The dataset comes from real perf-3.5-rdb-save-load runs.",n?" LOAD measures the cold-start time to restore memory from an RDB file, which defines the unreadable window during recovery or scale-out.":" SAVE measures blocking RDB write time for planned persistence. See the BGSAVE stress card below for the fork-window comparison."]}):(0,a.jsxs)(a.Fragment,{children:["数据集来自 perf-3.5-rdb-save-load 真实跑测。",n?" LOAD = 冷启动从 RDB 文件恢复内存的耗时,决定故障恢复 / 扩容上线的不可读窗口。":` SAVE = \u{963B}\u{585E}\u{5F0F} RDB \u{5199}\u{76D8}\u{8017}\u{65F6}\u{FF0C}\u{662F}\u{8BA1}\u{5212}\u{5185}\u{6301}\u{4E45}\u{5316}\u{7684}\u{7B49}\u{5F85}\u{65F6}\u{95F4}\u{3002}BGSAVE \u{7684} fork \u{7A97}\u{53E3}\u{5BF9}\u{6BD4}\u{89C1} ${n?"加载":"落盘"}\u{4E0B}\u{65B9}\u{7684} stress \u{5361}\u{3002}`]})})]})}}(t,e))}),(0,a.jsx)(eb,{}),(0,a.jsx)(eB,{data:t,loading:n,onHaClick:t=>m(function(e,t){let s=eY(t);return{title:e.title,subtitle:`${s?"HA scenario":"HA 场景"} \xb7 ${e.headline}`,drilldownKey:"ha_scenario",body:(0,a.jsx)(e0,{item:e,lang:t})}}(t,e)),onPlatformClick:t=>m(function(e,t){let s=eY(t);return{title:e.title,subtitle:`${s?"Platform / stability":"平台 / 稳定性"} \xb7 ${e.headline}`,drilldownKey:"platform_cell",body:(0,a.jsx)(e0,{item:e,lang:t})}}(t,e))}),(0,a.jsx)(i.z9,{}),(0,a.jsx)(eF,{data:t,loading:n}),(0,a.jsx)(eW,{data:t,payload:u,onClose:()=>m(null)})]})})}}}]);

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.