1"use strict";(globalThis.webpackChunkdocs=globalThis.webpackChunkdocs||[]).push([[3520],{24806(e,t,i){i.r(t),i.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>x,frontMatter:()=>h,metadata:()=>r,toc:()=>n});const r=JSON.parse('{"id":"user-guide/architecture/chronokeeper","title":"ChronoKeeper","description":"ChronoKeeper is the component responsible for fast ingestion of the log events coming from the client processes, efficiently grouping them into partial StoryChunks and moving them down to the lower tier of ChronoLog system.","source":"@site/versioned_docs/version-3.1.1/user-guide/architecture/chronokeeper.md","sourceDirName":"user-guide/architecture","slug":"/user-guide/architecture/chronokeeper","permalink":"/docs/3.1.1/user-guide/architecture/chronokeeper","draft":false,"unlisted":false,"editUrl":"https://github.com/grc-iit/ChronoLog/tree/main/docs/versioned_docs/version-3.1.1/user-guide/architecture/chronokeeper.md","tags":[],"version":"3.1.1","sidebarPosition":3,"frontMatter":{"sidebar_position":3,"title":"ChronoKeeper"},"sidebar":"userGuideSidebar","previous":{"title":"ChronoVisor","permalink":"/docs/3.1.1/user-guide/architecture/chronovisor"},"next":{"title":"ChronoGrapher","permalink":"/docs/3.1.1/user-guide/architecture/chronographer"}}');var s=i(74848),o=i(28453);const h={sidebar_position:3,title:"ChronoKeeper"},l="ChronoKeeper",d={},n=[{value:"On-Demand Tail Reading",id:"on-demand-tail-reading",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"chronokeeper",children:"ChronoKeeper"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"ChronoKeeper"})," is the component responsible for fast ingestion of the log events coming from the client processes, efficiently grouping them into partial StoryChunks and moving them down to the lower tier of ChronoLog system."]}),"\n",(0,s.jsx)(t.p,{children:"Most ChronoLog deployments would have ChronoKeeper processes running on the majority of the compute nodes and each Recording Group is expected to have multiple ChronoKeeper processes."}),"\n",(0,s.jsxs)("svg",{viewBox:"0 0 720 590",width:"100%",xmlns:"http://www.w3.org/2000/svg",fontFamily:"system-ui, sans-serif",children:[(0,s.jsx)("rect",{x:"0",y:"0",width:"720",height:"590",rx:"10",fill:"#1e2330"}),(0,s.jsx)("text",{x:"360",y:"20",textAnchor:"middle",fill:"#c3e04d",fontSize:"10",fontWeight:"600",children:"CHRONOKEEPER COMPONENTS"}),(0,s.jsx)("rect",{x:"20",y:"30",width:"680",height:"550",rx:"8",fill:"none",stroke:"#c3e04d",strokeWidth:"1",strokeOpacity:"0.25",strokeDasharray:"8,4"}),(0,s.jsx)("text",{x:"32",y:"44",fill:"#c3e04d",fontSize:"8",fontWeight:"600",fillOpacity:"0.6",children:"CHRONOKEEPER"}),(0,s.jsxs)("g",{transform:"translate(0, 30)",children:[(0,s.jsx)("text",{x:"500",y:"16",textAnchor:"end",fill:"#9ca3b0",fontSize:"7",fontStyle:"italic",children:"Individual Events are streamed from the"}),(0,s.jsx)("text",{x:"500",y:"26",textAnchor:"end",fill:"#9ca3b0",fontSize:"7",fontStyle:"italic",children:"Client processes to the ChronoKeepers"}),(0,s.jsx)("line",{x1:"440",y1:"30",x2:"440",y2:"46",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.5"}),(0,s.jsx)("polygon",{points:"440,48 436,42 444,42",fill:"#c3e04d",fillOpacity:"0.6"}),(0,s.jsx)("rect",{x:"190",y:"48",width:"500",height:"34",rx:"6",fill:"#252b3b",stroke:"#c3e04d",strokeWidth:"1",strokeOpacity:"0.5"}),(0,s.jsx)("circle",{cx:"206",cy:"65",r:"3",fill:"#c3e04d",fillOpacity:"0.8"}),(0,s.jsx)("text",{x:"214",y:"69",fill:"#c3e04d",fontSize:"10",fontWeight:"600",children:"Keeper Recording Service"}),(0,s.jsx)("line",{x1:"440",y1:"82",x2:"440",y2:"94",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.5"}),(0,s.jsx)("polygon",{points:"440,96 436,90 444,90",fill:"#c3e04d",fillOpacity:"0.6"}),(0,s.jsx)("rect",{x:"190",y:"96",width:"500",height:"34",rx:"6",fill:"#252b3b",stroke:"#c3e04d",strokeWidth:"1",strokeOpacity:"0.5"}),(0,s.jsx)("circle",{cx:"206",cy:"113",r:"3",fill:"#c3e04d",fillOpacity:"0.8"}),(0,s.jsx)("text",{x:"214",y:"117",fill:"#c3e04d",fontSize:"10",fontWeight:"600",children:"Event Ingestion Queue"}),(0,s.jsx)("line",{x1:"440",y1:"130",x2:"440",y2:"152",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.5"}),(0,s.jsx)("polygon",{points:"440,154 436,148 444,148",fill:"#c3e04d",fillOpacity:"0.6"}),(0,s.jsx)("rect",{x:"190",y:"154",width:"500",height:"236",rx:"6",fill:"none",stroke:"#4a90a4",strokeWidth:"0.75",strokeDasharray:"6,3",strokeOpacity:"0.4"}),(0,s.jsx)("text",{x:"202",y:"170",fill:"#4a90a4",fontSize:"8",fontWeight:"600",fillOpacity:"0.7",children:"KEEPER DATA STORE"}),(0,s.jsx)("rect",{x:"200",y:"180",width:"60",height:"196",rx:"4",fill:"#252b3b",stroke:"#3a4050",strokeWidth:"0.75"}),(0,s.jsx)("text",{x:"230",y:"285",fill:"#e4e7ed",fontSize:"8",transform:"rotate(-90 230 285)",textAnchor:"middle",children:"Keeper Data Store"}),(0,s.jsx)("rect",{x:"275",y:"180",width:"125",height:"196",rx:"4",fill:"#252b3b",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.4"}),(0,s.jsx)("text",{x:"337",y:"196",textAnchor:"middle",fill:"#c3e04d",fontSize:"8",fontWeight:"600",children:"Story 1 Pipeline"}),(0,s.jsx)("rect",{x:"285",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"311",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"337",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"363",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"285",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"311",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"337",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"363",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"285",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"311",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"337",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"363",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"285",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"311",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"337",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"363",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"285",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"311",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"337",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"363",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"285",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"311",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"337",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"363",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"285",y:"324",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"311",y:"324",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"337",y:"324",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"363",y:"324",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"285",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"311",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"337",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"363",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"410",y:"180",width:"125",height:"196",rx:"4",fill:"#252b3b",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.4"}),(0,s.jsx)("text",{x:"472",y:"196",textAnchor:"middle",fill:"#c3e04d",fontSize:"8",fontWeight:"600",children:"Story 2 Pipeline"}),(0,s.jsx)("rect",{x:"420",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"446",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"472",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"498",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"420",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"446",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"472",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"498",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"420",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"446",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"472",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"498",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"420",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"446",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"472",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"498",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"420",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"446",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"472",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"498",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"420",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"446",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"472",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"498",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"420",y:"324",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"446",y:"324",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"472",y:"324",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"498",y:"324",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"420",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"446",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"472",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"498",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"545",y:"180",width:"125",height:"196",rx:"4",fill:"#252b3b",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.4"}),(0,s.jsx)("text",{x:"607",y:"196",textAnchor:"middle",fill:"#c3e04d",fontSize:"8",fontWeight:"600",children:"Story 3 Pipeline"}),(0,s.jsx)("rect",{x:"555",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"581",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"607",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"633",y:"204",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"555",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"581",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"607",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"633",y:"224",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"555",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"581",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"607",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"633",y:"244",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"555",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"581",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"607",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"633",y:"264",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"555",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"581",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"607",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"633",y:"284",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"555",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"581",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"607",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"633",y:"304",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"555",y:"324",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"581",y:"324",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"607",y:"324",width:"22",height:"16",rx:"
12",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"633",y:"324",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"555",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"581",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"607",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("rect",{x:"633",y:"344",width:"22",height:"16",rx:"2",fill:"#1e2330",stroke:"#3a4050",strokeWidth:"0.5"}),(0,s.jsx)("text",{x:"92",y:"155",textAnchor:"middle",fill:"#9ca3b0",fontSize:"6.5",fontStyle:"italic",children:"ChronoKeeper Registration"}),(0,s.jsx)("text",{x:"92",y:"163",textAnchor:"middle",fill:"#9ca3b0",fontSize:"6.5",fontStyle:"italic",children:"and Heartbeat Msgs"}),(0,s.jsx)("rect",{x:"10",y:"170",width:"165",height:"50",rx:"6",fill:"#252b3b",stroke:"#c3e04d",strokeWidth:"1",strokeOpacity:"0.5"}),(0,s.jsx)("circle",{cx:"26",cy:"190",r:"3",fill:"#c3e04d",fillOpacity:"0.8"}),(0,s.jsx)("text",{x:"34",y:"194",fill:"#c3e04d",fontSize:"9",fontWeight:"600",children:"Keeper Registry Client"}),(0,s.jsx)("text",{x:"26",y:"208",fill:"#9ca3b0",fontSize:"6.5",children:"Registration & Heartbeat msgs"}),(0,s.jsx)("polygon",{points:"2,190 8,186 8,194",fill:"#c3e04d",fillOpacity:"0.6"}),(0,s.jsx)("line",{x1:"8",y1:"190",x2:"10",y2:"190",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.5"}),(0,s.jsx)("rect",{x:"10",y:"240",width:"165",height:"50",rx:"6",fill:"#252b3b",stroke:"#c3e04d",strokeWidth:"1",strokeOpacity:"0.5"}),(0,s.jsx)("circle",{cx:"26",cy:"260",r:"3",fill:"#c3e04d",fillOpacity:"0.8"}),(0,s.jsx)("text",{x:"34",y:"264",fill:"#c3e04d",fontSize:"9",fontWeight:"600",children:"DataStore Admin Service"}),(0,s.jsx)("text",{x:"26",y:"278",fill:"#9ca3b0",fontSize:"6.5",children:"Start/Stop Story recording notifications"}),(0,s.jsx)("line",{x1:"2",y1:"260",x2:"10",y2:"260",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.5"}),(0,s.jsx)("polygon",{points:"10,260 4,256 4,264",fill:"#c3e04d",fillOpacity:"0.6"}),(0,s.jsx)("text",{x:"92",y:"302",textAnchor:"middle",fill:"#9ca3b0",fontSize:"6.5",fontStyle:"italic",children:"Notifications from the ChronoVisor"}),(0,s.jsx)("text",{x:"92",y:"310",textAnchor:"middle",fill:"#9ca3b0",fontSize:"6.5",fontStyle:"italic",children:"to Start & Stop Story Recording"}),(0,s.jsx)("line",{x1:"175",y1:"265",x2:"188",y2:"265",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.5"}),(0,s.jsx)("polygon",{points:"190,265 184,261 184,269",fill:"#c3e04d",fillOpacity:"0.6"}),(0,s.jsx)("line",{x1:"440",y1:"390",x2:"440",y2:"404",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.5"}),(0,s.jsx)("polygon",{points:"440,406 436,400 444,400",fill:"#c3e04d",fillOpacity:"0.6"}),(0,s.jsx)("rect",{x:"190",y:"406",width:"500",height:"34",rx:"6",fill:"#252b3b",stroke:"#c3e04d",strokeWidth:"1",strokeOpacity:"0.5"}),(0,s.jsx)("circle",{cx:"206",cy:"423",r:"3",fill:"#c3e04d",fillOpacity:"0.8"}),(0,s.jsx)("text",{x:"214",y:"427",fill:"#c3e04d",fontSize:"10",fontWeight:"600",children:"StoryChunk Extraction Queue"}),(0,s.jsx)("line",{x1:"350",y1:"440",x2:"300",y2:"462",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.5"}),(0,s.jsx)("polygon",{points:"300,464 296,458 304,458",fill:"#c3e04d",fillOpacity:"0.6"}),(0,s.jsx)("line",{x1:"530",y1:"440",x2:"560",y2:"462",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.5"}),(0,s.jsx)("polygon",{points:"560,464 556,458 564,458",fill:"#c3e04d",fillOpacity:"0.6"}),(0,s.jsx)("rect",{x:"190",y:"464",width:"220",height:"40",rx:"6",fill:"#252b3b",stroke:"#c3e04d",strokeWidth:"1",strokeOpacity:"0.5"}),(0,s.jsx)("circle",{cx:"206",cy:"484",r:"3",fill:"#c3e04d",fillOpacity:"0.8"}),(0,s.jsx)("text",{x:"214",y:"488",fill:"#c3e04d",fontSize:"10",fontWeight:"600",children:"CSV File Extractor"}),(0,s.jsx)("rect",{x:"430",y:"464",width:"260",height:"40",rx:"6",fill:"#252b3b",stroke:"#c3e04d",strokeWidth:"1",strokeOpacity:"0.5"}),(0,s.jsx)("circle",{cx:"446",cy:"484",r:"3",fill:"#c3e04d",fillOpacity:"0.8"}),(0,s.jsx)("text",{x:"454",y:"488",fill:"#c3e04d",fontSize:"10",fontWeight:"600",children:"RDMA Extractor"}),(0,s.jsx)("line",{x1:"300",y1:"504",x2:"300",y2:"524",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.5"}),(0,s.jsx)("polygon",{points:"300,526 296,520 304,520",fill:"#c3e04d",fillOpacity:"0.6"}),(0,s.jsx)("line",{x1:"560",y1:"504",x2:"560",y2:"524",stroke:"#c3e04d",strokeWidth:"0.75",strokeOpacity:"0.5"}),(0,s.jsx)("polygon",{points:"560,526 556,520 564,520",fill:"#c3e04d",fillOpacity:"0.6"}),(0,s.jsx)("text",{x:"360",y:"545",textAnchor:"middle",fill:"#9ca3b0",fontSize:"7",fontStyle:"italic",children:"Partial StoryChunks are drained to the ChronoGrapher or extracted to the local files"})]})]}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{children:"Component"}),(0,s.jsx)(t.th,{children:"Description"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Keeper Data Store"})}),(0,s.jsx)(t.td,{children:"The main ChronoKeeper module. A collection of Story pipelines for all actively recorded Stories in the Recording Group. Instantiates a Story pipeline when ChronoKeeper receives a StartStoryRecording notification and dismantles it after StopStoryRecording. Sequencing threads are responsible for ordering ingested log events and grouping them into time-range bound StoryChunks. (See ChronoLog Story Pipeline Data Model for reference.)"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Keeper Recording Service"})}),(0,s.jsxs)(t.td,{children:["Listens to incoming streams of log events from client applications (",(0,s.jsx)(t.code,{children:"record_event"}),") and serves on-demand tail reads directly from keeper memory via ",(0,s.jsx)(t.code,{children:"tail_get_sequences"})," and ",(0,s.jsx)(t.code,{children:"tail_get_events"})," RPCs."]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsxs)(t.strong,{children:["Keeper Tail Store (",(0,s.jsx)(t.code,{children:"KeeperTailStore"}),")"]})}),(0,s.jsxs)(t.td,{children:["Maintains an in-memory index of recent sealed-but-not-yet-extracted ",(0,s.jsx)(t.code,{children:"StoryChunk"})," pointers per story. Serves low-latency ",(0,s.jsx)(t.code,{children:"playback(N)"})," queries directly from memory with zero payload copy. Manages chunk retention, capacity bounds (",(0,s.jsx)(t.code,{children:"tail_capacity"}),"), time-based age-out (",(0,s.jsx)(t.code,{children:"tail_retention_secs"}),"), and pin protection (",(0,s.jsx)(t.code,{children:"kPinTicks"}),"). Optionally unions with active unsealed chunks when ",(0,s.jsx)(t.code,{children:"live_tail_read"})," is enabled."]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"Ingestion Queue"})}),(0,s.jsx)(t.td,{children:"A collection of IngestionHandles for actively recorded stories the ChronoKeeper is expecting events for. Receives log events from the Keeper Recording Service and attributes them to the appropriate Story Ingestion Handles. Also recovers late orphaned events for retired stories before archival."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"StoryChunk Extraction Queue"})}),(0,s.jsx)(t.td,{children:"A mutex-protected deque of StoryChunk pointers, serving as the communication boundary between the Keeper Data Store / Tail Store and the ExtractionModule."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"ExtractionModule"})}),(0,s.jsxs)(t.td,{children:["A configurable pipeline of extractors that consumes retired StoryChunks from the extraction queue and forwards each chunk through every extractor in the chain. The module owns a fixed-size pool of extraction-stream threads (",(0,s.jsx)(t.code,{children:"extraction_stream_count"}),") that drain the queue in parallel. Available extractor types: ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"csv_extractor"})}
1)," writes chunks to a local POSIX directory; ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"single_endpoint_rdma_extractor"})})," drains chunks to a single RDMA endpoint (typically a ChronoGrapher); ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"dual_endpoint_rdma_extractor"})})," fans chunks out to two RDMA endpoints simultaneously (typically a ChronoGrapher and a ChronoPlayer). The chain is assembled from JSON at startup \u2014 see ",(0,s.jsx)(t.a,{href:"/docs/3.1.1/user-guide/configuration/server-configuration#extractionmodule",children:"Server Configuration \u2192 ExtractionModule"}),"."]})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"KeeperRegistryClient"})}),(0,s.jsx)(t.td,{children:"The client side of RPC communication between the ChronoKeeper process and ChronoVisor's Recording Process Registry Service. Sends register/unregister and heartbeat/statistics messages to ChronoVisor."})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{children:(0,s.jsx)(t.strong,{children:"DataStoreAdminService"})}),(0,s.jsx)(t.td,{children:"Listens to Start/Stop Story recording notifications from ChronoVisor. These notifications trigger instantiation or dismantling of the appropriate StoryPipelines based on client data access requests."})]})]})]}),"\n",(0,s.jsx)(t.hr,{}),"\n",(0,s.jsx)(t.h2,{id:"on-demand-tail-reading",children:"On-Demand Tail Reading"}),"\n",(0,s.jsxs)(t.p,{children:["In ChronoLog 3.1, ChronoKeeper directly serves tail-read queries from client applications (",(0,s.jsx)(t.code,{children:"StoryHandle::playback"}),"):"]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"tail_get_sequences(story_id, n)"})}),": Returns up to $n$ newest ",(0,s.jsx)(t.code,{children:"EventSequence"})," keys for a story held in keeper memory."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.code,{children:"tail_get_events(story_id, seqs)"})}),": Returns the full ",(0,s.jsx)(t.code,{children:"LogEvent"})," payloads for the specific sequences requested by the client after client-side global merging."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["For full architectural details on zero-copy indexing, pinning, capacity bounds, and live unsealed reads, see ",(0,s.jsx)(t.a,{href:"/docs/3.1.1/user-guide/architecture/on-demand-tail-read",children:"On-Demand Tail Read Architecture"}),"."]})]})}function x(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453(e,t,i){i.d(t,{R:()=>h,x:()=>l});var r=i(96540);const s={},o=r.createContext(s);function h(e){const t=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:h(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]);
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.