blob: 2eec9ef19a9bf139b35b7bb35100b35daf9588c4 [file]
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/favicon.ico"/><link rel="preload" as="font" href="/fonts/inter-latin-wght-normal.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="prefetch" as="font" href="/fonts/inter-latin-wght-italic.woff2" type="font/woff2" crossorigin="anonymous"/><link rel="modulepreload" href="/assets/manifest-baf72bfa.js"/><link rel="modulepreload" href="/assets/entry.client-Bi9_frb9.js"/><link rel="modulepreload" href="/assets/chunk-QUQL4437-Bywy9pC_.js"/><link rel="modulepreload" href="/assets/index-CEjmR4aq.js"/><link rel="modulepreload" href="/assets/root-COkOICkm.js"/><link rel="modulepreload" href="/assets/theme-provider-CTLTtVKS.js"/><link rel="modulepreload" href="/assets/button-CZBw5Jwh.js"/><link rel="modulepreload" href="/assets/index-jbG8BFt3.js"/><link rel="modulepreload" href="/assets/utils-Cu_tFavh.js"/><link rel="modulepreload" href="/assets/docs-layout-5T1N7EZh.js"/><link rel="modulepreload" href="/assets/docs-layout-S669zXZ_.js"/><link rel="modulepreload" href="/assets/index-DWtaWGM5.js"/><link rel="modulepreload" href="/assets/index-DmTM9tZB.js"/><link rel="modulepreload" href="/assets/Combination-DE73542n.js"/><link rel="modulepreload" href="/assets/docs-DMCF1KDd.js"/><link rel="modulepreload" href="/assets/mdx-oaHE65CA.js"/><link rel="modulepreload" href="/assets/collapsible-DaM-YS37.js"/><link rel="modulepreload" href="/assets/external-link-5ojQeAUO.js"/><link rel="modulepreload" href="/assets/createLucideIcon-DJDbJL17.js"/><link rel="modulepreload" href="/assets/link-CC6yoZ4C.js"/><title>Developer Guidelines</title><meta name="description" content="Code standards, interface classifications, formatting conventions, Git best practices, and patch submission guidelines for HBase contributors."/><link rel="stylesheet" href="/assets/root-BtA_CDVx.css"/><link rel="stylesheet" href="/assets/app-DeiyQBOk.css"/><script>
(function() {
const theme = localStorage.getItem('theme');
const root = document.documentElement;
root.classList.remove('light', 'dark');
if (theme && ['light', 'dark'].includes(theme)) {
root.classList.add(theme);
} else {
const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
root.classList.add(systemTheme);
localStorage.setItem('theme', systemTheme);
}
})();
</script><noscript><style>.theme-toggle-wrapper { display: none !important; }</style></noscript></head><body class="font-base"><script>((e,i,s,u,m,a,l,h)=>{let d=document.documentElement,w=["light","dark"];function p(n){(Array.isArray(e)?e:[e]).forEach(y=>{let k=y==="class",S=k&&a?m.map(f=>a[f]||f):m;k?(d.classList.remove(...S),d.classList.add(a&&a[n]?a[n]:n)):d.setAttribute(y,n)}),R(n)}function R(n){h&&w.includes(n)&&(d.style.colorScheme=n)}function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}if(u)p(u);else try{let n=localStorage.getItem(i)||s,y=l&&n==="system"?c():n;p(y)}catch(n){}})("class","theme","system",null,["light","dark"],null,true,true)</script><div id="nd-docs-layout" class="grid min-h-(--fd-docs-height) auto-cols-auto auto-rows-auto overflow-x-clip transition-[grid-template-columns] [--fd-docs-height:100dvh] [--fd-header-height:0px] [--fd-sidebar-width:0px] [--fd-toc-popover-height:0px] [--fd-toc-width:285px] max-xl:[--fd-toc-popover-height:--spacing(10)] max-md:[--fd-header-height:--spacing(14)] md:[--fd-sidebar-width:285px]" data-sidebar-collapsed="false" style="grid-template:&quot;sidebar header toc&quot;
&quot;sidebar toc-popover toc&quot;
&quot;sidebar main toc&quot; 1fr / minmax(var(--fd-sidebar-col), 1fr) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) minmax(min-content, 1fr);--fd-docs-row-1:var(--fd-banner-height, 0px);--fd-docs-row-2:calc(var(--fd-docs-row-1) + var(--fd-header-height));--fd-docs-row-3:calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height));--fd-sidebar-col:var(--fd-sidebar-width)"><header data-transparent="false" id="nd-subnav" class="data-[transparent=false]:bg-fd-background/80 sticky top-(--fd-docs-row-1) z-30 flex h-(--fd-header-height) items-center border-b ps-4 pe-2.5 backdrop-blur-sm transition-colors [grid-area:header] md:hidden"><a class="inline-flex items-center gap-2.5 font-semibold" href="/" data-discover="true"><div class="flex items-center gap-2"><img src="/favicon.ico" alt="HBase favicon" width="16" height="16"/><p>Apache HBase</p></div></a><div class="flex-1"></div><button type="button" class="inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 shrink-0 [&amp;_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 hover:bg-accent hover:text-accent-foreground size-8 p-2" data-search="" aria-label="Open Search"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg></button><button aria-label="Open Sidebar" class="inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 shrink-0 [&amp;_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 hover:bg-accent hover:text-accent-foreground size-8 p-2"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panel-left"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M9 3v18"></path></svg></button></header><div data-sidebar-placeholder="" class="pointer-events-none sticky top-(--fd-docs-row-1) z-20 h-[calc(var(--fd-docs-height)-var(--fd-docs-row-1))] [grid-area:sidebar] *:pointer-events-auto max-md:hidden"><aside id="nd-sidebar" data-collapsed="false" data-hovered="false" class="bg-fd-card absolute inset-y-0 start-0 flex flex-col items-end border-e text-sm duration-250 *:w-(--fd-sidebar-width)"><div class="flex flex-col gap-3 p-4 pb-2"><div class="flex"><a class="inline-flex text-[0.9375rem] items-center gap-2.5 font-medium me-auto" href="/" data-discover="true"><div class="flex items-center gap-2"><img src="/favicon.ico" alt="HBase favicon" width="16" height="16"/><p>Apache HBase</p></div></a><button type="button" aria-label="Collapse Sidebar" data-collapsed="false" class="inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 shrink-0 [&amp;_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 hover:bg-accent hover:text-accent-foreground size-8 text-fd-muted-foreground mb-auto"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panel-left"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M9 3v18"></path></svg></button></div><button type="button" data-search-full="" class="bg-fd-secondary/50 text-fd-muted-foreground hover:bg-fd-accent hover:text-fd-accent-foreground inline-flex items-center gap-2 rounded-lg border p-1.5 ps-2 text-sm transition-colors"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search size-4"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg>Search<div class="ms-auto inline-flex gap-0.5"><kbd class="bg-fd-background rounded-md border px-1.5">⌘</kbd><kbd class="bg-fd-background rounded-md border px-1.5">K</kbd></div></button><button type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="radix-_R_r5aj5_" data-state="closed" class="bg-fd-secondary/50 text-fd-secondary-foreground hover:bg-fd-accent data-[state=open]:bg-fd-accent data-[state=open]:text-fd-accent-foreground flex items-center gap-2 rounded-lg border p-2 text-start transition-colors"><div class="size-9 shrink-0 empty:hidden md:size-5"></div><div><p class="text-sm font-medium">Multi-Page Documentation</p><p class="text-fd-muted-foreground text-sm empty:hidden md:hidden">Split across multiple pages</p></div><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevrons-up-down text-fd-muted-foreground ms-auto size-4 shrink-0"><path d="m7 15 5 5 5-5"></path><path d="m7 9 5-5 5 5"></path></svg></button></div><div dir="ltr" data-slot="scroll-area" class="relative min-h-0 flex-1" style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" data-slot="scroll-area-viewport" class="focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1" style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="overscroll-contain p-4" style="overflow-x:unset;overflow-y:unset;mask-image:linear-gradient(to bottom, transparent, white 12px, white calc(100% - 12px), transparent)"><div style="min-width:100%;display:table"><p class="mt-6 mb-1.5 inline-flex items-center gap-2 px-2 empty:mb-0 first:mt-0 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0" style="padding-inline-start:calc(2 * var(--spacing))">Getting Started</p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs" data-discover="true">Preface</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/getting-started" data-discover="true">Getting Started</a><a href="/llms-full.txt" rel="noreferrer noopener" target="_blank" data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg>All docs for LLMs</a><p class="mt-6 mb-1.5 inline-flex items-center gap-2 px-2 empty:mb-0 first:mt-0 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0" style="padding-inline-start:calc(2 * var(--spacing))">Configuration &amp; Setup</p><div data-state="closed" data-slot="collapsible" class="group"><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors w-full" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/configuration" data-discover="true">Configuration<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down ms-auto transition-transform -rotate-90" data-icon="true"><path d="m6 9 6 6 6-6"></path></svg></a><div data-state="closed" id="radix-_R_dad5aj5_" hidden="" data-slot="collapsible-content" class="relative before:bg-fd-border before:absolute before:inset-y-1 before:start-2.5 before:w-px before:content-[&#x27;&#x27;]"></div></div><div data-state="closed" data-slot="collapsible" class="group"><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors w-full" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/upgrading" data-discover="true">Upgrading<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down ms-auto transition-transform -rotate-90" data-icon="true"><path d="m6 9 6 6 6-6"></path></svg></a><div data-state="closed" id="radix-_R_fad5aj5_" hidden="" data-slot="collapsible-content" class="relative before:bg-fd-border before:absolute before:inset-y-1 before:start-2.5 before:w-px before:content-[&#x27;&#x27;]"></div></div><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/shell" data-discover="true">The Apache HBase Shell</a><p class="mt-6 mb-1.5 inline-flex items-center gap-2 px-2 empty:mb-0 first:mt-0 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0" style="padding-inline-start:calc(2 * var(--spacing))">Core Concepts</p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/datamodel" data-discover="true">Data Model</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/schema-design" data-discover="true">HBase and Schema Design</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/regionserver-sizing" data-discover="true">RegionServer Sizing Rules of Thumb</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/mapreduce" data-discover="true">HBase and MapReduce</a><div data-state="closed" data-slot="collapsible" class="group"><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors w-full" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/security" data-discover="true">Security<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down ms-auto transition-transform -rotate-90" data-icon="true"><path d="m6 9 6 6 6-6"></path></svg></a><div data-state="closed" id="radix-_R_tad5aj5_" hidden="" data-slot="collapsible-content" class="relative before:bg-fd-border before:absolute before:inset-y-1 before:start-2.5 before:w-px before:content-[&#x27;&#x27;]"></div></div><div data-state="closed" data-slot="collapsible" class="group"><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors w-full" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/architecture" data-discover="true">Architecture<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down ms-auto transition-transform -rotate-90" data-icon="true"><path d="m6 9 6 6 6-6"></path></svg></a><div data-state="closed" id="radix-_R_vad5aj5_" hidden="" data-slot="collapsible-content" class="relative before:bg-fd-border before:absolute before:inset-y-1 before:start-2.5 before:w-px before:content-[&#x27;&#x27;]"></div></div><p class="mt-6 mb-1.5 inline-flex items-center gap-2 px-2 empty:mb-0 first:mt-0 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0" style="padding-inline-start:calc(2 * var(--spacing))">Advanced Features</p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/inmemory-compaction" data-discover="true">In-memory Compaction</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/offheap-read-write" data-discover="true">RegionServer Off-Heap Read/Write Path</a><div data-state="closed" data-slot="collapsible" class="group"><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors w-full" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/backup-restore" data-discover="true">Backup and Restore<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down ms-auto transition-transform -rotate-90" data-icon="true"><path d="m6 9 6 6 6-6"></path></svg></a><div data-state="closed" id="radix-_R_17ad5aj5_" hidden="" data-slot="collapsible-content" class="relative before:bg-fd-border before:absolute before:inset-y-1 before:start-2.5 before:w-px before:content-[&#x27;&#x27;]"></div></div><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/sync-replication" data-discover="true">Synchronous Replication</a><p class="mt-6 mb-1.5 inline-flex items-center gap-2 px-2 empty:mb-0 first:mt-0 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0" style="padding-inline-start:calc(2 * var(--spacing))">APIs &amp; Integration</p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/hbase-apis" data-discover="true">Apache HBase APIs</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/external-apis" data-discover="true">Apache HBase External APIs</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/thrift-filter-language" data-discover="true">Thrift API and Filter Language</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/spark" data-discover="true">HBase and Spark</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/cp" data-discover="true">Apache HBase Coprocessors</a><p class="mt-6 mb-1.5 inline-flex items-center gap-2 px-2 empty:mb-0 first:mt-0 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0" style="padding-inline-start:calc(2 * var(--spacing))">Performance &amp; Troubleshooting</p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/performance" data-discover="true">Apache HBase Performance Tuning</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/profiler" data-discover="true">Profiler Servlet</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/troubleshooting" data-discover="true">Troubleshooting and Debugging Apache HBase</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/case-studies" data-discover="true">Apache HBase Case Studies</a><p class="mt-6 mb-1.5 inline-flex items-center gap-2 px-2 empty:mb-0 first:mt-0 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0" style="padding-inline-start:calc(2 * var(--spacing))">Operations &amp; Development</p><div data-state="closed" data-slot="collapsible" class="group"><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors w-full" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/operational-management" data-discover="true">Apache HBase Operational Management<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down ms-auto transition-transform -rotate-90" data-icon="true"><path d="m6 9 6 6 6-6"></path></svg></a><div data-state="closed" id="radix-_R_23ad5aj5_" hidden="" data-slot="collapsible-content" class="relative before:bg-fd-border before:absolute before:inset-y-1 before:start-2.5 before:w-px before:content-[&#x27;&#x27;]"></div></div><div data-state="open" data-slot="collapsible" class="group"><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors w-full" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/building-and-developing" data-discover="true">Building and Developing Apache HBase<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down ms-auto transition-transform" data-icon="true"><path d="m6 9 6 6 6-6"></path></svg></a><div data-state="open" id="radix-_R_25ad5aj5_" data-slot="collapsible-content" class="relative before:bg-fd-border before:absolute before:inset-y-1 before:start-2.5 before:w-px before:content-[&#x27;&#x27;]"><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors data-[active=true]:before:content-[&#x27;&#x27;] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5" style="padding-inline-start:calc(5 * var(--spacing))" href="/docs/building-and-developing/getting-involved" data-discover="true">Getting Involved</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors data-[active=true]:before:content-[&#x27;&#x27;] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5" style="padding-inline-start:calc(5 * var(--spacing))" href="/docs/building-and-developing/repositories" data-discover="true">Apache HBase Repositories</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors data-[active=true]:before:content-[&#x27;&#x27;] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5" style="padding-inline-start:calc(5 * var(--spacing))" href="/docs/building-and-developing/ides" data-discover="true">IDEs</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors data-[active=true]:before:content-[&#x27;&#x27;] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5" style="padding-inline-start:calc(5 * var(--spacing))" href="/docs/building-and-developing/building" data-discover="true">Building Apache HBase</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors data-[active=true]:before:content-[&#x27;&#x27;] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5" style="padding-inline-start:calc(5 * var(--spacing))" href="/docs/building-and-developing/releasing" data-discover="true">Releasing Apache HBase</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors data-[active=true]:before:content-[&#x27;&#x27;] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5" style="padding-inline-start:calc(5 * var(--spacing))" href="/docs/building-and-developing/voting" data-discover="true">Voting on Release Candidates</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors data-[active=true]:before:content-[&#x27;&#x27;] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5" style="padding-inline-start:calc(5 * var(--spacing))" href="/docs/building-and-developing/announcing" data-discover="true">Announcing Releases</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors data-[active=true]:before:content-[&#x27;&#x27;] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5" style="padding-inline-start:calc(5 * var(--spacing))" href="/docs/building-and-developing/generating-documentation" data-discover="true">Generating the HBase Reference Guide</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors data-[active=true]:before:content-[&#x27;&#x27;] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5" style="padding-inline-start:calc(5 * var(--spacing))" href="/docs/building-and-developing/updating-landing" data-discover="true">Updating hbase.apache.org</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors data-[active=true]:before:content-[&#x27;&#x27;] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5" style="padding-inline-start:calc(5 * var(--spacing))" href="/docs/building-and-developing/tests" data-discover="true">Tests</a><a data-active="true" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors data-[active=true]:before:content-[&#x27;&#x27;] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5" style="padding-inline-start:calc(5 * var(--spacing))" href="/docs/building-and-developing/developer-guidelines" data-discover="true">Developer Guidelines</a></div></div><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/unit-testing" data-discover="true">Unit Testing HBase Applications</a><p class="mt-6 mb-1.5 inline-flex items-center gap-2 px-2 empty:mb-0 first:mt-0 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0" style="padding-inline-start:calc(2 * var(--spacing))">Internals</p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/protobuf" data-discover="true">Protobuf in HBase</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/pv2" data-discover="true">Procedure Framework (PV2)</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/amv2" data-discover="true">AMv2 Description for Devs</a><p class="mt-6 mb-1.5 inline-flex items-center gap-2 px-2 empty:mb-0 first:mt-0 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0" style="padding-inline-start:calc(2 * var(--spacing))">Infrastructure &amp; Tools</p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/zookeeper" data-discover="true">ZooKeeper</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/community" data-discover="true">Community</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/hbtop" data-discover="true">hbtop</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/tracing" data-discover="true">Tracing</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/store-file-tracking" data-discover="true">Store File Tracking</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/bulk-data-generator-tool" data-discover="true">Bulk Data Generator Tool</a><p class="mt-6 mb-1.5 inline-flex items-center gap-2 px-2 empty:mb-0 first:mt-0 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0" style="padding-inline-start:calc(2 * var(--spacing))">Appendices</p><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/contributing-to-documentation" data-discover="true">Appendix: Contributing to Documentation</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/faq" data-discover="true">FAQ</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/acl-matrix" data-discover="true">Access Control Matrix</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/compression" data-discover="true">Compression and Data Block Encoding In HBase</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/sql" data-discover="true">SQL over HBase</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/ycsb" data-discover="true">YCSB</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/hfile-format" data-discover="true">HFile Format</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/other-info" data-discover="true">Other Information About HBase</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/hbase-history" data-discover="true">HBase History</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/asf" data-discover="true">HBase and the Apache Software Foundation</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/orca" data-discover="true">Apache HBase Orca</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/rpc" data-discover="true">0.95 RPC Specification</a><a data-active="false" class="relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors" style="padding-inline-start:calc(2 * var(--spacing))" href="/docs/hbase-incompatibilities" data-discover="true">Known Incompatibilities Among HBase Versions</a></div></div></div></div></div><div class="flex flex-col border-t p-4 pt-2 empty:hidden"><div class="text-fd-muted-foreground flex items-center empty:hidden"><a href="https://github.com/apache/hbase/" rel="noreferrer noopener" target="_blank" class="inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 shrink-0 [&amp;_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 hover:bg-accent hover:text-accent-foreground size-8" aria-label="GitHub" data-active="false"><svg role="img" viewBox="0 0 24 24" fill="currentColor"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></a><button class="inline-flex items-center rounded-full border ms-auto p-0" aria-label="Toggle Theme" data-theme-toggle=""><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun size-6.5 rounded-full p-1.5 text-fd-muted-foreground"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-moon size-6.5 rounded-full p-1.5 text-fd-muted-foreground"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"></path></svg></button></div></div></aside></div><div data-sidebar-panel="" class="bg-fd-muted text-fd-muted-foreground fixed start-4 top-[calc(--spacing(4)+var(--fd-docs-row-3))] z-10 flex rounded-xl border p-0.5 shadow-lg transition-opacity pointer-events-none opacity-0"><button type="button" aria-label="Collapse Sidebar" data-collapsed="false" class="inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 shrink-0 [&amp;_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 hover:bg-accent hover:text-accent-foreground size-8 rounded-lg"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panel-left"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M9 3v18"></path></svg></button><button type="button" class="inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg:not([class*=&#x27;size-&#x27;])]:size-4 shrink-0 [&amp;_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 hover:bg-accent hover:text-accent-foreground size-8 rounded-lg" data-search="" aria-label="Open Search"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.3-4.3"></path></svg></button></div><div data-state="closed" data-slot="collapsible" class="group sticky top-(--fd-docs-row-2) z-10 h-(--fd-toc-popover-height) [grid-area:toc-popover] xl:hidden" data-toc-popover=""><header class="border-b backdrop-blur-sm transition-colors bg-fd-background/80"><button type="button" aria-controls="radix-_R_1ij5_" aria-expanded="false" data-state="closed" class="cursor-pointer text-fd-muted-foreground flex h-10 w-full items-center gap-2.5 px-4 py-2.5 text-start text-sm focus-visible:outline-none md:px-6 [&amp;_svg]:size-4" data-slot="collapsible-trigger" data-toc-popover-trigger=""><svg role="progressbar" viewBox="0 0 24 24" aria-valuenow="0" aria-valuemin="0" aria-valuemax="1" class="shrink-0"><circle cx="12" cy="12" r="11" fill="none" stroke-width="2" class="stroke-current/25"></circle><circle cx="12" cy="12" r="11" fill="none" stroke-width="2" stroke="currentColor" stroke-dasharray="69.11503837897544" stroke-dashoffset="69.11503837897544" stroke-linecap="round" transform="rotate(-90 12 12)" class="transition-all"></circle></svg><span class="grid flex-1 *:col-start-1 *:row-start-1 *:my-auto"><span class="truncate transition-[opacity,translate,color]">Developer Guidelines</span><span class="truncate transition-[opacity,translate] pointer-events-none translate-y-full opacity-0"></span></span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down mx-0.5 shrink-0 transition-transform"><path d="m6 9 6 6 6-6"></path></svg></button><div data-state="closed" id="radix-_R_1ij5_" hidden="" data-slot="collapsible-content" data-toc-popover-content="" class="flex max-h-[50vh] flex-col px-4 md:px-6"></div></header></div><article id="nd-page" data-full="false" class="mx-auto flex w-full max-w-[900px] flex-col gap-4 px-4 py-6 [grid-area:main] md:px-6 md:pt-8 xl:px-8 xl:pt-14 xl:[--fd-toc-width:285px]"><div class="text-fd-muted-foreground flex items-center gap-1.5 text-sm"><a class="truncate text-fd-primary font-medium transition-opacity hover:opacity-80" href="/docs/building-and-developing" data-discover="true">Building and Developing Apache HBase</a></div><div class="no-print"><h1 class="text-[1.75em] font-semibold">Developer Guidelines</h1><p class="text-fd-muted-foreground mb-8 text-lg">Code standards, interface classifications, formatting conventions, Git best practices, and patch submission guidelines for HBase contributors.</p></div><div class="prose flex-1"><h2 class="flex scroll-m-28 flex-row items-center gap-2" id="branches"><a data-card="" href="#branches" class="peer">Branches</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h2>
<p class="wrap-anywhere">We use Git for source code management and latest development happens on <code>master</code> branch. There are
branches for past major/minor/maintenance releases and important features and bug fixes are often
back-ported to them.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="policy-for-fix-version-in-jira"><a data-card="" href="#policy-for-fix-version-in-jira" class="peer">Policy for Fix Version in JIRA</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h2>
<p class="wrap-anywhere">To determine if a given fix is in a given release purely from the release numbers following rules
are defined:</p>
<p class="wrap-anywhere">Fix version of X.Y.Z =&gt; fixed in all releases X.Y.Z&#x27; (where Z&#x27; = Z).<br/>
<!-- -->Fix version of X.Y.0 =&gt; fixed in all releases X.Y&#x27;.* (where Y&#x27; = Y).<br/>
<!-- -->Fix version of X.0.0 =&gt; fixed in all releases X&#x27;.*.* (where X&#x27; = X).</p>
<p class="wrap-anywhere">By this policy, fix version of 1.3.0 implies 1.4.0, but 1.3.2 does not imply 1.4.0 as we could not
tell purely from the numbers which release came first.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="code-standards"><a data-card="" href="#code-standards" class="peer">Code Standards</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h2>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="interface-classifications"><a data-card="" href="#interface-classifications" class="peer">Interface Classifications</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">Interfaces are classified both by audience and by stability level.
These labels appear at the head of a class.
The conventions followed by HBase are inherited by its parent project, Hadoop.</p>
<p class="wrap-anywhere">The following interface classifications are commonly used:</p>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="interfaceaudience"><a data-card="" href="#interfaceaudience" class="peer">InterfaceAudience</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere"><code>@InterfaceAudience.Public</code><br/>
<!-- -->APIs for users and HBase applications.
These APIs will be deprecated through major versions of HBase.</p>
<p class="wrap-anywhere"><code>@InterfaceAudience.Private</code><br/>
<!-- -->APIs for HBase internals developers.
No guarantees on compatibility or availability in future versions.
Private interfaces do not need an <code>@InterfaceStability</code> classification.</p>
<p class="wrap-anywhere"><code>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.COPROC)</code><br/>
<!-- -->APIs for HBase coprocessor writers.</p>
<p class="wrap-anywhere"><strong>No <code>@InterfaceAudience</code> Classification</strong>:<br/>
<!-- -->Packages without an <code>@InterfaceAudience</code> label are considered private.
Mark your new packages if publicly accessible.</p>
<div class="flex gap-2 my-4 rounded-xl border bg-fd-card p-3 ps-1 text-sm text-fd-card-foreground shadow-md" style="--callout-color:var(--color-fd-info, var(--color-fd-muted))"><div role="none" class="w-0.5 bg-(--callout-color)/50 rounded-sm"></div><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-5 -me-0.5 fill-(--callout-color) text-fd-card"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg><div class="flex flex-col gap-2 min-w-0 flex-1"><p class="font-medium my-0!">Excluding Non-Public Interfaces from API Documentation</p><div class="text-fd-muted-foreground prose-no-margin empty:hidden"><p class="wrap-anywhere">Only interfaces classified <code>@InterfaceAudience.Public</code> should be included in API documentation
(Javadoc). Committers must add new package excludes <code>ExcludePackageNames</code> section of the <em>pom.xml</em>
for new packages which do not contain public classes.</p></div></div></div>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="interfacestability"><a data-card="" href="#interfacestability" class="peer">@InterfaceStability</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere"><code>@InterfaceStability</code> is important for packages marked <code>@InterfaceAudience.Public</code>.</p>
<p class="wrap-anywhere"><code>@InterfaceStability.Stable</code><br/>
<!-- -->Public packages marked as stable cannot be changed without a deprecation path or a very good reason.</p>
<p class="wrap-anywhere"><code>@InterfaceStability.Unstable</code><br/>
<!-- -->Public packages marked as unstable can be changed without a deprecation path.</p>
<p class="wrap-anywhere"><code>@InterfaceStability.Evolving</code><br/>
<!-- -->Public packages marked as evolving may be changed, but it is discouraged.</p>
<p class="wrap-anywhere"><strong>No <code>@InterfaceStability</code> Label</strong>:
Public classes with no <code>@InterfaceStability</code> label are discouraged, and should be considered implicitly unstable.</p>
<p class="wrap-anywhere">If you are unclear about how to mark packages, ask on the development list.</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="code-formatting-conventions"><a data-card="" href="#code-formatting-conventions" class="peer">Code Formatting Conventions</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">Please adhere to the following guidelines so that your patches can be reviewed more quickly.
These guidelines have been developed based upon common feedback on patches from new contributors.</p>
<p class="wrap-anywhere">See the <a href="http://www.oracle.com/technetwork/java/index-135089.html">Code Conventions for the Java Programming Language</a> for more information on coding conventions in Java.
See <a href="/docs/building-and-developing#code-formatting" data-discover="true">Eclipse Code Formatting</a> to setup Eclipse to check for some of
these guidelines automatically.</p>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="space-invaders"><a data-card="" href="#space-invaders" class="peer">Space Invaders</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">Do not use extra spaces around brackets.
Use the second style, rather than the first.</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ( foo.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">equals</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">( bar ) ) { </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// don&#x27;t do this</span></span></code></pre></div></figure>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (foo.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">equals</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(bar)) {</span></span></code></pre></div></figure>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">foo </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> barArray[ i ]; </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// don&#x27;t do this</span></span></code></pre></div></figure>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">foo </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> barArray[i];</span></span></code></pre></div></figure>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="auto-generated-code"><a data-card="" href="#auto-generated-code" class="peer">Auto Generated Code</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">Auto-generated code in Eclipse often uses bad variable names such as <code>arg0</code>.
Use more informative variable names.
Use code like the second example here.</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> readFields</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(DataInput arg0) throws IOException { </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// don&#x27;t do this</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> foo </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> arg0.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">readUTF</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(); </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// don&#x27;t do this</span></span></code></pre></div></figure>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> readFields</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(DataInput di) throws IOException {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> foo </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> di.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">readUTF</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">();</span></span></code></pre></div></figure>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="long-lines"><a data-card="" href="#long-lines" class="peer">Long Lines</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">Keep lines less than 100 characters.
You can configure your IDE to do this automatically.</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Bar bar </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> foo.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">veryLongMethodWithManyArguments</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(argument1, argument2, argument3, argument4, argument5, argument6, argument7, argument8, argument9); </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// don&#x27;t do this</span></span></code></pre></div></figure>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Bar bar </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> foo.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">veryLongMethodWithManyArguments</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> argument1, argument2, argument3,argument4, argument5, argument6, argument7, argument8, argument9);</span></span></code></pre></div></figure>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="trailing-spaces"><a data-card="" href="#trailing-spaces" class="peer">Trailing Spaces</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">Be sure there is a line break after the end of your code, and avoid lines with nothing but whitespace.
This makes diffs more meaningful.
You can configure your IDE to help with this.</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Bar bar </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> foo.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">getBar</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(); </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&lt;---</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> imagine there is an extra </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">space</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(s) after the semicolon.</span></span></code></pre></div></figure>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="api-documentation-javadoc"><a data-card="" href="#api-documentation-javadoc" class="peer">API Documentation (Javadoc)</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">Don&#x27;t forget Javadoc!</p>
<p class="wrap-anywhere">Javadoc warnings are checked during precommit.
If the precommit tool gives you a &#x27;-1&#x27;, please fix the javadoc issue.
Your patch won&#x27;t be committed if it adds such warnings.</p>
<p class="wrap-anywhere">Also, no <code>@author</code> tags - that&#x27;s a rule.</p>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="findbugs"><a data-card="" href="#findbugs" class="peer">Findbugs</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere"><code>Findbugs</code> is used to detect common bugs pattern.
It is checked during the precommit build.
If errors are found, please fix them.
You can run findbugs locally with <code>mvn findbugs:findbugs</code>, which will generate the <code>findbugs</code> files locally.
Sometimes, you may have to write code smarter than <code>findbugs</code>.
You can annotate your code to tell <code>findbugs</code> you know what you&#x27;re doing, by annotating your class with the following annotation:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">edu.umd.cs.findbugs.annotations.SuppressWarnings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&quot;HE_EQUALS_USE_HASHCODE&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">justification</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&quot;I know what I&#x27;m doing&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre></div></figure>
<p class="wrap-anywhere">It is important to use the Apache-licensed version of the annotations. That generally means using
annotations in the <code>edu.umd.cs.findbugs.annotations</code> package so that we can rely on the cleanroom
reimplementation rather than annotations in the <code>javax.annotations</code> package.</p>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="javadoc---useless-defaults"><a data-card="" href="#javadoc---useless-defaults" class="peer">Javadoc - Useless Defaults</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">Don&#x27;t just leave javadoc tags the way IDE generates them, or fill redundant information in them.</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@param</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> table</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> &lt;---- don&#x27;t leave them empty!</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@param</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> region</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> An HRegion object. &lt;---- don&#x27;t fill redundant information!</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@return</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> Foo Object foo just created. &lt;---- Not useful information</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@throws</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> SomeException</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> &lt;---- Not useful. Function declarations already tell that!</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@throws</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> BarException</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> when something went wrong &lt;---- really?</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> public</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Foo </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">createFoo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(Bar bar);</span></span></code></pre></div></figure>
<p class="wrap-anywhere">Either add something descriptive to the tags, or just remove them.
The preference is to add something descriptive and useful.</p>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="one-thing-at-a-time-folks"><a data-card="" href="#one-thing-at-a-time-folks" class="peer">One Thing At A Time, Folks</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">If you submit a patch for one thing, don&#x27;t do auto-reformatting or unrelated reformatting of code on a completely different area of code.</p>
<p class="wrap-anywhere">Likewise, don&#x27;t add unrelated cleanup or refactorings outside the scope of your Jira.</p>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="ambiguous-unit-tests"><a data-card="" href="#ambiguous-unit-tests" class="peer">Ambiguous Unit Tests</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">Make sure that you&#x27;re clear about what you are testing in your unit tests and why.</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="garbage-collection-conserving-guidelines"><a data-card="" href="#garbage-collection-conserving-guidelines" class="peer">Garbage-Collection Conserving Guidelines</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">The following guidelines were borrowed from <a href="http://engineering.linkedin.com/performance/linkedin-feed-faster-less-jvm-garbage">http://engineering.linkedin.com/performance/linkedin-feed-faster-less-jvm-garbage</a>.
Keep them in mind to keep preventable garbage collection to a minimum. Have a look
at the blog post for some great examples of how to refactor your code according to
these guidelines.</p>
<ul>
<li>Be careful with Iterators</li>
<li>Estimate the size of a collection when initializing</li>
<li>Defer expression evaluation</li>
<li>Compile the regex patterns in advance</li>
<li>Cache it if you can</li>
<li>String Interns are useful but dangerous</li>
</ul>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="invariants"><a data-card="" href="#invariants" class="peer">Invariants</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h2>
<p class="wrap-anywhere">We don&#x27;t have many but what we have we list below.
All are subject to challenge of course but until then, please hold to the rules of the road.</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="no-permanent-state-in-zookeeper"><a data-card="" href="#no-permanent-state-in-zookeeper" class="peer">No permanent state in ZooKeeper</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">ZooKeeper state should transient (treat it like memory). If ZooKeeper state is deleted, hbase should be able to recover and essentially be in the same state.</p>
<ul>
<li>.Exceptions: There are currently a few exceptions that we need to fix around whether a table is enabled or disabled.</li>
<li>Replication data is currently stored only in ZooKeeper.
Deleting ZooKeeper data related to replication may cause replication to be disabled.
Do not delete the replication tree, <em>/hbase/replication/</em>.</li>
</ul>
<div class="flex gap-2 my-4 rounded-xl border bg-fd-card p-3 ps-1 text-sm text-fd-card-foreground shadow-md" style="--callout-color:var(--color-fd-warning, var(--color-fd-muted))"><div role="none" class="w-0.5 bg-(--callout-color)/50 rounded-sm"></div><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-5 -me-0.5 fill-(--callout-color) text-fd-card"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg><div class="flex flex-col gap-2 min-w-0 flex-1"><div class="text-fd-muted-foreground prose-no-margin empty:hidden"><p class="wrap-anywhere">Replication may be disrupted and data loss may occur if you delete the replication tree
(<em>/hbase/replication/</em>) from ZooKeeper. Follow progress on this issue at
<a href="https://issues.apache.org/jira/browse/HBASE-10295">HBASE-10295</a>.</p></div></div></div>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="running-in-situ"><a data-card="" href="#running-in-situ" class="peer">Running In-Situ</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h2>
<p class="wrap-anywhere">If you are developing Apache HBase, frequently it is useful to test your changes against a more-real cluster than what you find in unit tests.
In this case, HBase can be run directly from the source in local-mode.
All you need to do is run:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">${HBASE_HOME}/bin/start-hbase.sh</span></span></code></pre></div></figure>
<p class="wrap-anywhere">This will spin up a full local-cluster, just as if you had packaged up HBase and installed it on your machine.</p>
<p class="wrap-anywhere">Keep in mind that you will need to have installed HBase into your local maven repository for the in-situ cluster to work properly.
That is, you will need to run:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mvn</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> clean</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -DskipTests</span></span></code></pre></div></figure>
<p class="wrap-anywhere">to ensure that maven can find the correct classpath and dependencies.
Generally, the above command is just a good thing to try running first, if maven is acting oddly.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="adding-metrics"><a data-card="" href="#adding-metrics" class="peer">Adding Metrics</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h2>
<p class="wrap-anywhere">After adding a new feature a developer might want to add metrics.
HBase exposes metrics using the Hadoop Metrics 2 system, so adding a new metric involves exposing that metric to the hadoop system.
Unfortunately the API of metrics2 changed from hadoop 1 to hadoop 2.
In order to get around this a set of interfaces and implementations have to be loaded at runtime.
To get an in-depth look at the reasoning and structure of these classes you can read the blog post located <a href="https://blogs.apache.org/hbase/entry/migration_to_the_new_metrics">here</a>.
To add a metric to an existing MBean follow the short guide below:</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="add-metric-name-and-function-to-hadoop-compat-interface"><a data-card="" href="#add-metric-name-and-function-to-hadoop-compat-interface" class="peer">Add Metric name and Function to Hadoop Compat Interface.</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">Inside of the source interface the corresponds to where the metrics are generated (eg MetricsMasterSource for things coming from HMaster) create new static strings for metric name and description.
Then add a new method that will be called to add new reading.</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules"><a data-card="" href="#add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules" class="peer">Add the Implementation to Both Hadoop 1 and Hadoop 2 Compat modules.</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">Inside of the implementation of the source (eg.
MetricsMasterSourceImpl in the above example) create a new histogram, counter, gauge, or stat in the init method.
Then in the method that was added to the interface wire up the parameter passed in to the histogram.</p>
<p class="wrap-anywhere">Now add tests that make sure the data is correctly exported to the metrics 2 system.
For this the MetricsAssertHelper is provided.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="git-best-practices"><a data-card="" href="#git-best-practices" class="peer">Git Best Practices</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h2>
<p class="wrap-anywhere"><strong>Avoid git merges.</strong><br/>
<!-- -->Use <code>git pull --rebase</code> or <code>git fetch</code> followed by <code>git rebase</code>.</p>
<p class="wrap-anywhere"><strong>Do not use <code>git push --force</code>.</strong><br/>
<!-- -->If the push does not work, fix the problem or ask for help.</p>
<p class="wrap-anywhere">Please contribute to this document if you think of other Git best practices.</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="rebase_all_git_branchessh"><a data-card="" href="#rebase_all_git_branchessh" class="peer"><code>rebase_all_git_branches.sh</code></a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">The <em>dev-support/rebase_all_git_branches.sh</em> script is provided to help keep your Git repository clean.
Use the <code>-h</code> parameter to get usage instructions.
The script automatically refreshes your tracking branches, attempts an automatic rebase of each local branch against its remote branch, and gives you the option to delete any branch which represents a closed <code>HBASE-</code> JIRA.
The script has one optional configuration option, the location of your Git directory.
You can set a default by editing the script.
Otherwise, you can pass the git directory manually by using the <code>-d</code> parameter, followed by an absolute or relative directory name, or even &#x27;.&#x27; for the current working directory.
The script checks the directory for sub-directory called <em>.git/</em>, before proceeding.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="submitting-patches"><a data-card="" href="#submitting-patches" class="peer">Submitting Patches</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h2>
<p class="wrap-anywhere">If you are new to submitting patches to open source or new to submitting patches to Apache, start by
reading the <a href="https://commons.apache.org/patches.html">On Contributing Patches</a> page from
<a href="https://commons.apache.org/">Apache Commons Project</a>.
It provides a nice overview that applies equally to the Apache HBase Project.</p>
<p class="wrap-anywhere">Make sure you review <a href="/docs/building-and-developing/developer-guidelines#code-formatting-conventions" data-discover="true">Code Formatting Conventions</a> for code style. If your patch
was generated incorrectly or your code does not adhere to the code formatting guidelines, you may
be asked to redo some work.</p>
<p class="wrap-anywhere">HBase enforces code style via a maven plugin. After you&#x27;ve written up your changes, apply the
formatter before committing.</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> mvn</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> spotless:apply</span></span></code></pre></div></figure>
<p class="wrap-anywhere">When your commit is ready, present it to the community as a
<a href="https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests">GitHub Pull Request</a>.</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="few-general-guidelines"><a data-card="" href="#few-general-guidelines" class="peer">Few general guidelines</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<ul>
<li>Always patch against the master branch first, even if you want to patch in another branch.
HBase committers always apply patches first to the master branch, and backport as necessary. For
complex patches, you may be asked to perform the backport(s) yourself.</li>
<li>Submit one single PR for a single fix. If necessary, squash local commits to merge local commits
into a single one first. See this
<a href="http://stackoverflow.com/questions/5308816/how-to-use-git-merge-squash">Stack Overflow
question</a> for more information about squashing commits.</li>
<li>Please understand that not every patch may get committed, and that feedback will likely be
provided on the patch.</li>
</ul>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="developer-guidelines-submitting-patches-unit-tests"><a data-card="" href="#developer-guidelines-submitting-patches-unit-tests" class="peer">Unit Tests</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">Always add and/or update relevant unit tests when making the changes.
Make sure that new/changed unit tests pass locally before submitting the patch because it is faster
than waiting for presubmit result which runs full test suite. This will save your own time and
effort.
Use <a href="https://site.mockito.org/">Mockito</a> to make mocks which are very useful for testing failure scenarios by
injecting appropriate failures.</p>
<p class="wrap-anywhere">If you are creating a new unit test class, notice how other unit test classes have
classification/sizing annotations before class name and a static methods for setup/teardown of
testing environment. Be sure to include annotations in any new unit test files.
See <a href="/docs/building-and-developing/tests" data-discover="true">Tests</a> for more information on tests.</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="developer-guidelines-submitting-patches-integration-tests"><a data-card="" href="#developer-guidelines-submitting-patches-integration-tests" class="peer">Integration Tests</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">Significant new features should provide an integration test in addition to unit tests, suitable for exercising the new feature at different points in its configuration space.</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="reviewboard"><a data-card="" href="#reviewboard" class="peer">ReviewBoard</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">Patches larger than one screen, or patches that will be tricky to review, should go through <a href="https://reviews.apache.org">ReviewBoard</a>.</p>
<p class="wrap-anywhere"><strong>Procedure: Use ReviewBoard</strong></p>
<div class="fd-steps"><div class="fd-step"><p class="wrap-anywhere">Register for an account if you don&#x27;t already have one.
It does not use the credentials from <a href="https://issues.apache.org">issues.apache.org</a>.
Log in.</p></div><div class="fd-step"><p class="wrap-anywhere">Click <strong>New Review Request</strong>.</p></div><div class="fd-step"><p class="wrap-anywhere">Choose the <code>hbase-git</code> repository.
Click Choose File to select the diff and optionally a parent diff.
Click <strong>Create Review Request</strong>.</p></div><div class="fd-step"><p class="wrap-anywhere">Fill in the fields as required.
At the minimum, fill in the <strong>Summary</strong> and choose <code>hbase</code> as the <strong>Review Group</strong>.
If you fill in the <strong>Bugs</strong> field, the review board links back to the relevant JIRA.
The more fields you fill in, the better.
Click <strong>Publish</strong> to make your review request public.
An email will be sent to everyone in the <code>hbase</code> group, to review the patch.</p></div><div class="fd-step"><p class="wrap-anywhere">Back in your JIRA, click , and paste in the URL of your ReviewBoard request.
This attaches the ReviewBoard to the JIRA, for easy access.</p></div><div class="fd-step"><p class="wrap-anywhere">To cancel the request, click .</p></div></div>
<p class="wrap-anywhere">For more information on how to use ReviewBoard, see <a href="http://www.reviewboard.org/docs/manual/1.5/">the ReviewBoard
documentation</a>.</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="github"><a data-card="" href="#github" class="peer">GitHub</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">Submitting <a href="https://github.com/apache/hbase">GitHub</a> pull requests is another accepted form of
contributing patches. Refer to GitHub <a href="https://help.github.com/">documentation</a> for details on
how to create pull requests.</p>
<div class="flex gap-2 my-4 rounded-xl border bg-fd-card p-3 ps-1 text-sm text-fd-card-foreground shadow-md" style="--callout-color:var(--color-fd-info, var(--color-fd-muted))"><div role="none" class="w-0.5 bg-(--callout-color)/50 rounded-sm"></div><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-5 -me-0.5 fill-(--callout-color) text-fd-card"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg><div class="flex flex-col gap-2 min-w-0 flex-1"><div class="text-fd-muted-foreground prose-no-margin empty:hidden"><p class="wrap-anywhere">This section is incomplete and needs to be updated. Refer to
<a href="https://issues.apache.org/jira/browse/HBASE-23557">HBASE-23557</a></p></div></div></div>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="github-tooling"><a data-card="" href="#github-tooling" class="peer">GitHub Tooling</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere"><strong>Browser bookmarks</strong></p>
<p class="wrap-anywhere">Following is a useful javascript based browser bookmark that redirects from GitHub pull
requests to the corresponding jira work item. This redirects based on the HBase jira ID mentioned
in the issue title for the PR. Add the following javascript snippet as a browser bookmark to the
tool bar. Clicking on it while you are on an HBase GitHub PR page redirects you to the corresponding
jira item.</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">location.href </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> &quot;https://issues.apache.org/jira/browse/&quot;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> document.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">getElementsByClassName</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&quot;js-issue-title&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">].innerHTML.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">HBASE-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">];</span></span></code></pre></div></figure>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="guide-for-hbase-committers"><a data-card="" href="#guide-for-hbase-committers" class="peer">Guide for HBase Committers</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="becoming-a-committer"><a data-card="" href="#becoming-a-committer" class="peer">Becoming a committer</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">Committers are responsible for reviewing and integrating code changes, testing
and voting on release candidates, weighing in on design discussions, as well as
other types of project contributions. The PMC votes to make a contributor a
committer based on an assessment of their contributions to the project. It is
expected that committers demonstrate a sustained history of high-quality
contributions to the project and community involvement.</p>
<p class="wrap-anywhere">Contributions can be made in many ways. There is no single path to becoming a
committer, nor any expected timeline. Submitting features, improvements, and bug
fixes is the most common avenue, but other methods are both recognized and
encouraged (and may be even more important to the health of HBase as a project and a
community). A non-exhaustive list of potential contributions (in no particular
order):</p>
<ul>
<li><a href="/docs/contributing-to-documentation" data-discover="true">Update the documentation</a> for new
changes, best practices, recipes, and other improvements.</li>
<li>Keep the website up to date.</li>
<li>Perform testing and report the results. For instance, scale testing and
testing non-standard configurations is always appreciated.</li>
<li>Maintain the shared Jenkins testing environment and other testing
infrastructure.</li>
<li><a href="/docs/building-and-developing/voting" data-discover="true">Vote on release candidates</a> after performing validation, even if non-binding.
A non-binding vote is a vote by a non-committer.</li>
<li>Provide input for discussion threads on the link:/mail-lists.html[mailing lists] (which usually have
<code>[DISCUSS]</code> in the subject line).</li>
<li>Answer questions questions on the user or developer mailing lists and on
Slack.</li>
<li>Make sure the HBase community is a welcoming one and that we adhere to our
link:/coc.html[Code of conduct]. Alert the PMC if you
have concerns.</li>
<li>Review other people&#x27;s work (both code and non-code) and provide public
feedback.</li>
<li>Report bugs that are found, or file new feature requests.</li>
<li>Triage issues and keep JIRA organized. This includes closing stale issues,
labeling new issues, updating metadata, and other tasks as needed.</li>
<li>Mentor new contributors of all sorts.</li>
<li>Give talks and write blogs about HBase. Add these to the link:/[News] section
of the website.</li>
<li>Provide UX feedback about HBase, the web UI, the CLI, APIs, and the website.</li>
<li>Write demo applications and scripts.</li>
<li>Help attract and retain a diverse community.</li>
<li>Interact with other projects in ways that benefit HBase and those other
projects.</li>
</ul>
<p class="wrap-anywhere">Not every individual is able to do all (or even any) of the items on this list.
If you think of other ways to contribute, go for it (and add them to the list).
A pleasant demeanor and willingness to contribute are all you need to make a
positive impact on the HBase project. Invitations to become a committer are the
result of steady interaction with the community over the long term, which builds
trust and recognition.</p>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="new-committers"><a data-card="" href="#new-committers" class="peer">New committers</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">New committers are encouraged to first read Apache&#x27;s generic committer
documentation:</p>
<ul>
<li><a href="https://www.apache.org/dev/new-committers-guide.html">Apache New Committer Guide</a></li>
<li><a href="https://www.apache.org/dev/committers.html">Apache Committer FAQ</a></li>
</ul>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="review"><a data-card="" href="#review" class="peer">Review</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">HBase committers should, as often as possible, attempt to review patches
submitted by others. Ideally every submitted patch will get reviewed by a
committer <em>within a few days</em>. If a committer reviews a patch they have not
authored, and believe it to be of sufficient quality, then they can commit the
patch. Otherwise the patch should be cancelled with a clear explanation for why
it was rejected.</p>
<p class="wrap-anywhere">The list of submitted patches is in the
<a href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?mode=hide&amp;requestId=12312392">HBase Review Queue</a>,
which is ordered by time of last modification. Committers should scan the list
from top to bottom, looking for patches that they feel qualified to review and
possibly commit. If you see a patch you think someone else is better qualified
to review, you can mention them by username in the JIRA.</p>
<p class="wrap-anywhere">For non-trivial changes, it is required that another committer review your
patches before commit. <strong>Self-commits of non-trivial patches are not allowed.</strong>
Use the <strong>Submit Patch</strong> button in JIRA, just like other contributors, and
then wait for a <code>+1</code> response from another committer before committing.</p>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="reject"><a data-card="" href="#reject" class="peer">Reject</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">Patches which do not adhere to the guidelines in
<a href="/docs/building-and-developing" data-discover="true">HowToContribute</a> and to the
<a href="https://cwiki.apache.org/confluence/display/HADOOP2/CodeReviewChecklist">code review checklist</a>
should be rejected. Committers should always be polite to contributors and try
to instruct and encourage them to contribute better patches. If a committer
wishes to improve an unacceptable patch, then it should first be rejected, and a
new patch should be attached by the committer for further review.</p>
<h4 class="flex scroll-m-28 flex-row items-center gap-2" id="commit"><a data-card="" href="#commit" class="peer">Commit</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h4>
<p class="wrap-anywhere">Committers commit patches to the Apache HBase GIT repository.</p>
<div class="flex gap-2 my-4 rounded-xl border bg-fd-card p-3 ps-1 text-sm text-fd-card-foreground shadow-md" style="--callout-color:var(--color-fd-warning, var(--color-fd-muted))"><div role="none" class="w-0.5 bg-(--callout-color)/50 rounded-sm"></div><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-5 -me-0.5 fill-(--callout-color) text-fd-card"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg><div class="flex flex-col gap-2 min-w-0 flex-1"><p class="font-medium my-0!">Before you commit!!!!</p><div class="text-fd-muted-foreground prose-no-margin empty:hidden"><p class="wrap-anywhere">Make sure your local configuration is correct, especially your identity and email. Examine the
output of the <code>$ git config --list</code> command and be sure it is correct. See <a href="https://help.github.com/articles/set-up-git">Set Up
Git</a> if you need pointers.</p></div></div></div>
<p class="wrap-anywhere">When you commit a patch:</p>
<ol>
<li>
<p class="wrap-anywhere">Include the Jira issue ID in the commit message along with a short description
of the change. Try to add something more than just the Jira title so that
someone looking at <code>git log</code> output doesn&#x27;t have to go to Jira to discern what
the change is about. Be sure to get the issue ID right, because this causes
Jira to link to the change in Git (use the issue&#x27;s &quot;All&quot; tab to see these
automatic links).</p>
</li>
<li>
<p class="wrap-anywhere">Commit the patch to a new branch based off <code>master</code> or the other intended
branch. It&#x27;s a good idea to include the JIRA ID in the name of this branch.
Check out the relevant target branch where you want to commit, and make sure
your local branch has all remote changes, by doing a <code>git pull --rebase</code> or
another similar command. Next, cherry-pick the change into each relevant
branch (such as master), and push the changes to the remote branch using
a command such as <code>git push &lt;remote-server&gt; &lt;remote-branch&gt;</code>.</p>
<div class="flex gap-2 my-4 rounded-xl border bg-fd-card p-3 ps-1 text-sm text-fd-card-foreground shadow-md" style="--callout-color:var(--color-fd-warning, var(--color-fd-muted))"><div role="none" class="w-0.5 bg-(--callout-color)/50 rounded-sm"></div><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-5 -me-0.5 fill-(--callout-color) text-fd-card"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg><div class="flex flex-col gap-2 min-w-0 flex-1"><div class="text-fd-muted-foreground prose-no-margin empty:hidden"><p class="wrap-anywhere">If you do not have all remote changes, the push will fail. If the push fails for any reason,
fix the problem or ask for help. Do not do a <code>git push --force</code>.</p></div></div></div>
<p class="wrap-anywhere">Before you can commit a patch, you need to determine how the patch was created.
The instructions and preferences around the way to create patches have changed,
and there will be a transition period.</p>
<p class="wrap-anywhere"><strong>Determine How a Patch Was Created</strong></p>
<ul>
<li>
<p class="wrap-anywhere">If the first few lines of the patch look like the headers of an email, with a From, Date, and
Subject, it was created using <code>git format-patch</code>. This is the preferred way, because you can
reuse the submitter&#x27;s commit message. If the commit message is not appropriate, you can still use
the commit, then run <code>git commit --amend</code> and reword as appropriate.</p>
</li>
<li>
<p class="wrap-anywhere">If the first line of the patch looks similar to the following, it was created using +git diff+ without <code>--no-prefix</code>.
This is acceptable too.
Notice the <code>a</code> and <code>b</code> in front of the file names.
This is the indication that the patch was not created with <code>--no-prefix</code>.</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">diff --git a/src/main/asciidoc/_chapters/developer.adoc b/src/main/asciidoc/_chapters/developer.adoc</span></span></code></pre></div></figure>
</li>
<li>
<p class="wrap-anywhere">If the first line of the patch looks similar to the following (without the <code>a</code> and <code>b</code>), the
patch was created with <code>git diff --no-prefix</code> and you need to add <code>-p0</code> to the <code>git apply</code> command
below.</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">diff --git src/main/asciidoc/_chapters/developer.adoc src/main/asciidoc/_chapters/developer.adoc</span></span></code></pre></div></figure>
</li>
</ul>
<p class="wrap-anywhere"><strong>Example of committing a Patch</strong></p>
<p class="wrap-anywhere">One thing you will notice with these examples is that there are a lot of
<code>git pull</code> commands. The only command that actually writes anything to the
remote repository is <code>git push</code>, and you need to make absolutely sure you have
the correct versions of everything and don&#x27;t have any conflicts before pushing.
The extra <code>git pull</code> commands are usually redundant, but better safe than sorry.</p>
<p class="wrap-anywhere">The first example shows how to apply a patch that was generated with +git
format-patch+ and apply it to the <code>master</code> and <code>branch-1</code> branches.</p>
<p class="wrap-anywhere">The directive to use <code>git format-patch</code> rather than <code>git diff</code>, and not to use
<code>--no-prefix</code>, is a new one. See the second example for how to apply a patch
created with <code>git diff</code>, and educate the person who created the patch.</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> checkout</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -b</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> HBASE-XXXX</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> am</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/Downloads/HBASE-XXXX-v2.patch</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --signoff</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # If you are committing someone else&#x27;s patch.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> checkout</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> master</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --rebase</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cherry-pick</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &lt;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">sha-from-commi</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Resolve conflicts if necessary or ask the submitter to do it</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --rebase</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # Better safe than sorry</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> push</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> origin</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> master</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Backport to branch-1</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> checkout</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> branch-1</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --rebase</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cherry-pick</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &lt;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">sha-from-commi</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Resolve conflicts if necessary</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --rebase</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # Better safe than sorry</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> push</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> origin</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> branch-1</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> branch</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> HBASE-XXXX</span></span></code></pre></div></figure>
<p class="wrap-anywhere">This example shows how to commit a patch that was created using <code>git diff</code>
without <code>--no-prefix</code>. If the patch was created with <code>--no-prefix</code>, add <code>-p0</code> to
the <code>git apply</code> command.</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> apply</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ~/Downloads/HBASE-XXXX-v2.patch</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> commit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -m</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> &quot;HBASE-XXXX Really Good Code Fix (Joe Schmo)&quot;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --author=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">contributor</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&gt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -a</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # This and next command is needed for patches created with &#x27;git diff&#x27;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> commit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --amend</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --signoff</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> checkout</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> master</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --rebase</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cherry-pick</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &lt;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">sha-from-commi</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Resolve conflicts if necessary or ask the submitter to do it</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --rebase</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # Better safe than sorry</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> push</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> origin</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> master</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Backport to branch-1</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> checkout</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> branch-1</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --rebase</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cherry-pick</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &lt;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">sha-from-commi</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Resolve conflicts if necessary or ask the submitter to do it</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> pull</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> --rebase</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # Better safe than sorry</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> push</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> origin</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> branch-1</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> branch</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> HBASE-XXXX</span></span></code></pre></div></figure>
</li>
<li>
<p class="wrap-anywhere">Resolve the issue as fixed, thanking the contributor.
Always set the &quot;Fix Version&quot; at this point, but only set a single fix version
for each branch where the change was committed, the earliest release in that
branch in which the change will appear.</p>
</li>
</ol>
<p class="wrap-anywhere"><strong>Commit Message Format</strong></p>
<p class="wrap-anywhere">The commit message should contain the JIRA ID and a description of what the patch does.
The preferred commit message format is:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span>&lt;jira-id&gt; &lt;jira-title&gt; (&lt;contributor-name-if-not-commit-author&gt;)</span></span></code></pre></div></figure>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span>HBASE-12345 Fix All The Things (jane@example.com)</span></span></code></pre></div></figure>
<p class="wrap-anywhere">If the contributor used <code>git format-patch</code> to generate the patch, their commit
message is in their patch and you can use that, but be sure the JIRA ID is at
the front of the commit message, even if the contributor left it out.</p>
<p class="wrap-anywhere"><strong>Use GitHub&#x27;s &quot;Co-authored-by&quot; when there are multiple authors</strong></p>
<p class="wrap-anywhere">We&#x27;ve established the practice of committing to master and then cherry picking back to branches whenever possible, unless</p>
<ul>
<li>it&#x27;s breaking compat: In which case, if it can go in minor releases, backport to branch-1 and branch-2.</li>
<li>it&#x27;s a new feature: No for maintenance releases, For minor releases, discuss and arrive at consensus.</li>
</ul>
<p class="wrap-anywhere">There are occasions when there are multiple author for a patch.
For example when there is a minor conflict we can fix it up and just proceed with the commit.
The amending author will be different from the original committer, so you should also attribute to the original author by
adding one or more <code>Co-authored-by</code> trailers to the commit&#x27;s message.
See <a href="https://help.github.com/en/articles/creating-a-commit-with-multiple-authors/">the GitHub documentation for &quot;Creating a commit with multiple authors&quot;</a>.</p>
<p class="wrap-anywhere">In short, these are the steps to add Co-authors that will be tracked by GitHub:</p>
<ol>
<li>Collect the name and email address for each co-author.</li>
<li>Commit the change, but after your commit description, instead of a closing quotation, add two empty lines. (Do not close the commit message with a quotation mark)</li>
<li>On the next line of the commit message, type <code>Co-authored-by: name &lt;name@example.com&gt;</code>. After the co-author information, add a closing quotation mark.</li>
</ol>
<p class="wrap-anywhere">Here is the example from the GitHub page, using 2 Co-authors:</p>
<figure dir="ltr" class="my-4 bg-fd-card rounded-xl shiki relative border shadow-sm not-prose overflow-hidden text-sm shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="-1"><div class="empty:hidden absolute top-2 right-2 z-2 backdrop-blur-lg rounded-lg text-fd-muted-foreground"><button type="button" class="inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors duration-100 disabled:pointer-events-none disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fd-ring p-1 [&amp;_svg]:size-4 hover:text-fd-accent-foreground data-checked:text-fd-accent-foreground" aria-label="Copy Text"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide"><rect width="8" height="4" x="8" y="2" rx="1" ry="1"></rect><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"></path></svg></button></div><div role="region" tabindex="0" class="text-[13px] py-3.5 overflow-auto max-h-[600px] fd-scroll-container focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-fd-ring" style="--padding-right:calc(var(--spacing) * 8)"><pre class="min-w-full w-max *:flex *:flex-col"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> commit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -m</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> &quot;Refactor usability tests.</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Co-authored-by: name &lt;name@example.com&gt;</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Co-authored-by: another-name &lt;another-name@example.com&gt;&quot;</span></span></code></pre></div></figure>
<p class="wrap-anywhere">Note: <code>Amending-Author: Author &lt;committer@apache&gt;</code> was used prior to this
<a href="https://lists.apache.org/thread.html/f00b5f9b65570e777dbb31c37d7b0ffc55c5fc567aefdb456608a042@%3Cdev.hbase.apache.org%3E">DISCUSSION</a>.</p>
<p class="wrap-anywhere"><strong>Close related GitHub PRs</strong></p>
<p class="wrap-anywhere">As a project we work to ensure there&#x27;s a JIRA associated with each change, but we don&#x27;t mandate any particular tool be used for reviews. Due to implementation details of the ASF&#x27;s integration between hosted git repositories and GitHub, the PMC has no ability to directly close PRs on our GitHub repo. In the event that a contributor makes a Pull Request on GitHub, either because the contributor finds that easier than attaching a patch to JIRA or because a reviewer prefers that UI for examining changes, it&#x27;s important to make note of the PR in the commit that goes to the master branch so that PRs are kept up to date.</p>
<p class="wrap-anywhere">To read more about the details of what kinds of commit messages will work with the GitHub &quot;close via keyword in commit&quot; mechanism see <a href="https://help.github.com/articles/closing-issues-using-keywords/">the GitHub documentation for &quot;Closing issues using keywords&quot;</a>. In summary, you should include a line with the phrase &quot;closes #XXX&quot;, where the XXX is the pull request id. The pull request id is usually given in the GitHub UI in grey at the end of the subject heading.</p>
<p class="wrap-anywhere"><strong>Committers are responsible for making sure commits do not break the build or tests</strong></p>
<p class="wrap-anywhere">If a committer commits a patch, it is their responsibility to make sure it passes the test suite.
It is helpful if contributors keep an eye out that their patch does not break the hbase build and/or tests, but ultimately, a contributor cannot be expected to be aware of all the particular vagaries and interconnections that occur in a project like HBase.
A committer should.</p>
<p class="wrap-anywhere"><strong>Patching Etiquette</strong></p>
<p class="wrap-anywhere">In the thread <a href="https://lists.apache.org/thread.html/186fcd5eb71973a7b282ecdba41606d3d221efd505d533bb729e1fad%401400648690%40%3Cdev.hbase.apache.org%3E">HBase, mail # dev - ANNOUNCEMENT: Git Migration In Progress (WAS =&gt;
Re: Git Migration)</a>, it was agreed on the following patch flow</p>
<ol>
<li>Develop and commit the patch against master first.</li>
<li>Try to cherry-pick the patch when backporting if possible.</li>
<li>If this does not work, manually commit the patch to the branch.</li>
</ol>
<p class="wrap-anywhere"><strong>Merge Commits</strong></p>
<p class="wrap-anywhere">Avoid merge commits, as they create problems in the git history.</p>
<p class="wrap-anywhere"><strong>Committing Documentation</strong></p>
<p class="wrap-anywhere">See <a href="/docs/contributing-to-documentation" data-discover="true">appendix contributing to documentation</a>.</p>
<p class="wrap-anywhere"><strong>How to re-trigger github Pull Request checks/re-build</strong></p>
<p class="wrap-anywhere">A Pull Request (PR) submission triggers the hbase yetus checks. The checks make
sure the patch doesn&#x27;t break the build or introduce test failures. The checks take
around four hours to run (They are the same set run when you submit a patch via
HBASE JIRA). When finished, they add a report to the PR as a comment. If a problem
w/ the patch — failed compile, checkstyle violation, or an added findbugs --
the original author makes fixes and pushes a new patch. This re-runs the checks
to produce a new report.</p>
<p class="wrap-anywhere">Sometimes though, the patch is good but a flakey, unrelated test has the report vote -1
on the patch. In this case, <strong>committers</strong> can retrigger the check run by doing a force push of the
exact same patch. Or, click on the <code>Console output</code> link which shows toward the end
of the report (For example <code>https://builds.apache.org/job/HBase-PreCommit-GitHub-PR/job/PR-289/1/console</code>).
This will take you to <code>builds.apache.org</code>, to the build run that failed. See the
&quot;breadcrumbs&quot; along the top (where breadcrumbs is the listing of the directories that
gets us to this particular build page). It&#x27;ll look something like
<code>Jenkins &gt; HBase-PreCommit-GitHub-PR &gt; PR-289 &gt; #1</code>. Click on the
PR number — i.e. PR-289 in our example — and then, when you&#x27;ve arrived at the PR page,
find the &#x27;Build with Parameters&#x27; menu-item (along top left-hand menu). Click here and
then <code>Build</code> leaving the JIRA_ISSUE_KEY empty. This will re-run your checks.</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="dialog"><a data-card="" href="#dialog" class="peer">Dialog</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">Committers should hang out in the #hbase room on irc.freenode.net for real-time discussions.
However any substantive discussion (as with any off-list project-related discussion) should be re-iterated in Jira or on the developer list.</p>
<h3 class="flex scroll-m-28 flex-row items-center gap-2" id="do-not-edit-jira-comments"><a data-card="" href="#do-not-edit-jira-comments" class="peer">Do not edit JIRA comments</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h3>
<p class="wrap-anywhere">Misspellings and/or bad grammar is preferable to the disruption a JIRA comment edit.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="the-hbase-thirdparty-dependency-and-shadingrelocation"><a data-card="" href="#the-hbase-thirdparty-dependency-and-shadingrelocation" class="peer">The hbase-thirdparty dependency and shading/relocation</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h2>
<p class="wrap-anywhere">A new project was created for the release of hbase-2.0.0. It was called
<code>hbase-thirdparty</code>. This project exists only to provide the main hbase
project with relocated — or shaded — versions of popular thirdparty
libraries such as guava, netty, and protobuf. The mainline HBase project
relies on the relocated versions of these libraries gotten from hbase-thirdparty
rather than on finding these classes in their usual locations. We do this so
we can specify whatever the version we wish. If we don&#x27;t relocate, we must
harmonize our version to match that which hadoop, spark, and other projects use.</p>
<p class="wrap-anywhere">For developers, this means you need to be careful referring to classes from
netty, guava, protobuf, gson, etc. (see the hbase-thirdparty pom.xml for what
it provides). Devs must refer to the hbase-thirdparty provided classes. In
practice, this is usually not an issue (though it can be a bit of a pain). You
will have to hunt for the relocated version of your particular class. You&#x27;ll
find it by prepending the general relocation prefix of <code>org.apache.hbase.thirdparty.</code>.
For example if you are looking for <code>com.google.protobuf.Message</code>, the relocated
version used by HBase internals can be found at
<code>org.apache.hbase.thirdparty.com.google.protobuf.Message</code>.</p>
<p class="wrap-anywhere">For a few thirdparty libs, like protobuf (see the protobuf chapter in this book
for the why), your IDE may give you both options — the <code>com.google.protobuf.*</code>
and the <code>org.apache.hbase.thirdparty.com.google.protobuf.*</code> — because both
classes are on your CLASSPATH. Unless you are doing the particular juggling
required in Coprocessor Endpoint development (again see above cited protobuf
chapter), you&#x27;ll want to use the shaded version, always.</p>
<p class="wrap-anywhere">The <code>hbase-thirdparty</code> project has groupid of <code>org.apache.hbase.thirdparty</code>.
As of this writing, it provides three jars; one for netty with an artifactid of
<code>hbase-thirdparty-netty</code>, one for protobuf at <code>hbase-thirdparty-protobuf</code> and then
a jar for all else — gson, guava — at <code>hbase-thirdpaty-miscellaneous</code>.</p>
<p class="wrap-anywhere">The hbase-thirdparty artifacts are a product produced by the Apache HBase
project under the aegis of the HBase Project Management Committee. Releases
are done via the usual voting project on the hbase dev mailing list. If issue
in the hbase-thirdparty, use the hbase JIRA and mailing lists to post notice.</p>
<h2 class="flex scroll-m-28 flex-row items-center gap-2" id="development-of-hbase-related-maven-archetypes"><a data-card="" href="#development-of-hbase-related-maven-archetypes" class="peer">Development of HBase-related Maven archetypes</a><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></h2>
<p class="wrap-anywhere">The development of HBase-related Maven archetypes was begun with
<a href="https://issues.apache.org/jira/browse/HBASE-14876">HBASE-14876</a>.
For an overview of the hbase-archetypes infrastructure and instructions
for developing new HBase-related Maven archetypes, please see
<code>hbase/hbase-archetypes/README.md</code>.</p></div><a href="https://github.com/apache/hbase/edit/master/hbase-website/app/pages/_docs/docs/_mdx/(multi-page)/building-and-developing/developer-guidelines.mdx" rel="noreferrer noopener" target="_blank" class="no-print text-fd-secondary-foreground bg-fd-secondary hover:text-fd-accent-foreground hover:bg-fd-accent w-fit rounded-xl border p-2 text-sm font-medium transition-colors">Edit on GitHub</a><div class="@container grid gap-4 grid-cols-2"><a class="hover:bg-fd-accent/80 hover:text-fd-accent-foreground flex flex-col gap-2 rounded-lg border p-4 text-sm transition-colors @max-lg:col-span-full" href="/docs/building-and-developing/tests" data-discover="true"><div class="inline-flex items-center gap-1.5 font-medium"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-left -mx-1 size-4 shrink-0 rtl:rotate-180"><path d="m15 18-6-6 6-6"></path></svg><p>Tests</p></div><p class="text-fd-muted-foreground truncate">Writing and running HBase unit tests, integration tests, and ChaosMonkey destructive tests for comprehensive test coverage.</p></a><a class="hover:bg-fd-accent/80 hover:text-fd-accent-foreground flex flex-col gap-2 rounded-lg border p-4 text-sm transition-colors @max-lg:col-span-full text-end" href="/docs/unit-testing" data-discover="true"><div class="inline-flex items-center gap-1.5 font-medium flex-row-reverse"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-right -mx-1 size-4 shrink-0 rtl:rotate-180"><path d="m9 18 6-6-6-6"></path></svg><p>Unit Testing HBase Applications</p></div><p class="text-fd-muted-foreground truncate">This chapter discusses unit testing your HBase application using JUnit, Mockito, MRUnit, and HBaseTestingUtility.</p></a></div></article><div id="nd-toc" class="sticky top-(--fd-docs-row-1) flex h-[calc(var(--fd-docs-height)-var(--fd-docs-row-1))] w-(--fd-toc-width) flex-col justify-self-end pe-4 pt-12 pb-2 [grid-area:toc] max-xl:hidden"><h3 id="toc-title" class="text-fd-muted-foreground inline-flex items-center gap-1.5 text-sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-text size-4"><path d="M17 6.1H3"></path><path d="M21 12.1H3"></path><path d="M15.1 18H3"></path></svg>On this page</h3><div class="relative ms-px min-h-0 overflow-auto mask-[linear-gradient(to_bottom,transparent,white_16px,white_calc(100%-16px),transparent)] py-3 text-sm [scrollbar-width:none]"><div class="flex flex-col"><a data-active="false" href="#branches" style="padding-inline-start:14px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:0"></div>Branches</a><a data-active="false" href="#policy-for-fix-version-in-jira" style="padding-inline-start:14px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:0"></div>Policy for Fix Version in JIRA</a><a data-active="false" href="#code-standards" style="padding-inline-start:14px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px bottom-1.5" style="inset-inline-start:0"></div>Code Standards</a><a data-active="false" href="#interface-classifications" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="absolute start-0 -top-1.5 size-4 rtl:-scale-x-100"><line x1="0" y1="0" x2="10" y2="12" class="stroke-fd-foreground/10" stroke-width="1"></line></svg><div class="bg-fd-foreground/10 absolute inset-y-0 w-px top-1.5" style="inset-inline-start:10px"></div>Interface Classifications</a><a data-active="false" href="#interfaceaudience" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>InterfaceAudience</a><a data-active="false" href="#interfacestability" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>@InterfaceStability</a><a data-active="false" href="#code-formatting-conventions" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Code Formatting Conventions</a><a data-active="false" href="#space-invaders" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Space Invaders</a><a data-active="false" href="#auto-generated-code" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Auto Generated Code</a><a data-active="false" href="#long-lines" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Long Lines</a><a data-active="false" href="#trailing-spaces" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Trailing Spaces</a><a data-active="false" href="#api-documentation-javadoc" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>API Documentation (Javadoc)</a><a data-active="false" href="#findbugs" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Findbugs</a><a data-active="false" href="#javadoc---useless-defaults" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Javadoc - Useless Defaults</a><a data-active="false" href="#one-thing-at-a-time-folks" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>One Thing At A Time, Folks</a><a data-active="false" href="#ambiguous-unit-tests" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Ambiguous Unit Tests</a><a data-active="false" href="#garbage-collection-conserving-guidelines" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px bottom-1.5" style="inset-inline-start:10px"></div>Garbage-Collection Conserving Guidelines</a><a data-active="false" href="#invariants" style="padding-inline-start:14px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="absolute start-0 -top-1.5 size-4 rtl:-scale-x-100"><line x1="10" y1="0" x2="0" y2="12" class="stroke-fd-foreground/10" stroke-width="1"></line></svg><div class="bg-fd-foreground/10 absolute inset-y-0 w-px top-1.5 bottom-1.5" style="inset-inline-start:0"></div>Invariants</a><a data-active="false" href="#no-permanent-state-in-zookeeper" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="absolute start-0 -top-1.5 size-4 rtl:-scale-x-100"><line x1="0" y1="0" x2="10" y2="12" class="stroke-fd-foreground/10" stroke-width="1"></line></svg><div class="bg-fd-foreground/10 absolute inset-y-0 w-px top-1.5 bottom-1.5" style="inset-inline-start:10px"></div>No permanent state in ZooKeeper</a><a data-active="false" href="#running-in-situ" style="padding-inline-start:14px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="absolute start-0 -top-1.5 size-4 rtl:-scale-x-100"><line x1="10" y1="0" x2="0" y2="12" class="stroke-fd-foreground/10" stroke-width="1"></line></svg><div class="bg-fd-foreground/10 absolute inset-y-0 w-px top-1.5" style="inset-inline-start:0"></div>Running In-Situ</a><a data-active="false" href="#adding-metrics" style="padding-inline-start:14px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px bottom-1.5" style="inset-inline-start:0"></div>Adding Metrics</a><a data-active="false" href="#add-metric-name-and-function-to-hadoop-compat-interface" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="absolute start-0 -top-1.5 size-4 rtl:-scale-x-100"><line x1="0" y1="0" x2="10" y2="12" class="stroke-fd-foreground/10" stroke-width="1"></line></svg><div class="bg-fd-foreground/10 absolute inset-y-0 w-px top-1.5" style="inset-inline-start:10px"></div>Add Metric name and Function to Hadoop Compat Interface.</a><a data-active="false" href="#add-the-implementation-to-both-hadoop-1-and-hadoop-2-compat-modules" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px bottom-1.5" style="inset-inline-start:10px"></div>Add the Implementation to Both Hadoop 1 and Hadoop 2 Compat modules.</a><a data-active="false" href="#git-best-practices" style="padding-inline-start:14px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="absolute start-0 -top-1.5 size-4 rtl:-scale-x-100"><line x1="10" y1="0" x2="0" y2="12" class="stroke-fd-foreground/10" stroke-width="1"></line></svg><div class="bg-fd-foreground/10 absolute inset-y-0 w-px top-1.5 bottom-1.5" style="inset-inline-start:0"></div>Git Best Practices</a><a data-active="false" href="#rebase_all_git_branchessh" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="absolute start-0 -top-1.5 size-4 rtl:-scale-x-100"><line x1="0" y1="0" x2="10" y2="12" class="stroke-fd-foreground/10" stroke-width="1"></line></svg><div class="bg-fd-foreground/10 absolute inset-y-0 w-px top-1.5 bottom-1.5" style="inset-inline-start:10px"></div><code>rebase_all_git_branches.sh</code></a><a data-active="false" href="#submitting-patches" style="padding-inline-start:14px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="absolute start-0 -top-1.5 size-4 rtl:-scale-x-100"><line x1="10" y1="0" x2="0" y2="12" class="stroke-fd-foreground/10" stroke-width="1"></line></svg><div class="bg-fd-foreground/10 absolute inset-y-0 w-px top-1.5 bottom-1.5" style="inset-inline-start:0"></div>Submitting Patches</a><a data-active="false" href="#few-general-guidelines" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="absolute start-0 -top-1.5 size-4 rtl:-scale-x-100"><line x1="0" y1="0" x2="10" y2="12" class="stroke-fd-foreground/10" stroke-width="1"></line></svg><div class="bg-fd-foreground/10 absolute inset-y-0 w-px top-1.5" style="inset-inline-start:10px"></div>Few general guidelines</a><a data-active="false" href="#developer-guidelines-submitting-patches-unit-tests" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Unit Tests</a><a data-active="false" href="#developer-guidelines-submitting-patches-integration-tests" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Integration Tests</a><a data-active="false" href="#reviewboard" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>ReviewBoard</a><a data-active="false" href="#github" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>GitHub</a><a data-active="false" href="#github-tooling" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>GitHub Tooling</a><a data-active="false" href="#guide-for-hbase-committers" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Guide for HBase Committers</a><a data-active="false" href="#becoming-a-committer" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Becoming a committer</a><a data-active="false" href="#new-committers" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>New committers</a><a data-active="false" href="#review" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Review</a><a data-active="false" href="#reject" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Reject</a><a data-active="false" href="#commit" style="padding-inline-start:36px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Commit</a><a data-active="false" href="#dialog" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:10px"></div>Dialog</a><a data-active="false" href="#do-not-edit-jira-comments" style="padding-inline-start:26px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px bottom-1.5" style="inset-inline-start:10px"></div>Do not edit JIRA comments</a><a data-active="false" href="#the-hbase-thirdparty-dependency-and-shadingrelocation" style="padding-inline-start:14px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="absolute start-0 -top-1.5 size-4 rtl:-scale-x-100"><line x1="10" y1="0" x2="0" y2="12" class="stroke-fd-foreground/10" stroke-width="1"></line></svg><div class="bg-fd-foreground/10 absolute inset-y-0 w-px top-1.5" style="inset-inline-start:0"></div>The hbase-thirdparty dependency and shading/relocation</a><a data-active="false" href="#development-of-hbase-related-maven-archetypes" style="padding-inline-start:14px" class="prose text-fd-muted-foreground hover:text-fd-accent-foreground data-[active=true]:text-fd-primary relative py-1.5 text-sm wrap-anywhere transition-colors first:pt-0 last:pb-0"><div class="bg-fd-foreground/10 absolute inset-y-0 w-px" style="inset-inline-start:0"></div>Development of HBase-related Maven archetypes</a></div></div></div></div><script>((storageKey2, restoreKey) => {
if (!window.history.state || !window.history.state.key) {
let key = Math.random().toString(32).slice(2);
window.history.replaceState({ key }, "");
}
try {
let positions = JSON.parse(sessionStorage.getItem(storageKey2) || "{}");
let storedY = positions[restoreKey || window.history.state.key];
if (typeof storedY === "number") {
window.scrollTo(0, storedY);
}
} catch (error) {
console.error(error);
sessionStorage.removeItem(storageKey2);
}
})("react-router-scroll-positions", null)</script><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"v8_passThroughRequests":false,"v8_trailingSlashAwareDataRequests":false,"unstable_previewServerPrerendering":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":false};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script><script type="module" async="">import "/assets/manifest-baf72bfa.js";
import * as route0 from "/assets/root-COkOICkm.js";
import * as route1 from "/assets/docs-layout-5T1N7EZh.js";
import * as route2 from "/assets/docs-DMCF1KDd.js";
window.__reactRouterRouteModules = {"root":route0,"pages/_docs/docs-layout":route1,"routes/_docs/docs":route2};
import("/assets/entry.client-Bi9_frb9.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_3\":-5,\"_4\":-5},\"loaderData\",{\"_5\":6},\"actionData\",\"errors\",\"routes/_docs/docs\",{\"_7\":8,\"_9\":10,\"_11\":12},\"path\",\"(multi-page)/building-and-developing/developer-guidelines.mdx\",\"url\",\"/docs/building-and-developing/developer-guidelines\",\"tree\",{\"_13\":14,\"_15\":16,\"_17\":18},\"$id\",\"root\",\"name\",\"Docs\",\"children\",[19,20],{\"_21\":22,\"_15\":44,\"_24\":-7,\"_14\":25,\"_26\":-7,\"_27\":45,\"_29\":-7,\"_17\":46,\"_13\":47,\"_32\":48},{\"_21\":22,\"_15\":23,\"_24\":-7,\"_14\":25,\"_26\":-7,\"_27\":28,\"_29\":-7,\"_17\":30,\"_13\":31,\"_32\":33},\"type\",\"folder\",\"Single-Page Documentation\",\"icon\",true,\"defaultOpen\",\"description\",\"Entire docs on one page\",\"index\",[36],\"single-page\",\"$ref\",{\"_34\":35},\"metaFile\",\"single-page/meta.json\",{\"_13\":37,\"_21\":38,\"_15\":39,\"_27\":40,\"_24\":-7,\"_9\":41,\"_32\":42},\"single-page/index.mdx\",\"page\",\"Apache HBase Documentation\",\"Complete Apache HBase documentation in one continuous page.\",\"/docs/single-page\",{\"_43\":37},\"file\",\"Multi-Page Documentation\",\"Split across multiple pages\",[50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109],\"(multi-page)\",{\"_34\":49},\"(multi-page)/meta.json\",{\"_13\":727,\"_21\":176,\"_24\":-7,\"_15\":718},{\"_13\":722,\"_21\":38,\"_15\":723,\"_27\":724,\"_24\":-7,\"_9\":725,\"_32\":726},{\"_13\":717,\"_21\":38,\"_15\":718,\"_27\":719,\"_24\":-7,\"_9\":720,\"_32\":721},{\"_21\":38,\"_24\":-7,\"_15\":714,\"_9\":715,\"_716\":25},{\"_13\":712,\"_21\":176,\"_24\":-7,\"_15\":713},{\"_21\":22,\"_15\":660,\"_24\":-7,\"_14\":-7,\"_26\":-7,\"_27\":-7,\"_29\":661,\"_17\":662,\"_13\":663,\"_32\":664},{\"_21\":22,\"_15\":626,\"_24\":-7,\"_14\":-7,\"_26\":-7,\"_27\":-7,\"_29\":627,\"_17\":628,\"_13\":629,\"_32\":630},{\"_13\":621,\"_21\":38,\"_15\":622,\"_27\":623,\"_24\":-7,\"_9\":624,\"_32\":625},{\"_13\":619,\"_21\":176,\"_24\":-7,\"_15\":620},{\"_13\":614,\"_21\":38,\"_15\":615,\"_27\":616,\"_24\":-7,\"_9\":617,\"_32\":618},{\"_13\":609,\"_21\":38,\"_15\":610,\"_27\":611,\"_24\":-7,\"_9\":612,\"_32\":613},{\"_13\":604,\"_21\":38,\"_15\":605,\"_27\":606,\"_24\":-7,\"_9\":607,\"_32\":608},{\"_13\":599,\"_21\":38,\"_15\":600,\"_27\":601,\"_24\":-7,\"_9\":602,\"_32\":603},{\"_21\":22,\"_15\":547,\"_24\":-7,\"_14\":-7,\"_26\":-7,\"_27\":-7,\"_29\":548,\"_17\":549,\"_13\":550,\"_32\":551},{\"_21\":22,\"_15\":466,\"_24\":-7,\"_14\":-7,\"_26\":-7,\"_27\":-7,\"_29\":467,\"_17\":468,\"_13\":469,\"_32\":470},{\"_13\":464,\"_21\":176,\"_24\":-7,\"_15\":465},{\"_13\":459,\"_21\":38,\"_15\":460,\"_27\":461,\"_24\":-7,\"_9\":462,\"_32\":463},{\"_13\":454,\"_21\":38,\"_15\":455,\"_27\":456,\"_24\":-7,\"_9\":457,\"_32\":458},{\"_21\":22,\"_15\":420,\"_24\":-7,\"_14\":-7,\"_26\":-7,\"_27\":-7,\"_29\":421,\"_17\":422,\"_13\":423,\"_32\":424},{\"_13\":415,\"_21\":38,\"_15\":416,\"_27\":417,\"_24\":-7,\"_9\":418,\"_32\":419},{\"_13\":413,\"_21\":176,\"_24\":-7,\"_15\":414},{\"_13\":408,\"_21\":38,\"_15\":409,\"_27\":410,\"_24\":-7,\"_9\":411,\"_32\":412},{\"_13\":403,\"_21\":38,\"_15\":404,\"_27\":405,\"_24\":-7,\"_9\":406,\"_32\":407},{\"_13\":398,\"_21\":38,\"_15\":399,\"_27\":400,\"_24\":-7,\"_9\":401,\"_32\":402},{\"_13\":393,\"_21\":38,\"_15\":394,\"_27\":395,\"_24\":-7,\"_9\":396,\"_32\":397},{\"_13\":388,\"_21\":38,\"_15\":389,\"_27\":390,\"_24\":-7,\"_9\":391,\"_32\":392},{\"_13\":386,\"_21\":176,\"_24\":-7,\"_15\":387},{\"_13\":381,\"_21\":38,\"_15\":382,\"_27\":383,\"_24\":-7,\"_9\":384,\"_32\":385},{\"_13\":376,\"_21\":38,\"_15\":377,\"_27\":378,\"_24\":-7,\"_9\":379,\"_32\":380},{\"_13\":371,\"_21\":38,\"_15\":372,\"_27\":373,\"_24\":-7,\"_9\":374,\"_32\":375},{\"_13\":366,\"_21\":38,\"_15\":367,\"_27\":368,\"_24\":-7,\"_9\":369,\"_32\":370},{\"_13\":364,\"_21\":176,\"_24\":-7,\"_15\":365},{\"_21\":22,\"_15\":306,\"_24\":-7,\"_14\":-7,\"_26\":-7,\"_27\":-7,\"_29\":307,\"_17\":308,\"_13\":309,\"_32\":310},{\"_21\":22,\"_15\":232,\"_24\":-7,\"_14\":-7,\"_26\":-7,\"_27\":-7,\"_29\":233,\"_17\":234,\"_13\":235,\"_32\":236},{\"_13\":227,\"_21\":38,\"_15\":228,\"_27\":229,\"_24\":-7,\"_9\":230,\"_32\":231},{\"_13\":225,\"_21\":176,\"_24\":-7,\"_15\":226},{\"_13\":220,\"_21\":38,\"_15\":221,\"_27\":222,\"_24\":-7,\"_9\":223,\"_32\":224},{\"_13\":215,\"_21\":38,\"_15\":216,\"_27\":217,\"_24\":-7,\"_9\":218,\"_32\":219},{\"_13\":210,\"_21\":38,\"_15\":211,\"_27\":212,\"_24\":-7,\"_9\":213,\"_32\":214},{\"_13\":208,\"_21\":176,\"_24\":-7,\"_15\":209},{\"_13\":203,\"_21\":38,\"_15\":204,\"_27\":205,\"_24\":-7,\"_9\":206,\"_32\":207},{\"_13\":198,\"_21\":38,\"_15\":199,\"_27\":200,\"_24\":-7,\"_9\":201,\"_32\":202},{\"_13\":193,\"_21\":38,\"_15\":194,\"_27\":195,\"_24\":-7,\"_9\":196,\"_32\":197},{\"_13\":188,\"_21\":38,\"_15\":189,\"_27\":190,\"_24\":-7,\"_9\":191,\"_32\":192},{\"_13\":183,\"_21\":38,\"_15\":184,\"_27\":185,\"_24\":-7,\"_9\":186,\"_32\":187},{\"_13\":178,\"_21\":38,\"_15\":179,\"_27\":180,\"_24\":-7,\"_9\":181,\"_32\":182},{\"_13\":175,\"_21\":176,\"_24\":-7,\"_15\":177},{\"_13\":170,\"_21\":38,\"_15\":171,\"_27\":172,\"_24\":-7,\"_9\":173,\"_32\":174},{\"_13\":165,\"_21\":38,\"_15\":166,\"_27\":167,\"_24\":-7,\"_9\":168,\"_32\":169},{\"_13\":160,\"_21\":38,\"_15\":161,\"_27\":162,\"_24\":-7,\"_9\":163,\"_32\":164},{\"_13\":155,\"_21\":38,\"_15\":156,\"_27\":157,\"_24\":-7,\"_9\":158,\"_32\":159},{\"_13\":150,\"_21\":38,\"_15\":151,\"_27\":152,\"_24\":-7,\"_9\":153,\"_32\":154},{\"_13\":145,\"_21\":38,\"_15\":146,\"_27\":147,\"_24\":-7,\"_9\":148,\"_32\":149},{\"_13\":140,\"_21\":38,\"_15\":141,\"_27\":142,\"_24\":-7,\"_9\":143,\"_32\":144},{\"_13\":135,\"_21\":38,\"_15\":136,\"_27\":137,\"_24\":-7,\"_9\":138,\"_32\":139},{\"_13\":130,\"_21\":38,\"_15\":131,\"_27\":132,\"_24\":-7,\"_9\":133,\"_32\":134},{\"_13\":125,\"_21\":38,\"_15\":126,\"_27\":127,\"_24\":-7,\"_9\":128,\"_32\":129},{\"_13\":120,\"_21\":38,\"_15\":121,\"_27\":122,\"_24\":-7,\"_9\":123,\"_32\":124},{\"_13\":115,\"_21\":38,\"_15\":116,\"_27\":117,\"_24\":-7,\"_9\":118,\"_32\":119},{\"_13\":110,\"_21\":38,\"_15\":111,\"_27\":112,\"_24\":-7,\"_9\":113,\"_32\":114},\"(multi-page)/hbase-incompatibilities.mdx\",\"Known Incompatibilities Among HBase Versions\",\"Comprehensive list of breaking changes and incompatibilities between HBase versions, particularly for HBase 2.0.\",\"/docs/hbase-incompatibilities\",{\"_43\":110},\"(multi-page)/rpc.mdx\",\"0.95 RPC Specification\",\"HBase RPC wire format and client/server protocol specification for version 0.95+.\",\"/docs/rpc\",{\"_43\":115},\"(multi-page)/orca.mdx\",\"Apache HBase Orca\",\"Apache HBase Orca, HBase Colors, \u0026 Font\",\"/docs/orca\",{\"_43\":120},\"(multi-page)/asf.mdx\",\"HBase and the Apache Software Foundation\",\"HBase is a project in the Apache Software Foundation and as such there are responsibilities to the ASF to ensure a healthy project.\",\"/docs/asf\",{\"_43\":125},\"(multi-page)/hbase-history.mdx\",\"HBase History\",\"Timeline of Apache HBase development from its origins in Google's BigTable paper to becoming an Apache top-level project.\",\"/docs/hbase-history\",{\"_43\":130},\"(multi-page)/other-info.mdx\",\"Other Information About HBase\",\"Collection of HBase videos, presentations, papers, books, and useful external resources for learning and understanding HBase.\",\"/docs/other-info\",{\"_43\":135},\"(multi-page)/hfile-format.mdx\",\"HFile Format\",\"This appendix describes the evolution of the HFile format.\",\"/docs/hfile-format\",{\"_43\":140},\"(multi-page)/ycsb.mdx\",\"YCSB\",\"Documentation for YCSB (The Yahoo! Cloud Serving Benchmark)\",\"/docs/ycsb\",{\"_43\":145},\"(multi-page)/sql.mdx\",\"SQL over HBase\",\"The following projects offer some support for SQL over HBase.\",\"/docs/sql\",{\"_43\":150},\"(multi-page)/compression.mdx\",\"Compression and Data Block Encoding In HBase\",\"Comprehensive guide to compression algorithms and data block encoding options in HBase for optimizing storage and performance.\",\"/docs/compression\",{\"_43\":155},\"(multi-page)/acl-matrix.mdx\",\"Access Control Matrix\",\"The following matrix shows the permission set required to perform operations in HBase. Before using the table, read through the information about how to interpret it.\",\"/docs/acl-matrix\",{\"_43\":160},\"(multi-page)/faq.mdx\",\"FAQ\",\"Frequently asked questions about Apache HBase.\",\"/docs/faq\",{\"_43\":165},\"(multi-page)/contributing-to-documentation.mdx\",\"Appendix: Contributing to Documentation\",\"Guide for contributing to Apache HBase documentation, including patch submission procedures, website editing, style guidelines, and best practices.\",\"/docs/contributing-to-documentation\",{\"_43\":170},\"(multi-page)#46\",\"separator\",\"Appendices\",\"(multi-page)/bulk-data-generator-tool.mdx\",\"Bulk Data Generator Tool\",\"This is a random data generator tool for HBase tables leveraging Hbase bulk load. It can create pre-splited HBase table and the generated data is uniformly distributed to all the regions of the table.\",\"/docs/bulk-data-generator-tool\",{\"_43\":178},\"(multi-page)/store-file-tracking.mdx\",\"Store File Tracking\",\"This feature introduces an abstraction layer to track store files still used/needed by store engines, allowing for plugging different approaches of identifying store files required by the given store.\",\"/docs/store-file-tracking\",{\"_43\":183},\"(multi-page)/tracing.mdx\",\"Tracing\",\"HBase used to depend on the HTrace project for tracing. After the Apache HTrace project moved to the Attic/retired, we decided to move to OpenTelemetry in HBASE-22120.\",\"/docs/tracing\",{\"_43\":188},\"(multi-page)/hbtop.mdx\",\"hbtop\",\"hbtop is a real-time monitoring tool for HBase like Unix's top command. It can display summary information as well as metrics per Region/Namespace/Table/RegionServer. In this tool, you can see the metrics sorted by a selected field and filter the metrics to see only metrics you really want to see.\",\"/docs/hbtop\",{\"_43\":193},\"(multi-page)/community.mdx\",\"Community\",\"HBase community decisions, release managers, JIRA policies, commit message format, and guidelines for feature branches.\",\"/docs/community\",{\"_43\":198},\"(multi-page)/zookeeper.mdx\",\"ZooKeeper\",\"A distributed Apache HBase installation depends on a running ZooKeeper cluster. All participating nodes and clients need to be able to access the running ZooKeeper ensemble.\",\"/docs/zookeeper\",{\"_43\":203},\"(multi-page)#39\",\"Infrastructure \u0026 Tools\",\"(multi-page)/amv2.mdx\",\"AMv2 Description for Devs\",\"The AssignmentManager (AM) in HBase Master manages assignment of Regions over a cluster of RegionServers.\",\"/docs/amv2\",{\"_43\":210},\"(multi-page)/pv2.mdx\",\"Procedure Framework (PV2)\",\"Procedure v2 ...aims to provide a unified way to build...multi-step procedures with a rollback/roll-forward ability in case of failure (e.g. create/delete table) — Matteo Bertozzi, the author of Pv2.\",\"/docs/pv2\",{\"_43\":215},\"(multi-page)/protobuf.mdx\",\"Protobuf in HBase\",\"Detailed guide on how HBase uses Protocol Buffers for serialization, RPC interfaces, and coprocessor endpoints, including shading and versioning considerations.\",\"/docs/protobuf\",{\"_43\":220},\"(multi-page)#35\",\"Internals\",\"(multi-page)/unit-testing.mdx\",\"Unit Testing HBase Applications\",\"This chapter discusses unit testing your HBase application using JUnit, Mockito, MRUnit, and HBaseTestingUtility.\",\"/docs/unit-testing\",{\"_43\":227},\"Building and Developing Apache HBase\",{\"_13\":302,\"_21\":38,\"_15\":232,\"_27\":303,\"_24\":-7,\"_9\":304,\"_32\":305},[238,239,240,241,242,243,244,245,246,247,248],\"(multi-page)/building-and-developing\",{\"_34\":237},\"(multi-page)/building-and-developing/meta.json\",{\"_13\":297,\"_21\":38,\"_15\":298,\"_27\":299,\"_24\":-7,\"_9\":300,\"_32\":301},{\"_13\":292,\"_21\":38,\"_15\":293,\"_27\":294,\"_24\":-7,\"_9\":295,\"_32\":296},{\"_13\":287,\"_21\":38,\"_15\":288,\"_27\":289,\"_24\":-7,\"_9\":290,\"_32\":291},{\"_13\":282,\"_21\":38,\"_15\":283,\"_27\":284,\"_24\":-7,\"_9\":285,\"_32\":286},{\"_13\":277,\"_21\":38,\"_15\":278,\"_27\":279,\"_24\":-7,\"_9\":280,\"_32\":281},{\"_13\":272,\"_21\":38,\"_15\":273,\"_27\":274,\"_24\":-7,\"_9\":275,\"_32\":276},{\"_13\":267,\"_21\":38,\"_15\":268,\"_27\":269,\"_24\":-7,\"_9\":270,\"_32\":271},{\"_13\":262,\"_21\":38,\"_15\":263,\"_27\":264,\"_24\":-7,\"_9\":265,\"_32\":266},{\"_13\":257,\"_21\":38,\"_15\":258,\"_27\":259,\"_24\":-7,\"_9\":260,\"_32\":261},{\"_13\":252,\"_21\":38,\"_15\":253,\"_27\":254,\"_24\":-7,\"_9\":255,\"_32\":256},{\"_13\":8,\"_21\":38,\"_15\":249,\"_27\":250,\"_24\":-7,\"_9\":10,\"_32\":251},\"Developer Guidelines\",\"Code standards, interface classifications, formatting conventions, Git best practices, and patch submission guidelines for HBase contributors.\",{\"_43\":8},\"(multi-page)/building-and-developing/tests.mdx\",\"Tests\",\"Writing and running HBase unit tests, integration tests, and ChaosMonkey destructive tests for comprehensive test coverage.\",\"/docs/building-and-developing/tests\",{\"_43\":252},\"(multi-page)/building-and-developing/updating-landing.mdx\",\"Updating hbase.apache.org\",\"Contributing to and publishing the HBase website and documentation using gitpubsub mechanism.\",\"/docs/building-and-developing/updating-landing\",{\"_43\":257},\"(multi-page)/building-and-developing/generating-documentation.mdx\",\"Generating the HBase Reference Guide\",\"Building HBase documentation from MDX markup.\",\"/docs/building-and-developing/generating-documentation\",{\"_43\":262},\"(multi-page)/building-and-developing/announcing.mdx\",\"Announcing Releases\",\"Email template and guidelines for announcing new HBase releases to the community and mailing lists.\",\"/docs/building-and-developing/announcing\",{\"_43\":267},\"(multi-page)/building-and-developing/voting.mdx\",\"Voting on Release Candidates\",\"Baseline and additional verification procedures for voting on HBase release candidates including checksums, signatures, and testing.\",\"/docs/building-and-developing/voting\",{\"_43\":272},\"(multi-page)/building-and-developing/releasing.mdx\",\"Releasing Apache HBase\",\"Complete guide to creating HBase release candidates including building, signing, staging artifacts, and publishing releases.\",\"/docs/building-and-developing/releasing\",{\"_43\":277},\"(multi-page)/building-and-developing/building.mdx\",\"Building Apache HBase\",\"Maven build commands, JDK requirements, Hadoop version selection, and building HBase from source including protobuf and thrift generation.\",\"/docs/building-and-developing/building\",{\"_43\":282},\"(multi-page)/building-and-developing/ides.mdx\",\"IDEs\",\"Setting up Eclipse and IntelliJ IDEA for HBase development including formatters, plugins, and Maven integration.\",\"/docs/building-and-developing/ides\",{\"_43\":287},\"(multi-page)/building-and-developing/repositories.mdx\",\"Apache HBase Repositories\",\"List of Apache HBase Git repositories including main HBase, connectors, operator tools, website, and third-party libraries.\",\"/docs/building-and-developing/repositories\",{\"_43\":292},\"(multi-page)/building-and-developing/getting-involved.mdx\",\"Getting Involved\",\"How to contribute to Apache HBase including mailing lists, Slack, IRC, JIRA, and guidelines for reporting effective issues.\",\"/docs/building-and-developing/getting-involved\",{\"_43\":297},\"(multi-page)/building-and-developing/index.mdx\",\"Comprehensive guide for building, testing, releasing, and contributing to Apache HBase.\",\"/docs/building-and-developing\",{\"_43\":302},\"Apache HBase Operational Management\",{\"_13\":360,\"_21\":38,\"_15\":306,\"_27\":361,\"_24\":-7,\"_9\":362,\"_32\":363},[312,313,314,315,316,317,318,319],\"(multi-page)/operational-management\",{\"_34\":311},\"(multi-page)/operational-management/meta.json\",{\"_13\":355,\"_21\":38,\"_15\":356,\"_27\":357,\"_24\":-7,\"_9\":358,\"_32\":359},{\"_13\":350,\"_21\":38,\"_15\":351,\"_27\":352,\"_24\":-7,\"_9\":353,\"_32\":354},{\"_13\":345,\"_21\":38,\"_15\":346,\"_27\":347,\"_24\":-7,\"_9\":348,\"_32\":349},{\"_13\":340,\"_21\":38,\"_15\":341,\"_27\":342,\"_24\":-7,\"_9\":343,\"_32\":344},{\"_13\":335,\"_21\":38,\"_15\":336,\"_27\":337,\"_24\":-7,\"_9\":338,\"_32\":339},{\"_13\":330,\"_21\":38,\"_15\":331,\"_27\":332,\"_24\":-7,\"_9\":333,\"_32\":334},{\"_13\":325,\"_21\":38,\"_15\":326,\"_27\":327,\"_24\":-7,\"_9\":328,\"_32\":329},{\"_13\":320,\"_21\":38,\"_15\":321,\"_27\":322,\"_24\":-7,\"_9\":323,\"_32\":324},\"(multi-page)/operational-management/region-and-capacity.mdx\",\"Region \u0026 Capacity Management\",\"Managing HBase regions including compaction, splits, merges, capacity planning, RegionServer grouping, and region normalization.\",\"/docs/operational-management/region-and-capacity\",{\"_43\":320},\"(multi-page)/operational-management/table-rename.mdx\",\"Table Rename\",\"How to rename HBase tables using snapshots without downtime or data loss.\",\"/docs/operational-management/table-rename\",{\"_43\":325},\"(multi-page)/operational-management/backup-and-snapshots.mdx\",\"Backup \u0026 Snapshots\",\"HBase backup strategies and snapshot operations for data protection, including full cluster backups and live cluster snapshots.\",\"/docs/operational-management/backup-and-snapshots\",{\"_43\":330},\"(multi-page)/operational-management/running-multiple-workloads-on-a-single-cluster.mdx\",\"Running Multiple Workloads On a Single Cluster\",\"Managing multiple workloads on HBase clusters using quotas, request queues, and priority mechanisms for resource allocation.\",\"/docs/operational-management/running-multiple-workloads-on-a-single-cluster\",{\"_43\":335},\"(multi-page)/operational-management/cluster-replication.mdx\",\"Cluster Replication\",\"Setting up and managing HBase cluster replication for disaster recovery, data aggregation, and geographic distribution of data.\",\"/docs/operational-management/cluster-replication\",{\"_43\":340},\"(multi-page)/operational-management/metrics-and-monitoring.mdx\",\"Metrics \u0026 Monitoring\",\"HBase metrics system configuration, JMX monitoring, master and RegionServer metrics, and integration with monitoring tools.\",\"/docs/operational-management/metrics-and-monitoring\",{\"_43\":345},\"(multi-page)/operational-management/node.mdx\",\"Node Management\",\"Managing HBase cluster nodes including decommissioning RegionServers, rolling restarts, and draining regions for maintenance.\",\"/docs/operational-management/node\",{\"_43\":350},\"(multi-page)/operational-management/tools.mdx\",\"HBase Tools and Utilities\",\"Command-line tools for HBase administration, analysis, and debugging including canary, HBCK2, WAL tools, and MapReduce utilities.\",\"/docs/operational-management/tools\",{\"_43\":355},\"(multi-page)/operational-management/index.mdx\",\"This chapter will cover operational tools and practices required of a running Apache HBase cluster.\",\"/docs/operational-management\",{\"_43\":360},\"(multi-page)#31\",\"Operations \u0026 Development\",\"(multi-page)/case-studies.mdx\",\"Apache HBase Case Studies\",\"Performance and troubleshooting case studies for diagnosing Apache HBase cluster issues.\",\"/docs/case-studies\",{\"_43\":366},\"(multi-page)/troubleshooting.mdx\",\"Troubleshooting and Debugging Apache HBase\",\"Comprehensive guide to troubleshooting and debugging HBase issues including logs, tools, common problems, and solutions.\",\"/docs/troubleshooting\",{\"_43\":371},\"(multi-page)/profiler.mdx\",\"Profiler Servlet\",\"Integrated, on-demand profiling via the Async Profiler project.\",\"/docs/profiler\",{\"_43\":376},\"(multi-page)/performance.mdx\",\"Apache HBase Performance Tuning\",\"Comprehensive performance tuning guide covering OS configuration, network optimization, JVM tuning, schema design, read/write patterns, and HDFS optimization for HBase clusters.\",\"/docs/performance\",{\"_43\":381},\"(multi-page)#26\",\"Performance \u0026 Troubleshooting\",\"(multi-page)/cp.mdx\",\"Apache HBase Coprocessors\",\"The coprocessor framework provides mechanisms for running your custom code directly on the RegionServers managing your data.\",\"/docs/cp\",{\"_43\":388},\"(multi-page)/spark.mdx\",\"HBase and Spark\",\"Apache Spark is a software framework that is used to process data in memory in a distributed manner, and is replacing MapReduce in many use cases.\",\"/docs/spark\",{\"_43\":393},\"(multi-page)/thrift-filter-language.mdx\",\"Thrift API and Filter Language\",\"Apache Thrift is a cross-platform, cross-language development framework. HBase includes a Thrift API and filter language. The Thrift API relies on client and server processes.\",\"/docs/thrift-filter-language\",{\"_43\":398},\"(multi-page)/external-apis.mdx\",\"Apache HBase External APIs\",\"This chapter will cover access to Apache HBase either through non-Java languages and through custom protocols.\",\"/docs/external-apis\",{\"_43\":403},\"(multi-page)/hbase-apis.mdx\",\"Apache HBase APIs\",\"This chapter provides information about performing operations using HBase native APIs.\",\"/docs/hbase-apis\",{\"_43\":408},\"(multi-page)#20\",\"APIs \u0026 Integration\",\"(multi-page)/sync-replication.mdx\",\"Synchronous Replication\",\"Setting up synchronous replication between HBase clusters for strong consistency and automatic failover capabilities.\",\"/docs/sync-replication\",{\"_43\":415},\"Backup and Restore\",{\"_13\":450,\"_21\":38,\"_15\":420,\"_27\":451,\"_24\":-7,\"_9\":452,\"_32\":453},[426,427,428,429],\"(multi-page)/backup-restore\",{\"_34\":425},\"(multi-page)/backup-restore/meta.json\",{\"_13\":445,\"_21\":38,\"_15\":446,\"_27\":447,\"_24\":-7,\"_9\":448,\"_32\":449},{\"_13\":440,\"_21\":38,\"_15\":441,\"_27\":442,\"_24\":-7,\"_9\":443,\"_32\":444},{\"_13\":435,\"_21\":38,\"_15\":436,\"_27\":437,\"_24\":-7,\"_9\":438,\"_32\":439},{\"_13\":430,\"_21\":38,\"_15\":431,\"_27\":432,\"_24\":-7,\"_9\":433,\"_32\":434},\"(multi-page)/backup-restore/additional-topics.mdx\",\"Additional Topics\",\"Configuration keys, security considerations, and best practices for HBase backup and restore operations.\",\"/docs/backup-restore/additional-topics\",{\"_43\":430},\"(multi-page)/backup-restore/administration.mdx\",\"Administration of Backup Images\",\"Managing HBase backup images including listing, describing, deleting, and merging backup sets for efficient storage.\",\"/docs/backup-restore/administration\",{\"_43\":435},\"(multi-page)/backup-restore/commands.mdx\",\"Backup and Restore commands\",\"Command-line utilities for creating, restoring, and merging HBase backups including full and incremental backup operations.\",\"/docs/backup-restore/commands\",{\"_43\":440},\"(multi-page)/backup-restore/overview.mdx\",\"Overview\",\"Introduction to HBase backup and restore feature, including full and incremental backups for disaster recovery and point-in-time recovery.\",\"/docs/backup-restore/overview\",{\"_43\":445},\"(multi-page)/backup-restore/index.mdx\",\"Comprehensive guide to HBase backup and restore capabilities for data protection, disaster recovery, and point-in-time recovery.\",\"/docs/backup-restore\",{\"_43\":450},\"(multi-page)/offheap-read-write.mdx\",\"RegionServer Off-Heap Read/Write Path\",\"Using off-heap memory for HBase read and write paths to reduce GC pressure and improve P99/P999 RPC latencies.\",\"/docs/offheap-read-write\",{\"_43\":454},\"(multi-page)/inmemory-compaction.mdx\",\"In-memory Compaction\",\"Accordion feature that applies LSM compaction to MemStore while data is in RAM, reducing write amplification and improving performance.\",\"/docs/inmemory-compaction\",{\"_43\":459},\"(multi-page)#15\",\"Advanced Features\",\"Architecture\",{\"_13\":543,\"_21\":38,\"_15\":466,\"_27\":544,\"_24\":-7,\"_9\":545,\"_32\":546},[472,473,474,475,476,477,478,479,480,481,482,483],\"(multi-page)/architecture\",{\"_34\":471},\"(multi-page)/architecture/meta.json\",{\"_13\":539,\"_21\":38,\"_15\":446,\"_27\":540,\"_24\":-7,\"_9\":541,\"_32\":542},{\"_13\":534,\"_21\":38,\"_15\":535,\"_27\":536,\"_24\":-7,\"_9\":537,\"_32\":538},{\"_13\":529,\"_21\":38,\"_15\":530,\"_27\":531,\"_24\":-7,\"_9\":532,\"_32\":533},{\"_13\":524,\"_21\":38,\"_15\":525,\"_27\":526,\"_24\":-7,\"_9\":527,\"_32\":528},{\"_13\":519,\"_21\":38,\"_15\":520,\"_27\":521,\"_24\":-7,\"_9\":522,\"_32\":523},{\"_13\":514,\"_21\":38,\"_15\":515,\"_27\":516,\"_24\":-7,\"_9\":517,\"_32\":518},{\"_13\":509,\"_21\":38,\"_15\":510,\"_27\":511,\"_24\":-7,\"_9\":512,\"_32\":513},{\"_13\":504,\"_21\":38,\"_15\":505,\"_27\":506,\"_24\":-7,\"_9\":507,\"_32\":508},{\"_13\":499,\"_21\":38,\"_15\":500,\"_27\":501,\"_24\":-7,\"_9\":502,\"_32\":503},{\"_13\":494,\"_21\":38,\"_15\":495,\"_27\":496,\"_24\":-7,\"_9\":497,\"_32\":498},{\"_13\":489,\"_21\":38,\"_15\":490,\"_27\":491,\"_24\":-7,\"_9\":492,\"_32\":493},{\"_13\":484,\"_21\":38,\"_15\":485,\"_27\":486,\"_24\":-7,\"_9\":487,\"_32\":488},\"(multi-page)/architecture/snapshot-scanner.mdx\",\"Scan Over Snapshot\",\"Using TableSnapshotScanner to scan HBase snapshots directly from HDFS, bypassing RegionServers for better performance.\",\"/docs/architecture/snapshot-scanner\",{\"_43\":484},\"(multi-page)/architecture/hbase-mob.mdx\",\"Storing Medium-sized Objects (MOB)\",\"Optimized storage and handling of medium-sized objects (100KB-10MB) in HBase using the MOB feature for improved performance.\",\"/docs/architecture/hbase-mob\",{\"_43\":489},\"(multi-page)/architecture/timeline-consistent-reads.mdx\",\"Timeline-consistent High Available Reads\",\"Using region replicas to achieve high availability for reads with timeline consistency, reducing read unavailability during failures.\",\"/docs/architecture/timeline-consistent-reads\",{\"_43\":494},\"(multi-page)/architecture/hdfs.mdx\",\"HDFS\",\"How HBase leverages HDFS for distributed storage, including NameNode and DataNode architecture and file replication.\",\"/docs/architecture/hdfs\",{\"_43\":499},\"(multi-page)/architecture/bulk-loading.mdx\",\"Bulk Loading\",\"Efficient methods for loading large datasets into HBase using MapReduce to generate HFiles and directly load them into the cluster.\",\"/docs/architecture/bulk-loading\",{\"_43\":504},\"(multi-page)/architecture/regions.mdx\",\"Regions\",\"Understanding HBase regions, stores, memstore, write-ahead log (WAL), compaction, splits, and region management strategies.\",\"/docs/architecture/regions\",{\"_43\":509},\"(multi-page)/architecture/regionserver.mdx\",\"RegionServer\",\"HBase RegionServer implementation, interfaces, read/write paths, block cache, memstore management, and performance tuning.\",\"/docs/architecture/regionserver\",{\"_43\":514},\"(multi-page)/architecture/master.mdx\",\"Master\",\"HBase Master server responsibilities including RegionServer monitoring, metadata operations, load balancing, and failover behavior.\",\"/docs/architecture/master\",{\"_43\":519},\"(multi-page)/architecture/client-request-filters.mdx\",\"Client Request Filters\",\"Using filters with Get and Scan operations to efficiently query HBase data, including comparison, column, row, and utility filters.\",\"/docs/architecture/client-request-filters\",{\"_43\":524},\"(multi-page)/architecture/client.mdx\",\"Client\",\"HBase client architecture, connection management, metadata caching, and client-side configuration for optimal performance.\",\"/docs/architecture/client\",{\"_43\":529},\"(multi-page)/architecture/catalog-tables.mdx\",\"Catalog Tables\",\"Understanding hbase:meta catalog table structure, location tracking, and how HBase maintains region metadata.\",\"/docs/architecture/catalog-tables\",{\"_43\":534},\"(multi-page)/architecture/overview.mdx\",\"Introduction to HBase as a NoSQL distributed database, key features, scalability characteristics, and when to use HBase.\",\"/docs/architecture/overview\",{\"_43\":539},\"(multi-page)/architecture/index.mdx\",\"Comprehensive guide to HBase architecture including client-server model, regions, WAL, compaction, and advanced features.\",\"/docs/architecture\",{\"_43\":543},\"Security\",{\"_13\":595,\"_21\":38,\"_15\":547,\"_27\":596,\"_24\":-7,\"_9\":597,\"_32\":598},[553,554,555,556,557,558,559],\"(multi-page)/security\",{\"_34\":552},\"(multi-page)/security/meta.json\",{\"_13\":590,\"_21\":38,\"_15\":591,\"_27\":592,\"_24\":-7,\"_9\":593,\"_32\":594},{\"_13\":585,\"_21\":38,\"_15\":586,\"_27\":587,\"_24\":-7,\"_9\":588,\"_32\":589},{\"_13\":580,\"_21\":38,\"_15\":581,\"_27\":582,\"_24\":-7,\"_9\":583,\"_32\":584},{\"_13\":575,\"_21\":38,\"_15\":576,\"_27\":577,\"_24\":-7,\"_9\":578,\"_32\":579},{\"_13\":570,\"_21\":38,\"_15\":571,\"_27\":572,\"_24\":-7,\"_9\":573,\"_32\":574},{\"_13\":565,\"_21\":38,\"_15\":566,\"_27\":567,\"_24\":-7,\"_9\":568,\"_32\":569},{\"_13\":560,\"_21\":38,\"_15\":561,\"_27\":562,\"_24\":-7,\"_9\":563,\"_32\":564},\"(multi-page)/security/example.mdx\",\"Security Configuration Example\",\"This configuration example includes support for HFile v3, ACLs, Visibility Labels, and transparent encryption of data at rest and the WAL. All options have been discussed separately in the sections above.\",\"/docs/security/example\",{\"_43\":560},\"(multi-page)/security/data-access.mdx\",\"Securing Access To Your Data\",\"Role-based access control (RBAC), visibility labels, and data encryption strategies for securing HBase data at rest and in transit.\",\"/docs/security/data-access\",{\"_43\":565},\"(multi-page)/security/hdfs-and-zookeeper-access.mdx\",\"Securing Access to HDFS and ZooKeeper\",\"Secure HBase requires secure ZooKeeper and HDFS so that users cannot access and/or modify the metadata and data from under HBase. HBase uses HDFS (or configured file system) to keep its data files as well as write ahead logs (WALs) and other data. HBase uses ZooKeeper to store some metadata for operations (master address, table locks, recovery state, etc).\",\"/docs/security/hdfs-and-zookeeper-access\",{\"_43\":570},\"(multi-page)/security/tls.mdx\",\"Transport Level Security (TLS) in HBase RPC communication\",\"Configuring TLS encryption for secure HBase client-server and Master-RegionServer communication without downtime.\",\"/docs/security/tls\",{\"_43\":575},\"(multi-page)/security/user-access.mdx\",\"Simple User Access to Apache HBase\",\"Setting up simple SASL authentication for HBase clients without Kerberos, using username/password-based access control.\",\"/docs/security/user-access\",{\"_43\":580},\"(multi-page)/security/client-access.mdx\",\"Secure Client Access to Apache HBase\",\"Configuring Kerberos-based secure authentication for HBase clients, including server and client setup procedures.\",\"/docs/security/client-access\",{\"_43\":585},\"(multi-page)/security/web-ui.mdx\",\"Web UI Security\",\"HBase provides mechanisms to secure various components and aspects of HBase and how it relates to the rest of the Hadoop infrastructure, as well as clients and resources outside Hadoop.\",\"/docs/security/web-ui\",{\"_43\":590},\"(multi-page)/security/index.mdx\",\"Comprehensive guide to securing Apache HBase, including authentication, authorization, encryption, and access control mechanisms.\",\"/docs/security\",{\"_43\":595},\"(multi-page)/mapreduce.mdx\",\"HBase and MapReduce\",\"Guide to using Apache HBase with MapReduce including configuration, examples, and best practices.\",\"/docs/mapreduce\",{\"_43\":599},\"(multi-page)/regionserver-sizing.mdx\",\"RegionServer Sizing Rules of Thumb\",\"Memory sizing guidelines, rowkey design patterns, schema case studies, and performance optimization tips for HBase RegionServers.\",\"/docs/regionserver-sizing\",{\"_43\":604},\"(multi-page)/schema-design.mdx\",\"HBase and Schema Design\",\"Comprehensive guide to designing HBase schemas, including table and column family design, rowkey strategies, and best practices for optimal performance.\",\"/docs/schema-design\",{\"_43\":609},\"(multi-page)/datamodel.mdx\",\"Data Model\",\"In HBase, data is stored in tables, which have rows and columns. This is a terminology overlap with relational databases (RDBMSs), but this is not a helpful analogy. Instead, it can be helpful to think of an HBase table as a multi-dimensional map.\",\"/docs/datamodel\",{\"_43\":614},\"(multi-page)#8\",\"Core Concepts\",\"(multi-page)/shell.mdx\",\"The Apache HBase Shell\",\"Guide to using the HBase Shell including scripting, tricks, and advanced features.\",\"/docs/shell\",{\"_43\":621},\"Upgrading\",{\"_13\":656,\"_21\":38,\"_15\":626,\"_27\":657,\"_24\":-7,\"_9\":658,\"_32\":659},[632,633,634,635],\"(multi-page)/upgrading\",{\"_34\":631},\"(multi-page)/upgrading/meta.json\",{\"_13\":651,\"_21\":38,\"_15\":652,\"_27\":653,\"_24\":-7,\"_9\":654,\"_32\":655},{\"_13\":646,\"_21\":38,\"_15\":647,\"_27\":648,\"_24\":-7,\"_9\":649,\"_32\":650},{\"_13\":641,\"_21\":38,\"_15\":642,\"_27\":643,\"_24\":-7,\"_9\":644,\"_32\":645},{\"_13\":636,\"_21\":38,\"_15\":637,\"_27\":638,\"_24\":-7,\"_9\":639,\"_32\":640},\"(multi-page)/upgrading/paths.mdx\",\"Upgrade Paths\",\"Detailed upgrade paths and compatibility considerations when upgrading between HBase major versions (2.x to 3.x, 1.x to 2.x, etc.).\",\"/docs/upgrading/paths\",{\"_43\":636},\"(multi-page)/upgrading/rollback.mdx\",\"Rollback\",\"How to rollback an HBase upgrade to restore the cluster to a previous version, including backup procedures and data recovery steps.\",\"/docs/upgrading/rollback\",{\"_43\":641},\"(multi-page)/upgrading/rolling.mdx\",\"Rolling Upgrades\",\"How to perform rolling upgrades across HBase versions that are binary or wire compatible without cluster downtime.\",\"/docs/upgrading/rolling\",{\"_43\":646},\"(multi-page)/upgrading/version-number.mdx\",\"HBase version number and compatibility\",\"Understanding HBase semantic versioning scheme and compatibility guarantees across major, minor, and patch versions.\",\"/docs/upgrading/version-number\",{\"_43\":651},\"(multi-page)/upgrading/index.mdx\",\"Guide to upgrading Apache HBase between major versions, including requirements, compatibility considerations, and step-by-step procedures.\",\"/docs/upgrading\",{\"_43\":656},\"Configuration\",{\"_13\":708,\"_21\":38,\"_15\":660,\"_27\":709,\"_24\":-7,\"_9\":710,\"_32\":711},[666,667,668,669,670,671,672],\"(multi-page)/configuration\",{\"_34\":665},\"(multi-page)/configuration/meta.json\",{\"_13\":703,\"_21\":38,\"_15\":704,\"_27\":705,\"_24\":-7,\"_9\":706,\"_32\":707},{\"_13\":698,\"_21\":38,\"_15\":699,\"_27\":700,\"_24\":-7,\"_9\":701,\"_32\":702},{\"_13\":693,\"_21\":38,\"_15\":694,\"_27\":695,\"_24\":-7,\"_9\":696,\"_32\":697},{\"_13\":688,\"_21\":38,\"_15\":689,\"_27\":690,\"_24\":-7,\"_9\":691,\"_32\":692},{\"_13\":683,\"_21\":38,\"_15\":684,\"_27\":685,\"_24\":-7,\"_9\":686,\"_32\":687},{\"_13\":678,\"_21\":38,\"_15\":679,\"_27\":680,\"_24\":-7,\"_9\":681,\"_32\":682},{\"_13\":673,\"_21\":38,\"_15\":674,\"_27\":675,\"_24\":-7,\"_9\":676,\"_32\":677},\"(multi-page)/configuration/dynamic.mdx\",\"Dynamic Configuration\",\"How to change HBase configuration properties dynamically without server restart using update_config commands.\",\"/docs/configuration/dynamic\",{\"_43\":673},\"(multi-page)/configuration/important.mdx\",\"The Important Configurations\",\"Critical HBase configurations divided into required settings and recommended optimizations for production clusters.\",\"/docs/configuration/important\",{\"_43\":678},\"(multi-page)/configuration/example.mdx\",\"Example Configurations\",\"Sample configuration files and setup examples for distributed HBase clusters.\",\"/docs/configuration/example\",{\"_43\":683},\"(multi-page)/configuration/default.mdx\",\"Default Configuration\",\"HBase default configuration properties and how to customize them via hbase-site.xml for site-specific settings.\",\"/docs/configuration/default\",{\"_43\":688},\"(multi-page)/configuration/confirm.mdx\",\"Running and Confirming Your Installation\",\"Steps to start HBase services and verify your installation is working correctly.\",\"/docs/configuration/confirm\",{\"_43\":693},\"(multi-page)/configuration/hbase-run-models.mdx\",\"HBase run modes: Standalone and Distributed\",\"Understanding HBase deployment modes: standalone mode for development and distributed mode for production clusters.\",\"/docs/configuration/hbase-run-models\",{\"_43\":698},\"(multi-page)/configuration/basic-prerequisites.mdx\",\"Basic Prerequisites\",\"This section lists required services and some required system configuration.\",\"/docs/configuration/basic-prerequisites\",{\"_43\":703},\"(multi-page)/configuration/index.mdx\",\"Complete guide to HBase configuration including all settings, tuning parameters, and best practices.\",\"/docs/configuration\",{\"_43\":708},\"(multi-page)#4\",\"Configuration \u0026 Setup\",\"All docs for LLMs\",\"/llms-full.txt\",\"external\",\"(multi-page)/getting-started.mdx\",\"Getting Started\",\"Quick start to get you up and run a single-node, standalone instance of HBase.\",\"/docs/getting-started\",{\"_43\":717},\"(multi-page)/index.mdx\",\"Preface\",\"This is the official reference guide for the HBase version it ships with.\",\"/docs\",{\"_43\":722},\"(multi-page)#0\"]\n");</script><!--$--><script>window.__reactRouterContext.streamController.close();</script><!--/$--><!--/$--></body></html>