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.