blob: 560c2e269a19b61f1a69015ed3fd96b6f88a200f [file]
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Java Driver for Apache Cassandra® Documentation">
<link rel="canonical" href="https://apache.github.io/cassandra-java-driver/developer/admin/">
<link rel="prev" href="../request_execution/">
<link rel="next" href="../../osgi/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.17">
<title>Admin - Java Driver for Apache Cassandra</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.7e37652d.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#administrative-tasks" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Java Driver for Apache Cassandra" class="md-header__button md-logo" aria-label="Java Driver for Apache Cassandra" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Java Driver for Apache Cassandra
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Admin
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_0">
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/apache/cassandra-java-driver" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
apache/cassandra-java-driver
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../HOME-README/" class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../.." class="md-tabs__link">
Manual
</a>
</li>
<li class="md-tabs__item">
<a href="../../api/" class="md-tabs__link">
API References
</a>
</li>
<li class="md-tabs__item">
<a href="../../faq-README/" class="md-tabs__link">
FAQ
</a>
</li>
<li class="md-tabs__item">
<a href="../../changelog-README/" class="md-tabs__link">
Changelog
</a>
</li>
<li class="md-tabs__item">
<a href="../../upgrade-README/" class="md-tabs__link">
Upgrade Guide
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Java Driver for Apache Cassandra" class="md-nav__button md-logo" aria-label="Java Driver for Apache Cassandra" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Java Driver for Apache Cassandra
</label>
<div class="md-nav__source">
<a href="https://github.com/apache/cassandra-java-driver" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
apache/cassandra-java-driver
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../HOME-README/" class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-ellipsis">
Manual
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Manual
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../api_conventions/" class="md-nav__link">
<span class="md-ellipsis">
API Conventions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../case_sensitivity/" class="md-nav__link">
<span class="md-ellipsis">
Case Sensitivity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cloud/" class="md-nav__link">
<span class="md-ellipsis">
Cloud
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5" >
<label class="md-nav__link" for="__nav_2_5" id="__nav_2_5_label" tabindex="">
<span class="md-ellipsis">
Core
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5">
<span class="md-nav__icon md-icon"></span>
Core
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../core/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/integration/" class="md-nav__link">
<span class="md-ellipsis">
Integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/configuration/" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/authentication/" class="md-nav__link">
<span class="md-ellipsis">
Authentication
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/ssl/" class="md-nav__link">
<span class="md-ellipsis">
SSL
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/load_balancing/" class="md-nav__link">
<span class="md-ellipsis">
Load Balancing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/pooling/" class="md-nav__link">
<span class="md-ellipsis">
Pooling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/reconnection/" class="md-nav__link">
<span class="md-ellipsis">
Reconnection
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/retries/" class="md-nav__link">
<span class="md-ellipsis">
Retries
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/speculative_execution/" class="md-nav__link">
<span class="md-ellipsis">
Speculative Execution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/metrics/" class="md-nav__link">
<span class="md-ellipsis">
Metrics
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/logging/" class="md-nav__link">
<span class="md-ellipsis">
Logging
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_13" >
<label class="md-nav__link" for="__nav_2_5_13" id="__nav_2_5_13_label" tabindex="0">
<span class="md-ellipsis">
Statements
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5_13">
<span class="md-nav__icon md-icon"></span>
Statements
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../core/statements/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/statements/batch/" class="md-nav__link">
<span class="md-ellipsis">
Batch
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/statements/per_query_keyspace/" class="md-nav__link">
<span class="md-ellipsis">
Per Query Keyspace
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/statements/prepared/" class="md-nav__link">
<span class="md-ellipsis">
Prepared
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/statements/simple/" class="md-nav__link">
<span class="md-ellipsis">
Simple
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../core/paging/" class="md-nav__link">
<span class="md-ellipsis">
Paging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/async/" class="md-nav__link">
<span class="md-ellipsis">
Async Programming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/reactive/" class="md-nav__link">
<span class="md-ellipsis">
Reactive Streams
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/custom_codecs/" class="md-nav__link">
<span class="md-ellipsis">
Custom Codecs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/temporal_types/" class="md-nav__link">
<span class="md-ellipsis">
Temporal Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/tuples/" class="md-nav__link">
<span class="md-ellipsis">
Tuples
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/udts/" class="md-nav__link">
<span class="md-ellipsis">
UDTs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/compression/" class="md-nav__link">
<span class="md-ellipsis">
Compression
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/address_resolution/" class="md-nav__link">
<span class="md-ellipsis">
Address Resolution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/request_tracker/" class="md-nav__link">
<span class="md-ellipsis">
Request Tracker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/throttling/" class="md-nav__link">
<span class="md-ellipsis">
Throttling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/tracing/" class="md-nav__link">
<span class="md-ellipsis">
Tracing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/performance/" class="md-nav__link">
<span class="md-ellipsis">
Performance
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_27" >
<label class="md-nav__link" for="__nav_2_5_27" id="__nav_2_5_27_label" tabindex="0">
<span class="md-ellipsis">
Metadata
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_27_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5_27">
<span class="md-nav__icon md-icon"></span>
Metadata
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../core/metadata/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/metadata/node/" class="md-nav__link">
<span class="md-ellipsis">
Node
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/metadata/schema/" class="md-nav__link">
<span class="md-ellipsis">
Schema
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/metadata/token/" class="md-nav__link">
<span class="md-ellipsis">
Token
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../core/control_connection/" class="md-nav__link">
<span class="md-ellipsis">
Control Connection
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/native_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Native Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/non_blocking/" class="md-nav__link">
<span class="md-ellipsis">
Non-blocking
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/query_timestamps/" class="md-nav__link">
<span class="md-ellipsis">
Query Timestamps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/idempotence/" class="md-nav__link">
<span class="md-ellipsis">
Idempotence
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/detachable_types/" class="md-nav__link">
<span class="md-ellipsis">
Detachable Types
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_34" >
<label class="md-nav__link" for="__nav_2_5_34" id="__nav_2_5_34_label" tabindex="0">
<span class="md-ellipsis">
DSE
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_34_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5_34">
<span class="md-nav__icon md-icon"></span>
DSE
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../core/dse/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/dse/geotypes/" class="md-nav__link">
<span class="md-ellipsis">
Geotypes
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_34_3" >
<label class="md-nav__link" for="__nav_2_5_34_3" id="__nav_2_5_34_3_label" tabindex="0">
<span class="md-ellipsis">
Graph
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="4" aria-labelledby="__nav_2_5_34_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5_34_3">
<span class="md-nav__icon md-icon"></span>
Graph
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../core/dse/graph/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_34_3_2" >
<label class="md-nav__link" for="__nav_2_5_34_3_2" id="__nav_2_5_34_3_2_label" tabindex="0">
<span class="md-ellipsis">
Fluent
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="5" aria-labelledby="__nav_2_5_34_3_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5_34_3_2">
<span class="md-nav__icon md-icon"></span>
Fluent
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../core/dse/graph/fluent/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/dse/graph/fluent/explicit/" class="md-nav__link">
<span class="md-ellipsis">
Explicit
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/dse/graph/fluent/implicit/" class="md-nav__link">
<span class="md-ellipsis">
Implicit
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../core/dse/graph/options/" class="md-nav__link">
<span class="md-ellipsis">
Options
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/dse/graph/results/" class="md-nav__link">
<span class="md-ellipsis">
Results
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/dse/graph/script/" class="md-nav__link">
<span class="md-ellipsis">
Script
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../core/graalvm/" class="md-nav__link">
<span class="md-ellipsis">
GraalVM
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/shaded_jar/" class="md-nav__link">
<span class="md-ellipsis">
Shaded JAR
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../core/bom/" class="md-nav__link">
<span class="md-ellipsis">
BOM
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_6" >
<label class="md-nav__link" for="__nav_2_6" id="__nav_2_6_label" tabindex="">
<span class="md-ellipsis">
Query Builder
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_6">
<span class="md-nav__icon md-icon"></span>
Query Builder
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../query_builder/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/select/" class="md-nav__link">
<span class="md-ellipsis">
Select
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/insert/" class="md-nav__link">
<span class="md-ellipsis">
Insert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/update/" class="md-nav__link">
<span class="md-ellipsis">
Update
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/delete/" class="md-nav__link">
<span class="md-ellipsis">
Delete
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_6_6" >
<label class="md-nav__link" for="__nav_2_6_6" id="__nav_2_6_6_label" tabindex="0">
<span class="md-ellipsis">
Schema
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_6_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_6_6">
<span class="md-nav__icon md-icon"></span>
Schema
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../query_builder/schema/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/aggregate/" class="md-nav__link">
<span class="md-ellipsis">
Aggregate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/function/" class="md-nav__link">
<span class="md-ellipsis">
Function
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/index/" class="md-nav__link">
<span class="md-ellipsis">
Index
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/keyspace/" class="md-nav__link">
<span class="md-ellipsis">
Keyspace
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/materialized_view/" class="md-nav__link">
<span class="md-ellipsis">
Materialized View
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/table/" class="md-nav__link">
<span class="md-ellipsis">
Table
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/schema/type/" class="md-nav__link">
<span class="md-ellipsis">
Type
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../query_builder/truncate/" class="md-nav__link">
<span class="md-ellipsis">
Truncate
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/condition/" class="md-nav__link">
<span class="md-ellipsis">
Condition
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/relation/" class="md-nav__link">
<span class="md-ellipsis">
Relation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/term/" class="md-nav__link">
<span class="md-ellipsis">
Term
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../query_builder/idempotence/" class="md-nav__link">
<span class="md-ellipsis">
Idempotence
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_7" >
<label class="md-nav__link" for="__nav_2_7" id="__nav_2_7_label" tabindex="">
<span class="md-ellipsis">
Mapper
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_7">
<span class="md-nav__icon md-icon"></span>
Mapper
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mapper/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/entities/" class="md-nav__link">
<span class="md-ellipsis">
Entities
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_7_3" >
<label class="md-nav__link" for="__nav_2_7_3" id="__nav_2_7_3_label" tabindex="0">
<span class="md-ellipsis">
DAOs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_7_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_7_3">
<span class="md-nav__icon md-icon"></span>
DAOs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mapper/daos/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/custom_types/" class="md-nav__link">
<span class="md-ellipsis">
Custom Types
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/delete/" class="md-nav__link">
<span class="md-ellipsis">
Delete
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/getentity/" class="md-nav__link">
<span class="md-ellipsis">
Get Entity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/increment/" class="md-nav__link">
<span class="md-ellipsis">
Increment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/insert/" class="md-nav__link">
<span class="md-ellipsis">
Insert
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/null_saving/" class="md-nav__link">
<span class="md-ellipsis">
Null Saving
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/query/" class="md-nav__link">
<span class="md-ellipsis">
Query
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/queryprovider/" class="md-nav__link">
<span class="md-ellipsis">
Query Provider
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/select/" class="md-nav__link">
<span class="md-ellipsis">
Select
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/setentity/" class="md-nav__link">
<span class="md-ellipsis">
Set Entity
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/statement_attributes/" class="md-nav__link">
<span class="md-ellipsis">
Statement Attributes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/daos/update/" class="md-nav__link">
<span class="md-ellipsis">
Update
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../mapper/mapper/" class="md-nav__link">
<span class="md-ellipsis">
Mapper
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_7_5" >
<label class="md-nav__link" for="__nav_2_7_5" id="__nav_2_7_5_label" tabindex="0">
<span class="md-ellipsis">
Configuration
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_7_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_7_5">
<span class="md-nav__icon md-icon"></span>
Configuration
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mapper/config/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/config/kotlin/" class="md-nav__link">
<span class="md-ellipsis">
Kotlin
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/config/lombok/" class="md-nav__link">
<span class="md-ellipsis">
Lombok
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/config/record/" class="md-nav__link">
<span class="md-ellipsis">
Record
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mapper/config/scala/" class="md-nav__link">
<span class="md-ellipsis">
Scala
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8" checked>
<label class="md-nav__link" for="__nav_2_8" id="__nav_2_8_label" tabindex="">
<span class="md-ellipsis">
Developer
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_8_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2_8">
<span class="md-nav__icon md-icon"></span>
Developer
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_2" >
<label class="md-nav__link" for="__nav_2_8_2" id="__nav_2_8_2_label" tabindex="0">
<span class="md-ellipsis">
Common
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_8_2">
<span class="md-nav__icon md-icon"></span>
Common
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../common/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../common/concurrency/" class="md-nav__link">
<span class="md-ellipsis">
Concurrency
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../common/context/" class="md-nav__link">
<span class="md-ellipsis">
Context
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../common/event_bus/" class="md-nav__link">
<span class="md-ellipsis">
Event Bus
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../native_protocol/" class="md-nav__link">
<span class="md-ellipsis">
Native Protocol
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../netty_pipeline/" class="md-nav__link">
<span class="md-ellipsis">
Netty Pipeline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../request_execution/" class="md-nav__link">
<span class="md-ellipsis">
Request Execution
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Admin
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Admin
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#administrative-tasks" class="md-nav__link">
<span class="md-ellipsis">
Administrative tasks
</span>
</a>
<nav class="md-nav" aria-label="Administrative tasks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#control-connection" class="md-nav__link">
<span class="md-ellipsis">
Control connection
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#metadata-manager" class="md-nav__link">
<span class="md-ellipsis">
Metadata manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#topology-monitor" class="md-nav__link">
<span class="md-ellipsis">
Topology monitor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#node-state-manager" class="md-nav__link">
<span class="md-ellipsis">
Node state manager
</span>
</a>
<nav class="md-nav" aria-label="Node state manager">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#topology-events-vs-node-state-events" class="md-nav__link">
<span class="md-ellipsis">
Topology events vs. node state events
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#how-admin-components-work-together" class="md-nav__link">
<span class="md-ellipsis">
How admin components work together
</span>
</a>
<nav class="md-nav" aria-label="How admin components work together">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#a-new-node-gets-added" class="md-nav__link">
<span class="md-ellipsis">
A new node gets added
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#a-new-table-gets-created" class="md-nav__link">
<span class="md-ellipsis">
A new table gets created
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-last-connection-to-an-active-node-drops" class="md-nav__link">
<span class="md-ellipsis">
The last connection to an active node drops
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#extension-points" class="md-nav__link">
<span class="md-ellipsis">
Extension points
</span>
</a>
<nav class="md-nav" aria-label="Extension points">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#topologymonitor" class="md-nav__link">
<span class="md-ellipsis">
TopologyMonitor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#metadatamanager" class="md-nav__link">
<span class="md-ellipsis">
MetadataManager
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../osgi/" class="md-nav__link">
<span class="md-ellipsis">
OSGi
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../api/" class="md-nav__link">
<span class="md-ellipsis">
API References
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../faq-README/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../changelog-README/" class="md-nav__link">
<span class="md-ellipsis">
Changelog
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../upgrade-README/" class="md-nav__link">
<span class="md-ellipsis">
Upgrade Guide
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#administrative-tasks" class="md-nav__link">
<span class="md-ellipsis">
Administrative tasks
</span>
</a>
<nav class="md-nav" aria-label="Administrative tasks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#control-connection" class="md-nav__link">
<span class="md-ellipsis">
Control connection
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#metadata-manager" class="md-nav__link">
<span class="md-ellipsis">
Metadata manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#topology-monitor" class="md-nav__link">
<span class="md-ellipsis">
Topology monitor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#node-state-manager" class="md-nav__link">
<span class="md-ellipsis">
Node state manager
</span>
</a>
<nav class="md-nav" aria-label="Node state manager">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#topology-events-vs-node-state-events" class="md-nav__link">
<span class="md-ellipsis">
Topology events vs. node state events
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#how-admin-components-work-together" class="md-nav__link">
<span class="md-ellipsis">
How admin components work together
</span>
</a>
<nav class="md-nav" aria-label="How admin components work together">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#a-new-node-gets-added" class="md-nav__link">
<span class="md-ellipsis">
A new node gets added
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#a-new-table-gets-created" class="md-nav__link">
<span class="md-ellipsis">
A new table gets created
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-last-connection-to-an-active-node-drops" class="md-nav__link">
<span class="md-ellipsis">
The last connection to an active node drops
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#extension-points" class="md-nav__link">
<span class="md-ellipsis">
Extension points
</span>
</a>
<nav class="md-nav" aria-label="Extension points">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#topologymonitor" class="md-nav__link">
<span class="md-ellipsis">
TopologyMonitor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#metadatamanager" class="md-nav__link">
<span class="md-ellipsis">
MetadataManager
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1>Admin</h1>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<h2 id="administrative-tasks">Administrative tasks<a class="headerlink" href="#administrative-tasks" title="Permanent link">&para;</a></h2>
<p>Aside from the main task of <a href="../request_execution">executing user requests</a>, the driver also needs
to track cluster state and metadata. This is done with a number of administrative components:</p>
<div class="highlight"><pre><span></span><code> +---------------+
| DriverChannel |
+-------+-------+
|1
| topology
+-----------------+ query +---------+---------+ events
| TopologyMonitor +------+----&gt;| ControlConnection +-----------------+
+-----------------+ | +---------+---------+ |
^ | | |
| | | topology+channel V
get | +---------+ refresh| events +----------+
node info| | schema | +------------+ EventBus |
| | | | +-+--------+
+--------+-----+--+ | | ^ ^
| MetadataManager |&lt;-------+-------------+ | node| |
+--------+-------++ | | state| |
| | | add/remove v events| |
|1 | | node +------------------+ | |
+-----+----+ | +------------+ NodeStateManager +------+ |
| Metadata | | +------------------+ |
+----------+ | |
+-------------------------------------------------------+
metadata changed events
</code></pre></div>
<p>Note: the event bus is covered in the <a href="../common/event_bus">common infrastructure</a> section.</p>
<h3 id="control-connection">Control connection<a class="headerlink" href="#control-connection" title="Permanent link">&para;</a></h3>
<p>The goal of the control connection is to maintain a dedicated <code>DriverChannel</code> instance, used to:</p>
<ul>
<li>listen for server-side protocol events:</li>
<li>topology events (<code>NEW_NODE</code>, <code>REMOVED_NODE</code>) and status events (<code>UP</code>, <code>DOWN</code>) are published on
the event bus, to be processed by other components;</li>
<li>schema events are propagated directly to the metadata manager, to trigger a refresh;</li>
<li>provide a way to query system tables. In practice, this is used by:</li>
<li>the topology monitor, to read node information from <code>system.local</code> and <code>system.peers</code>;</li>
<li>the metadata manager, to read schema metadata from <code>system_schema.*</code>.</li>
</ul>
<p>It has its own reconnection mechanism (if the channel goes down, a new one will be opened to another
node in the cluster) and some logic for initialization and shutdown.</p>
<p>Note that the control connection is really just an implementation detail of the metadata manager and
topology monitor: if those components are overridden with custom versions that use other means to
get their data, the driver will detect it and not initialize the control connection (at the time of
writing, the session also references the control connection directly, but that's a bug:
<a href="https://datastax-oss.atlassian.net/browse/JAVA-2473">JAVA-2473</a>).</p>
<h3 id="metadata-manager">Metadata manager<a class="headerlink" href="#metadata-manager" title="Permanent link">&para;</a></h3>
<p>This component is responsible for maintaining the contents of
<a href="../../core/metadata/">session.getMetadata()</a>.</p>
<p>One big improvement in driver 4 is that the <code>Metadata</code> object is immutable and updated atomically;
this guarantees a consistent view of the cluster at a given point in time. For example, if a
keyspace name is referenced in the token map, there will always be a corresponding
<code>KeyspaceMetadata</code> in the schema metadata.</p>
<p><code>MetadataManager</code> keeps the current <code>Metadata</code> instance in a volatile field. Each transition is
managed by a <code>MetadataRefresh</code> object that computes the new metadata, along with an optional list of
events to publish on the bus (e.g. table created, keyspace removed, etc.) The new metadata is then
written back to the volatile field. <code>MetadataManager</code> follows the <a href="../common/concurrency/#cold-path">confined inner
class</a> pattern to ensure that all refreshes are applied serially,
from a single admin thread. This guarantees that two refreshes can't start from the same initial
state and overwrite each other.</p>
<p>There are various types of refreshes targeting nodes, the schema or the token map.</p>
<p>Note that, unlike driver 3, we only do full schema refreshes. This simplifies the code considerably,
and thanks to debouncing this should not affect performance. The schema refresh process uses a few
auxiliary components that may have different implementations depending on the Cassandra version:</p>
<ul>
<li><code>SchemaQueries</code>: launches the schema queries asynchronously, and assemble the result in a
<code>SchemaRows</code>;</li>
<li><code>SchemaParser</code>: turns the <code>SchemaRows</code> into the <code>SchemaRefresh</code>. </li>
</ul>
<p>When the metadata manager needs node-related data, it queries the topology monitor. When it needs
schema-related data, it uses the control connection directly to issue its queries.</p>
<h3 id="topology-monitor">Topology monitor<a class="headerlink" href="#topology-monitor" title="Permanent link">&para;</a></h3>
<p><code>TopologyMonitor</code> abstracts how we get information about nodes in the cluster:</p>
<ul>
<li>refresh the list of nodes;</li>
<li>refresh an individual node, or load the information of a newly added node;</li>
<li>check schema agreement;</li>
<li>emit <code>TopologyEvent</code> instances on the bus when we get external signals suggesting topology changes
(node added or removed), or status changes (node down or up).</li>
</ul>
<p>The built-in implementation uses the control connection to query <code>system.local</code> and <code>system.peers</code>,
and listen to gossip events.</p>
<h3 id="node-state-manager">Node state manager<a class="headerlink" href="#node-state-manager" title="Permanent link">&para;</a></h3>
<p><code>NodeStateManager</code> tracks the state of the nodes in the cluster.</p>
<p>We can't simply trust gossip events because they are not always reliable (the coordinator can become
isolated and think other nodes are down). Instead, the driver uses more elaborate rules that combine
external signals with observed internal state:</p>
<ul>
<li>as long as we have an active connection to a node, it is considered up, whatever gossip events
say;</li>
<li>if all connections to a node are lost, and its pool has started reconnecting, it gets marked down
(we check the reconnection because the pool could have shut down for legitimate reasons, like the
node distance changing to IGNORED);</li>
<li>a node is marked back up when the driver has successfully reopened at least one connection;</li>
<li>if the driver is not actively trying to connect to a node (for example if it is at distance
IGNORED), then gossip events are applied directly.</li>
</ul>
<p>See the javadocs of <code>NodeState</code> and <code>TopologyEvent</code>, as well as the <code>NodeStateManager</code>
implementation itself, for more details.</p>
<h4 id="topology-events-vs-node-state-events">Topology events vs. node state events<a class="headerlink" href="#topology-events-vs-node-state-events" title="Permanent link">&para;</a></h4>
<p>These two event types are related, but they're used at different stages:</p>
<ul>
<li><code>TopologyEvent</code> is an external signal about the state of a node (by default, a <code>TOPOLOGY_CHANGE</code>
or <code>STATUS_CHANGE</code> gossip event received on the control connection). This is considered as a mere
suggestion, that the driver may or may not decide to follow;</li>
<li><code>NodeStateEvent</code> is an actual decision made by the driver to change a node to a given state.</li>
</ul>
<p><code>NodeStateManager</code> essentially transforms topology events, as well as other internal signals, into
node state events.</p>
<p>In general, other driver components only react to node state events, but there are a few exceptions:
for example, if a connection pool is reconnecting and the next attempt is scheduled in 5 minutes,
but a SUGGEST_UP topology event is emitted, the pool tries to reconnect immediately.</p>
<p>The best way to find where each event is used is to do a usage search of the event type.</p>
<h3 id="how-admin-components-work-together">How admin components work together<a class="headerlink" href="#how-admin-components-work-together" title="Permanent link">&para;</a></h3>
<p>Most changes to the cluster state will involve the coordinated effort of multiple admin components.
Here are a few examples:</p>
<h4 id="a-new-node-gets-added">A new node gets added<a class="headerlink" href="#a-new-node-gets-added" title="Permanent link">&para;</a></h4>
<div class="highlight"><pre><span></span><code>+-----------------+ +--------+ +----------------+ +---------------+ +---------------+
|ControlConnection| |EventBus| |NodeStateManager| |MetadataManager| |TopologyMonitor|
+--------+--------+ +---+----+ +--------+-------+ +-------+-------+ +-------+-------+
| | | | |
+--------+-------+ | | | |
|Receive NEW_NODE| | | | |
|gossip event | | | | |
| {d}| | | | |
+--------+-------+ | | | |
| | | | |
|TopologyEvent( | | | |
| SUGGEST_ADDED)| | | |
+---------------&gt;| | | |
| |onTopologyEvent| | |
| +--------------&gt;| | |
| | +------+-------+ | |
| | |check node not| | |
| | |known already | | |
| | | {d}| | |
| | +------+-------+ | |
| | | | |
| | | addNode | |
| | +----------------&gt;| |
| | | | getNewNodeInfo |
| | | +----------------&gt;|
| | | | |
| query(SELECT FROM system.peers) |
|&lt;-------------------------------------------------------------------+
+-------------------------------------------------------------------&gt;|
| | | |&lt;----------------+
| | | +-------+--------+ |
| | | |create and apply| |
| | | |AddNodeRefresh | |
| | | | {d}| |
| | | +-------+--------+ |
| | | | |
| | NodeChangeEvent(ADDED) | |
| |&lt;--------------------------------+ |
| | | | |
</code></pre></div>
<p>At this point, other driver components listening on the event bus will get notified of the addition.
For example, <code>DefaultSession</code> will initialize a connection pool to the new node.</p>
<h4 id="a-new-table-gets-created">A new table gets created<a class="headerlink" href="#a-new-table-gets-created" title="Permanent link">&para;</a></h4>
<div class="highlight"><pre><span></span><code> +-----------------+ +---------------+ +---------------+ +--------+
|ControlConnection| |MetadataManager| |TopologyMonitor| |EventBus|
+--------+--------+ +-------+-------+ +-------+-------+ +---+----+
| | | |
+----------+----------+ | | |
|Receive SCHEMA_CHANGE| | | |
|gossip event | | | |
| {d} | | | |
+----------+----------+ | | |
| | | |
| refreshSchema | | |
+-------------------------------&gt;| | |
| |checkSchemaAgreement | |
| +--------------------&gt;| |
| | | |
| query(SELECT FROM system.local/peers) | |
|&lt;-----------------------------------------------------+ |
+-----------------------------------------------------&gt;| |
| | | |
| |&lt;--------------------+ |
|query(SELECT FROM system_schema)| | |
|&lt;-------------------------------+ | |
+-------------------------------&gt;| | |
| +-------+--------+ | |
| |Parse results | | |
| |Create and apply| | |
| |SchemaRefresh | | |
| | {d}| | |
| +-------+--------+ | |
| | | |
| | TableChangeEvent(CREATED) |
| +----------------------------------&gt;|
| | | |
</code></pre></div>
<h4 id="the-last-connection-to-an-active-node-drops">The last connection to an active node drops<a class="headerlink" href="#the-last-connection-to-an-active-node-drops" title="Permanent link">&para;</a></h4>
<div class="highlight"><pre><span></span><code> +-----------+ +--------+ +----------------+ +----+ +---------------+
|ChannelPool| |EventBus| |NodeStateManager| |Node| |MetadataManager|
+-----+-----+ +---+----+ +-------+--------+ +-+--+ +-------+-------+
| | | | |
|ChannelEvent(CLOSED) | | | |
+-----------------------&gt;| | | |
| |onChannelEvent | | |
+------+-----+ +---------------&gt;| | |
| start | | |decrement | |
|reconnecting| | |openConnections | |
| {d}| | +---------------&gt;| |
+------+-----+ | | | |
|ChannelEvent( | | | |
| RECONNECTION_STARTED) | | | |
+-----------------------&gt;| | | |
| |onChannelEvent | | |
| +---------------&gt;| | |
| | |increment | |
| | |reconnections | |
| | +---------------&gt;| |
| | | | |
| | +--------+--------+ | |
| | |detect node has | | |
| | |0 connections and| | |
| | |is reconnecting | | |
| | | {d} | | |
| | +--------+--------+ | |
| | |set state DOWN | |
| | +---------------&gt;| |
| |NodeStateEvent( | | |
| | DOWN) | | |
+------+-----+ |&lt;---------------+ | |
|reconnection| | | | |
| succeeds | | | | |
| {d}| | | | |
+------+-----+ | | | |
|ChannelEvent(OPENED) | | | |
+-----------------------&gt;| | | |
| |onChannelEvent | | |
| +---------------&gt;| | |
| | |increment | |
| | |openConnections | |
| | +---------------&gt;| |
| | | | |
| | +--------+--------+ | |
| | |detect node has | | |
| | |1 connection | | |
| | | {d} | | |
| | +--------+--------+ | |
| | | refreshNode | |
| | +----------------------------&gt;|
| | | | |
| | |set state UP | |
| | +---------------&gt;| |
| |NodeStateEvent( | | |
| | UP) | | |
| |&lt;---------------+ | |
|ChannelEvent( | | | |
| RECONNECTION_STOPPED) | | | |
+-----------------------&gt;| | | |
| |onChannelEvent | | |
| +---------------&gt;| | |
| | |decrement | |
| | |reconnections | |
| | +---------------&gt;| |
| | | | |
</code></pre></div>
<h3 id="extension-points">Extension points<a class="headerlink" href="#extension-points" title="Permanent link">&para;</a></h3>
<h4 id="topologymonitor">TopologyMonitor<a class="headerlink" href="#topologymonitor" title="Permanent link">&para;</a></h4>
<p>This is a standalone component because some users have asked for a way to use their own discovery
service instead of relying on system tables and gossip (see
<a href="https://datastax-oss.atlassian.net/browse/JAVA-1082">JAVA-1082</a>).</p>
<p>A custom implementation can be plugged by <a href="../common/context/#overriding-a-context-component">extending the
context</a> and overriding <code>buildTopologyMonitor</code>.
It should:</p>
<ul>
<li>implement the methods of <code>TopologyMonitor</code> by querying the discovery service;</li>
<li>use some notification mechanism (or poll the service periodically) to detect when nodes go up or
down, or get added or removed, and emit the corresponding <code>TopologyEvent</code> instances on the bus.</li>
</ul>
<p>Read the javadocs for more details; in particular, <code>NodeInfo</code> explains how the driver uses the
information returned by the topology monitor.</p>
<h4 id="metadatamanager">MetadataManager<a class="headerlink" href="#metadatamanager" title="Permanent link">&para;</a></h4>
<p>It's less likely that this will be overridden directly. But the schema querying and parsing logic is
abstracted behind two factories that handle the differences between Cassandra versions:
<code>SchemaQueriesFactory</code> and <code>SchemaParserFactory</code>. These are pluggable by <a href="../common/context/#overriding-a-context-component">extending the
context</a> and overriding the corresponding
<code>buildXxx</code> methods.</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.sections", "navigation.top", "search.highlight", "search.share"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.92b07e13.min.js"></script>
</body>
</html>