blob: bd25649119464f98daa5e526e5f7a9643767a01e [file] [log] [blame]
<!doctype html>
<html lang="en-US" data-theme="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="generator" content="VuePress 2.0.0-rc.14" />
<meta name="theme" content="VuePress Theme Hope 2.0.0-rc.52" />
<style>
html {
background: var(--bg-color, #fff);
}
html[data-theme="dark"] {
background: var(--bg-color, #1d1e1f);
}
body {
background: var(--bg-color);
}
</style>
<script>
const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
const systemDarkMode =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches;
if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
document.documentElement.setAttribute("data-theme", "dark");
}
</script>
<link rel="alternate" hreflang="zh-cn" href="https://iotdb.apache.org/zh/Community/Development-Guide.html"><meta property="og:url" content="https://iotdb.apache.org/Community/Development-Guide.html"><meta property="og:site_name" content="IoTDB Website"><meta property="og:title" content="Development Guide"><meta property="og:description" content="Development Guide Development Agreements Code Formatting We utilize the Spotless plugin and google-java-format to format Java code. You can configure the IDE to automatically ap..."><meta property="og:type" content="article"><meta property="og:locale" content="en-US"><meta property="og:locale:alternate" content="zh-CN"><meta property="og:updated_time" content="2024-07-16T07:42:59.000Z"><meta property="article:modified_time" content="2024-07-16T07:42:59.000Z"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"Development Guide","image":[""],"dateModified":"2024-07-16T07:42:59.000Z","author":[]}</script><link rel="icon" href="/favicon.ico"><meta name="Description" content="Apache IoTDB: Time Series Database for IoT"><meta name="Keywords" content="TSDB, time series, time series database, IoTDB, IoT database, IoT data management,时序数据库, 时间序列管理, IoTDB, 物联网数据库, 实时数据库, 物联网数据管理, 物联网数据"><meta name="baidu-site-verification" content="wfKETzB3OT"><meta name="google-site-verification" content="mZWAoRY0yj_HAr-s47zHCGHzx5Ju-RVm5wDbPnwQYFo"><script type="text/javascript">
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(["setDoNotTrack", true]);
_paq.push(["disableCookies"]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '56']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script><title>Development Guide | IoTDB Website</title><meta name="description" content="Development Guide Development Agreements Code Formatting We utilize the Spotless plugin and google-java-format to format Java code. You can configure the IDE to automatically ap...">
<link rel="preload" href="/assets/style-Cwp1o4WF.css" as="style"><link rel="stylesheet" href="/assets/style-Cwp1o4WF.css">
<link rel="modulepreload" href="/assets/app-COzQ4uU1.js"><link rel="modulepreload" href="/assets/Development-Guide.html-C425Qfqw.js">
</head>
<body>
<div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">Skip to main content</a><!--]--><!--[--><div class="theme-container no-sidebar external-link-icon pure has-toc"><!--[--><header id="navbar" class="vp-navbar"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!----><!--[--><a class="route-link vp-brand" href="/"><img class="vp-nav-logo" src="/logo.png" alt><!----><span class="vp-site-name hide-in-pad">IoTDB Website</span></a><!--]--><!----></div><div class="vp-navbar-center"><!----><!--[--><!--]--><!----></div><div class="vp-navbar-end"><!----><!--[--><!--[--><div id="docsearch-container" style="display:none;"></div><div><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"><svg width="15" height="15" class="DocSearch-Control-Key-Icon"><path d="M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953" stroke-width="1.2" stroke="currentColor" fill="none" stroke-linecap="square"></path></svg></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--><nav class="vp-nav-links"><div class="vp-nav-item hide-in-mobile"><div class="vp-dropdown-wrapper"><button type="button" class="vp-dropdown-title" aria-label="Documentation"><!--[--><!---->Documentation<!--]--><span class="arrow"></span><ul class="vp-dropdown"><li class="vp-dropdown-item"><a class="route-link auto-link" href="/UserGuide/latest/QuickStart/QuickStart.html" aria-label="v1.3.0/1/2"><!---->v1.3.0/1/2<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/UserGuide/V1.2.x/QuickStart/QuickStart.html" aria-label="v1.2.x"><!---->v1.2.x<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/UserGuide/V1.1.x/QuickStart/QuickStart.html" aria-label="v1.1.x"><!---->v1.1.x<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/UserGuide/V1.0.x/QuickStart/QuickStart.html" aria-label="v1.0.x"><!---->v1.0.x<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/UserGuide/V0.13.x/QuickStart/QuickStart.html" aria-label="v0.13.x"><!---->v0.13.x<!----></a></li></ul></button></div></div><div class="vp-nav-item hide-in-mobile"><a class="auto-link external-link" href="https://cwiki.apache.org/confluence/display/IOTDB/System+Design" aria-label="Design" rel="noopener noreferrer" target="_blank"><!---->Design<!----></a></div><div class="vp-nav-item hide-in-mobile"><a class="route-link auto-link" href="/Download/" aria-label="Download"><!---->Download<!----></a></div><div class="vp-nav-item hide-in-mobile"><div class="vp-dropdown-wrapper"><button type="button" class="vp-dropdown-title" aria-label="Community"><!--[--><!---->Community<!--]--><span class="arrow"></span><ul class="vp-dropdown"><li class="vp-dropdown-item"><a class="route-link auto-link" href="/Community/About-the-Community.html" aria-label="About the Community"><!---->About the Community<!----></a></li><li class="vp-dropdown-item"><a class="route-link route-link-active auto-link" href="/Community/Development-Guide.html" aria-label="Development Guide"><!---->Development Guide<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/Community/Community-Partners.html" aria-label="Community Partners"><!---->Community Partners<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/Community/Communication-Channels.html" aria-label="Communication Channels"><!---->Communication Channels<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/Community/Events-and-Reports.html" aria-label="Events and Reports"><!---->Events and Reports<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/Community/Commiters.html" aria-label="Commiters"><!---->Commiters<!----></a></li></ul></button></div></div><div class="vp-nav-item hide-in-mobile"><div class="vp-dropdown-wrapper"><button type="button" class="vp-dropdown-title" aria-label="ASF"><!--[--><!---->ASF<!--]--><span class="arrow"></span><ul class="vp-dropdown"><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://www.apache.org/" aria-label="Foundation" rel="noopener noreferrer" target="_blank"><!---->Foundation<!----></a></li><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://www.apache.org/licenses/" aria-label="License" rel="noopener noreferrer" target="_blank"><!---->License<!----></a></li><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://www.apache.org/security/" aria-label="Security" rel="noopener noreferrer" target="_blank"><!---->Security<!----></a></li><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://www.apache.org/foundation/sponsorship.html" aria-label="Sponsorship" rel="noopener noreferrer" target="_blank"><!---->Sponsorship<!----></a></li><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://www.apache.org/foundation/thanks.html" aria-label="Thanks" rel="noopener noreferrer" target="_blank"><!---->Thanks<!----></a></li><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://www.apache.org/events/current-event" aria-label="Current Events" rel="noopener noreferrer" target="_blank"><!---->Current Events<!----></a></li><li class="vp-dropdown-item"><a class="auto-link external-link" href="https://privacy.apache.org/policies/privacy-policy-public.html" aria-label="Privacy" rel="noopener noreferrer" target="_blank"><!---->Privacy<!----></a></li></ul></button></div></div></nav><div class="vp-nav-item"><div class="vp-dropdown-wrapper"><button type="button" class="vp-dropdown-title" aria-label="Select language"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon i18n-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="i18n icon" name="i18n" style="width:1rem;height:1rem;vertical-align:middle;"><path d="M379.392 460.8 494.08 575.488l-42.496 102.4L307.2 532.48 138.24 701.44l-71.68-72.704L234.496 460.8l-45.056-45.056c-27.136-27.136-51.2-66.56-66.56-108.544h112.64c7.68 14.336 16.896 27.136 26.112 35.84l45.568 46.08 45.056-45.056C382.976 312.32 409.6 247.808 409.6 204.8H0V102.4h256V0h102.4v102.4h256v102.4H512c0 70.144-37.888 161.28-87.04 210.944L378.88 460.8zM576 870.4 512 1024H409.6l256-614.4H768l256 614.4H921.6l-64-153.6H576zM618.496 768h196.608L716.8 532.48 618.496 768z"></path></svg><!--]--><span class="arrow"></span><ul class="vp-dropdown"><li class="vp-dropdown-item"><a class="route-link route-link-active auto-link" href="/Community/Development-Guide.html" aria-label="English"><!---->English<!----></a></li><li class="vp-dropdown-item"><a class="route-link auto-link" href="/zh/Community/Development-Guide.html" aria-label="简体中文"><!---->简体中文<!----></a></li></ul></button></div></div><div class="vp-nav-item hide-in-mobile"><button type="button" class="vp-color-mode-switch" id="color-mode-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" name="auto" style="display:none;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" name="dark" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" name="light" style="display:block;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><div class="vp-nav-item vp-action"><a class="vp-action-link" href="https://github.com/apache/iotdb" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" name="github" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><!--]--><!----><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!----><ul class="vp-sidebar-links"></ul><!----></aside><!--[--><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><!---->Development Guide</h1><div class="page-info"><!----><!----><span class="page-date-info" aria-label="Writing Date"><svg xmlns="http://www.w3.org/2000/svg" class="icon calendar-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="calendar icon" name="calendar"><path d="M716.4 110.137c0-18.753-14.72-33.473-33.472-33.473-18.753 0-33.473 14.72-33.473 33.473v33.473h66.993v-33.473zm-334.87 0c0-18.753-14.72-33.473-33.473-33.473s-33.52 14.72-33.52 33.473v33.473h66.993v-33.473zm468.81 33.52H716.4v100.465c0 18.753-14.72 33.473-33.472 33.473a33.145 33.145 0 01-33.473-33.473V143.657H381.53v100.465c0 18.753-14.72 33.473-33.473 33.473a33.145 33.145 0 01-33.473-33.473V143.657H180.6A134.314 134.314 0 0046.66 277.595v535.756A134.314 134.314 0 00180.6 947.289h669.74a134.36 134.36 0 00133.94-133.938V277.595a134.314 134.314 0 00-133.94-133.938zm33.473 267.877H147.126a33.145 33.145 0 01-33.473-33.473c0-18.752 14.72-33.473 33.473-33.473h736.687c18.752 0 33.472 14.72 33.472 33.473a33.145 33.145 0 01-33.472 33.473z"></path></svg><span><!----></span><meta property="datePublished" content="2024-07-16T07:42:59.000Z"></span><!----><span class="page-reading-time-info" aria-label="Reading Time"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon" name="timer"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>About 10 min</span><meta property="timeRequired" content="PT10M"></span><!----><!----></div><hr></div><div class="vp-toc-placeholder"><aside id="toc"><!----><div class="vp-toc-header">On This Page<button type="button" class="print-button" title="Print"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon" name="print"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button><div class="arrow end"></div></div><div class="vp-toc-wrapper"><ul class="vp-toc-list"><!--[--><li class="vp-toc-item"><a class="route-link vp-toc-link level2" href="#development-agreements">Development Agreements</a></li><li><ul class="vp-toc-list"><!--[--><li class="vp-toc-item"><a class="route-link vp-toc-link level3" href="#code-formatting">Code Formatting</a></li><!----><!--]--><!--[--><li class="vp-toc-item"><a class="route-link vp-toc-link level3" href="#code-styles">Code Styles</a></li><!----><!--]--></ul></li><!--]--><!--[--><li class="vp-toc-item"><a class="route-link vp-toc-link level2" href="#contribution-methods">Contribution Methods</a></li><li><ul class="vp-toc-list"><!--[--><li class="vp-toc-item"><a class="route-link vp-toc-link level3" href="#participating-in-votes">Participating in Votes</a></li><!----><!--]--><!--[--><li class="vp-toc-item"><a class="route-link vp-toc-link level3" href="#code-contribution">Code Contribution</a></li><!----><!--]--><!--[--><li class="vp-toc-item"><a class="route-link vp-toc-link level3" href="#contribute-to-documentation">Contribute to Documentation</a></li><!----><!--]--><!--[--><li class="vp-toc-item"><a class="route-link vp-toc-link level3" href="#new-features-bug-feedback-improvements-etc">New Features, Bug Feedback, Improvements, etc.</a></li><!----><!--]--><!--[--><li class="vp-toc-item"><a class="route-link vp-toc-link level3" href="#email-discussion-content">Email discussion Content</a></li><!----><!--]--><!--[--><li class="vp-toc-item"><a class="route-link vp-toc-link level3" href="#frequently-asked-questions">Frequently Asked Questions</a></li><!----><!--]--></ul></li><!--]--><!--[--><li class="vp-toc-item"><a class="route-link vp-toc-link level2" href="#references">References</a></li><!----><!--]--></ul><div class="vp-toc-marker" style="top:-1.7rem;"></div></div><!----></aside></div><!----><div class="theme-hope-content"><h1 id="development-guide" tabindex="-1"><a class="header-anchor" href="#development-guide"><span>Development Guide</span></a></h1><h2 id="development-agreements" tabindex="-1"><a class="header-anchor" href="#development-agreements"><span>Development Agreements</span></a></h2><h3 id="code-formatting" tabindex="-1"><a class="header-anchor" href="#code-formatting"><span>Code Formatting</span></a></h3><p>We utilize the <a href="https://github.com/diffplug/spotless/tree/main/plugin-maven" target="_blank" rel="noopener noreferrer">Spotless plugin</a> and <a href="https://github.com/google/google-java-format" target="_blank" rel="noopener noreferrer">google-java-format</a> to format Java code. You can configure the IDE to automatically apply formatting on save by following these steps (using IDEA as an example):</p><ol><li>Download <a href="https://plugins.jetbrains.com/plugin/8527-google-java-format/versions/stable/83169" target="_blank" rel="noopener noreferrer">google-java-format-plugin v1.7.0.5</a> and install it into the IDEA (Preferences -&gt; Plugins -&gt; search for google-java-format). For more details, please check the <a href="https://github.com/google/google-java-format#intellij-android-studio-and-other-jetbrains-ides" target="_blank" rel="noopener noreferrer">manual</a>.</li><li>Install from disk (Plugins -&gt; gear icon -&gt; &quot;Install plugin from disk&quot; -&gt; Navigate to downloaded the zip file).</li><li>Enable the plugin and keep the default google format (2-space indents).</li><li>Avoid upgrading the google-java-format plugin until Spotless upgrades to version 18 or higher</li><li>Install the <a href="https://plugins.jetbrains.com/plugin/7642-save-actions" target="_blank" rel="noopener noreferrer">Save Actions</a> plugin. Enable &quot;Optimize imports&quot; and &quot;Reformat file&quot; options.</li><li>Under &quot;Save Actions&quot; settings, set <code>File Path Inclusion</code> to <code>.*.java</code> to prevent accidental reformatting of non-Java files.</li></ol><h3 id="code-styles" tabindex="-1"><a class="header-anchor" href="#code-styles"><span>Code Styles</span></a></h3><p>We enforce code style consistency using the <a href="https://checkstyle.sourceforge.io/config_filefilters.html" target="_blank" rel="noopener noreferrer">maven-checkstyle-plugin</a> guided by the rules defined in the <a href="https://github.com/apache/iotdb/blob/master/checkstyle.xml" target="_blank" rel="noopener noreferrer">checkstyle.xml</a> file in the project root directory. To validate your code style, execute <code>mvn validate</code>.</p><p>Ensure your IDE&#39;s default code style settings do not conflict with the project&#39;s rules.</p><p>In IDEA, you can align your style settings as follows.</p><ul><li>Disable wildcard imports: <ul><li>Navigate to Java code style settings (Preferences -&gt; Editor -&gt; Code Style -&gt; Java).</li><li>Go to the &quot;Import&quot; tab.</li><li>In the &quot;General&quot; section, enable &quot;Use single class import&quot;.</li><li>Set &quot;Class count to use import with &#39;*&#39;&quot; to 999 or a larger value.</li><li>Set &quot;Names count to use static import with &#39;*&#39; &quot; to 999 or a larger value.</li></ul></li></ul><h2 id="contribution-methods" tabindex="-1"><a class="header-anchor" href="#contribution-methods"><span>Contribution Methods</span></a></h2><h3 id="participating-in-votes" tabindex="-1"><a class="header-anchor" href="#participating-in-votes"><span>Participating in Votes</span></a></h3><ul><li><p>Step 1: Vote for a release</p><ul><li>Please read <a href="https://cwiki.apache.org/confluence/display/IOTDB/Validating+a+staged+Release" target="_blank" rel="noopener noreferrer">https://cwiki.apache.org/confluence/display/IOTDB/Validating+a+staged+Release</a></li></ul></li><li><p>Step 2: Download Artifacts</p><ul><li>Access release candidates at <a href="https://dist.apache.org/repos/dist/dev/iotdb/" target="_blank" rel="noopener noreferrer">https://dist.apache.org/repos/dist/dev/iotdb/</a></li></ul></li><li><p>Step 3: Import the Public Key of the Release Manager</p><ul><li><p>Retrieve keys from <a href="https://dist.apache.org/repos/dist/dev/iotdb/KEYS" target="_blank" rel="noopener noreferrer">https://dist.apache.org/repos/dist/dev/iotdb/KEYS</a> and use <code>gpg2</code> for the import. Instructions and the start of public keys are listed on the page.</p></li><li><p>The first way:</p><ul><li><p>The beginning of the public key is:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">pub rsa4096 2019-10-15 [SC]</span>
<span class="line"> 10F3B3F8A1201B79AA43F2E00FC7F131CAA00430</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>Or</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">pub rsa4096/28662AC6 2019-12-23 [SC]</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div></li><li><p>Download the public key:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">gpg2 --receive-keys 10F3B3F8A1201B79AA43F2E00FC7F131CAA00430 (or 28662AC6)</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>or (specify keyserver)</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">gpg2 --keyserver p80.pool.sks-keyservers.net --recv-keys 10F3B3F8A1201B79AA43F2E00FC7F131CAA00430 (or 28662AC6)</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div></li></ul></li><li><p>The second way:</p><ul><li><p>Copy the content below into a text file named <code>key.asc</code>:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">-----BEGIN PGP PUBLIC KEY BLOCK-----</span>
<span class="line">Version: GnuPG v2</span>
<span class="line">...</span>
<span class="line">-----END PGP PUBLIC KEY BLOCK-----</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Import RM&#39;s public key to your computer:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">gpg2 --import key.asc</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div></li></ul></li></ul></li><li><p>Step 4: Verification of Releases</p><ul><li><p>Ensure LICENSE and NOTICE files are present and correct</p></li><li><p>Check README and RELEASE_NOTES files</p></li><li><p>Validate code headers:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">mvn -B apache-rat:check</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div></li><li><p>Verify signatures and hashes</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">gpg2 --verify apache-iotdb-0.12.0-source-release.zip.asc apache-iotdb-0.12.0-source-release.zip</span>
<span class="line"></span>
<span class="line"># Look for a message indicating a &quot;Good Signature&quot;</span>
<span class="line"></span>
<span class="line">shasum -a512 apache-iotdb-0.12.0-source-release.zip</span>
<span class="line"></span>
<span class="line"># Compare the output with the corresponding .sha512 file. If they match, the verification is successful.</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li><li><p>Verify the compilation:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">mvnw install</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>Ensure that the output ends with &quot;SUCCESS&quot; for all tasks.</p></li></ul></li><li><p>Step 5: Verify the Binary Release</p><ul><li><p>Ensure LICENSE and NOTICE files are present and correct</p></li><li><p>Check README and RELEASE_NOTES files</p></li><li><p>Verify signatures and hashes</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">gpg2 --verify apache-iotdb-0.12.0-bin.zip.asc apache-iotdb-0.12.0-bin.zip</span>
<span class="line"></span>
<span class="line"># Look for a message indicating a &quot;Good Signature&quot;.</span>
<span class="line"></span>
<span class="line">shasum -a512 apache-iotdb-0.12.0-bin.zip</span>
<span class="line"></span>
<span class="line"># Compare the output with the corresponding .sha512 file. If they match, the verification is successful.</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li><li><p>Verify that it starts and the sample statements execute correctly</p><p>To ensure the server starts and executes sample statements correctly, run the following commands:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">nohup ./sbin/start-server.sh &gt;/dev/null 2&gt;&amp;1 &amp;</span>
<span class="line"></span>
<span class="line">./sbin/start-cli.sh</span>
<span class="line"></span>
<span class="line">CREATE DATABASE root.turbine;</span>
<span class="line">CREATE TIMESERIES root.turbine.d1.s0 WITH DATATYPE=DOUBLE, ENCODING=GORILLA;</span>
<span class="line">insert into root.turbine.d1(timestamp,s0) values(1,1);</span>
<span class="line">insert into root.turbine.d1(timestamp,s0) values(2,2);</span>
<span class="line">insert into root.turbine.d1(timestamp,s0) values(3,3);</span>
<span class="line">select * from root.**;</span>
<span class="line"></span>
<span class="line"># Expect the following output:</span>
<span class="line">+-----------------------------------+------------------+</span>
<span class="line">| Time|root.turbine.d1.s0|</span>
<span class="line">+-----------------------------------+------------------+</span>
<span class="line">| 1970-01-01T08:00:00.001+08:00| 1.0|</span>
<span class="line">| 1970-01-01T08:00:00.002+08:00| 2.0|</span>
<span class="line">| 1970-01-01T08:00:00.003+08:00| 3.0|</span>
<span class="line">+-----------------------------------+------------------+</span>
<span class="line"></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li></ul></li><li><p>Step 6: Send an Email After Verification</p><p>Once verification is complete, you can send an email to confirm the successful validation:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">Hi,</span>
<span class="line"></span>
<span class="line">+1 (PMC could binding)</span>
<span class="line"></span>
<span class="line">The source release:</span>
<span class="line">LICENSE and NOTICE [ok]</span>
<span class="line">signatures and hashes [ok]</span>
<span class="line">All files have ASF header [ok]</span>
<span class="line">could compile from source: ./mvnw clean install [ok]</span>
<span class="line"></span>
<span class="line">The binary distribution:</span>
<span class="line">LICENSE and NOTICE [ok]</span>
<span class="line">signatures and hashes [ok]</span>
<span class="line">Could run with the following statements [ok]</span>
<span class="line"></span>
<span class="line">CREATE DATABASE root.turbine;</span>
<span class="line">CREATE TIMESERIES root.turbine.d1.s0 WITH DATATYPE=DOUBLE, ENCODING=GORILLA;</span>
<span class="line">insert into root.turbine.d1(timestamp,s0) values(1,1);</span>
<span class="line">insert into root.turbine.d1(timestamp,s0) values(2,2);</span>
<span class="line">insert into root.turbine.d1(timestamp,s0) values(3,3);</span>
<span class="line">select * from root.**;</span>
<span class="line"></span>
<span class="line">Thanks,</span>
<span class="line">xxx</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></li></ul><h3 id="code-contribution" tabindex="-1"><a class="header-anchor" href="#code-contribution"><span>Code Contribution</span></a></h3><h4 id="contribution-process" tabindex="-1"><a class="header-anchor" href="#contribution-process"><span>Contribution process:</span></a></h4><p>Tasks are managed as issues in JIRA in the Apache IoTDB community.</p><p>The full lifecycle of an Issue: Create an issue -&gt; assign an issue -&gt; submit a PR(pull request) -&gt; review the PR -&gt; merge the pr -&gt; close the issue.</p><h4 id="create-an-issue" tabindex="-1"><a class="header-anchor" href="#create-an-issue"><span>Create an Issue:</span></a></h4><ul><li>Clearly name and describe the issue in JIRA: <ul><li>Naming: Try to make it clear and easy to understand. Examples include supporting a new aggregate query function (avg) and optimizing the performance of querying raw data. The issue will later be included in the release note.</li><li>Description: New features and improvements should be clear. Mention environment, affected versions, and steps to reproduce if reporting bugs.</li></ul></li></ul><h4 id="assign-an-issue" tabindex="-1"><a class="header-anchor" href="#assign-an-issue"><span>Assign an Issue:</span></a></h4><ul><li><p>To prevent duplicate efforts, add a comment like &quot;I&#39;m working on this&quot; when you take up an issue.</p><p>Note: If you cannot assign an issue, it is because your account does not have the necessary permission.<br> In this case, please send an email to the <a href="mailto:dev@iotdb.apache.org" target="_blank" rel="noopener noreferrer">dev@iotdb.apache.org</a> mailing list with the title of &quot;[application] apply for permission to assign issues to XXX (your JIRA username)&quot;.</p></li></ul><h4 id="submit-a-pr" tabindex="-1"><a class="header-anchor" href="#submit-a-pr"><span>Submit a PR</span></a></h4><ul><li><p>How to submit code</p><ul><li><p>Contribution path:</p><p>The IoTDB community welcomes developers to participate in building the open source project. You can check <a href="https://issues.apache.org/jira/projects/IOTDB/issues" target="_blank" rel="noopener noreferrer">Issues</a> and contribute to their resolution or make other improvements.</p><p>Submit a PR that passes Travis-CI tests and Sonar code quality checks. If at least one committer approves and there are no code conflicts, the PR can be merged.</p></li><li><p>PR guidelines:</p><p>Submitting a <a href="https://help.github.com/articles/about-pull-requests/" target="_blank" rel="noopener noreferrer">Pull Request</a> on GitHub is straightforward. The following steps use the <a href="https://github.com/apache/iotdb" target="_blank" rel="noopener noreferrer">apache/iotdb</a> project as an example (replace &quot;iotdb&quot; with the relevant project name if different).</p><ul><li><p>Fork the repository:</p><p>Navigate to the <a href="https://github.com/apache/iotdb" target="_blank" rel="noopener noreferrer">github page</a> and click &quot;Fork&quot; in the upper right corner</p></li><li><p>Configure git and submit changes</p><ul><li>Step 1: Clone the code locally:</li></ul><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">git clone https://github.com/&lt;your_github_name&gt;/iotdb.git</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p><strong>Note: Please replace <code>&lt;your_github_name&gt;</code> with your GitHub username.</strong> The origin will default to your fork on GitHub after cloning.</p><ul><li>Step 2: Add apache/iotdb as an upstream remote branch:</li></ul><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">cd iotdb</span>
<span class="line">git remote add upstream https://github.com/apache/iotdb.git</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><ul><li>Step 3: Check the remote repository settings:</li></ul><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">git remote -v</span>
<span class="line">origin https://github.com/&lt;your_github_name&gt;/iotdb.git (fetch)</span>
<span class="line">origin https://github.com/&lt;your_github_name&gt;/iotdb.git(push)</span>
<span class="line">upstream https://github.com/apache/iotdb.git (fetch)</span>
<span class="line">upstream https://github.com/apache/iotdb.git (push)</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul><li>Step 4: Create a new branch to make changes (assume the new branch name is <code>fix</code>):</li></ul><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">git checkout -b fix</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>Once created, you can make changes to the code.</p><ul><li>Step 5: Commit your changes to the remote branch(here&#39;s an example of a <code>fix</code> branch):</li></ul><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">git commit -a -m &quot;&lt;you_commit_message&gt;&quot;</span>
<span class="line">git push origin fix</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>For more on git usage, visit: <a href="https://www.atlassian.com/git/tutorials/setting-up-a-repository" target="_blank" rel="noopener noreferrer">Git Usage Tutorial</a></p></li><li><p>Important Notes for Git Commit</p><ul><li><p>Keep your repository clean:</p><ul><li><p>Do not upload binary files. Ensure the repository size only increases due to code changes.</p></li><li><p>Do not upload generated code.</p></li></ul></li><li><p>Make meaningful commit messages:</p><ul><li><p>Title with JIRA number: [IOTDB-JIRA number].</p></li><li><p>Title with GitHub ISSUE number: [ISSUE-issue number].</p></li><li><p>Include #XXXX in the content for linking purposes.</p></li></ul></li></ul></li><li><p>Create a PR</p><p>Navigate to your GitHub repository page in the browser, switch to your committed branch <code>&lt;your_branch_name&gt;</code>, and click &quot;New pull request&quot; and &quot;Create pull request&quot; buttons in turn to create a PR. If you are addressing <a href="https://issues.apache.org/jira/projects/IOTDB/issues" target="_blank" rel="noopener noreferrer">Issues</a>, include [IOTDB-xxx] at the beginning.</p><p>At this point, your PR is created. For more information on PRs, please read <a href="https://help.github.com/categories/collaborating-with-issues-and-pull-requests/" target="_blank" rel="noopener noreferrer">Collaborating-with-issues-and-pull-requests</a></p></li><li><p>Conflict resolution</p><p>Code conflicts during PR submission are typically caused by multiple people editing the same file. They can be resolved by following these steps:</p><p>Step 1: Switch to the master branch</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">git checkout master</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>Step 2: Synchronize the remote master branch to your local branch</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">git pull upstream master</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>Step 3: Switch back to the branch you were on (assuming it&#39;s named <code>fix</code>)</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">git checkout fix</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>Step 4: Perform a rebase</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">git rebase -i master</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>Save the file that pops up (usually no changes needed). You will then be prompted to resolve conflicts in the specified files. Execute the following code after all the conflicts are resolved.</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">git add .</span>
<span class="line">git rebase --continue</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>Repeat until you see a message like <em>rebase successful</em>, then you can update the branch you submitted the PR from:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">git push -f origin fix</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div></li></ul></li></ul></li><li><p>Content to be submitted:</p><ul><li><p>Issue Type: New Feature</p><ul><li><p>Submit user manuals and code modification PRs in both English and Chinese.</p><p>The user manual mainly describes the function definition and usage. It should include scenario descriptions, configuration methods, interface function descriptions, and usage examples. Place content in the <code>src/UserGuide</code> directory for English and <code>src/zh/UserGuide</code> for Chinese on the main branch of the apache/iotdb-docs repository.</p><p>Update the user guide by making corresponding changes in <code>src/.vuepress/sidebar</code> on the main branch.</p></li><li><p>Commit Unit Test UT or Integration Test IT</p><p>Submit Unit Tests (UT) or Integration Tests (IT) covering as many cases as possible, referencing existing tests as models. You can refer to <code>xxTest</code> (Path: <code>iotdb/server/src/test/java/org/apache/iotdb/db/query/aggregation/</code>) or <code>xxIT</code> (Path: <code>iotdb/integration/src/test/java/org/apache/iotdb/db/integration/</code>).</p></li></ul></li><li><p>Issue Type: Improvement</p><p>Submit code and UT. Generally, there is no need to modify the user manual. It is advisable to submit experimental results showing quantified improvements and side effects.</p></li><li><p>Issue type: Bug</p><p>Write UT or IT that can reproduce the bug.</p></li></ul></li><li><p>Code management</p><ul><li><p>Branch management:</p><ul><li><p>The naming scheme of the IoTDB version is: <code>0.Major_version.Minor_version</code>. For example, in version 0.12.4, 12 represents the major version and 4 refers to the minor version.</p></li><li><p>The master branch corresponds to the next unreleased major version. Each major version release is archived in a separate branch, e.g., the code for the 0.12.x series is under the <code>rel/0.12</code> branch.</p></li><li><p>Bug fixes found in a released version should be submitted to all branches that are equal to or newer than that version. For example, a PR about a bug fix in version 0.11.x should be submitted to <code>rel/0.11</code> branch, <code>rel/0.12</code> branch and master branch.</p></li></ul></li><li><p>Code formatting:</p><p>Before submitting a PR, use <code>mvn spotless:apply</code> to format the code, otherwise the CI code format check will fail.</p></li><li><p>Notes:</p><ul><li><p>The default values between <code>iotdb-datanode.properties</code> and <code>IoTDBConfig</code> must be consistent</p></li><li><p>If configuration parameters are changed, modify the following files simultaneously:</p><ul><li><p>Configuration file: <code>iotdb-core/datanode/src/assembly/resources/conf/iotdb-datanode.properties</code></p></li><li><p>Code: <code>IoTDBDescriptor</code>, <code>IoTDBConfig</code></p></li><li><p>Documentation: <code>apache/iotdb-docs/src/UserGuide/{version}/Reference/DataNode-Config-Manual.md</code>, <code>apache/iotdb-docs/src/zh/UserGuide/{version}/Reference/DataNode-Config-Manual.md</code></p><p>To modify configuration parameters in IT and UT files, you should make these modifications within methods annotated with <code>@Before</code> and reset them in methods annotated with <code>@After</code> to avoid affecting other tests. Parameters for the compaction module should be consolidated in the <code>CompactionConfigRestorer</code> file.</p></li></ul></li></ul></li></ul></li><li><p>PR Naming</p><ul><li><p>Naming Convention: Branch tag - JIRA tag - PR name</p><p>Example: [To rel/0.12] [IoTDB-1907] implement customized sync process: sender</p></li><li><p>Branch tag</p><p>If you are submitting a PR to a non-master branch, such as the <code>rel/0.13</code> branch, include the branch tag in the PR name, like [To rel/0.13]. If the PR is targeted at the master branch, no branch tag is needed.</p></li><li><p>Jira tag</p><p>Start with the JIRA number, such as [IoTDB-1907] implement customized sync process: sender. This way, once the PR is created, bots will automatically link the PR to the corresponding issue.</p><p>Note: This auto-linking won&#39;t happen if the PR is created without any JIRA number or with one that is improper, in which case you need to correct the PR name and manually paste the PR link to the issue page by adding a comment or attaching a link.</p></li></ul></li></ul><ul><li><p>PR Description</p><p>Typically, the PR name cannot cover all changes, so it&#39;s necessary to add a detailed description of what has been altered. Provide explanations for any aspects that may be difficult to understand.</p><p>For PRs fixing bugs, describe the cause of the bug and the solution. Additionally, detail the addition of UT/IT test cases and any potential negative effects.</p></li><li><p>After Submitting a PR</p><p>Send an email to the mailing list at <a href="mailto:dev@iotdb.apache.org" target="_blank" rel="noopener noreferrer">dev@iotdb.apache.org</a>, outlining the work done in the PR. ake each reviewer&#39;s feedback seriously, respond to each comment, and make adjustments after reaching a consensus.</p></li></ul><h4 id="review-a-pr" tabindex="-1"><a class="header-anchor" href="#review-a-pr"><span>Review a PR</span></a></h4><ul><li><p>Key Considerations:</p><ul><li>PR Naming: Ensure PRs are properly named with the JIRA number for new features and bug fixes.</li><li>PR Description: Check if the description is clear.</li><li>Test Cases: Attach functional or performance test reports.</li><li>User Manuals: Ensure that new features include a user manual.</li><li>Code Isolation: Avoid mixing unrelated code changes in the same PR. Split unrelated modifications into separate PRs.</li></ul></li><li><p>Review Process:</p><ul><li><p>First step: Click &quot;Files changed&quot; in the PR<br><img style="width:100%;max-width:800px;max-height:600px;margin-left:auto;margin-right:auto;display:block;" src="https://alioss.timecho.com/docs/img/zh/development/howtocontributecode/01.png"></p></li><li><p>Second step: For lines with issues, move to the left side where a plus sign appears. Click the plus, leave a comment, and then click &quot;Start a review&quot;. At this point, all review comments are saved temporarily and are not visible to others.<br><img style="width:100%;max-width:800px;max-height:600px;margin-left:auto;margin-right:auto;display:block;" src="https://alioss.timecho.com/docs/img/zh/development/howtocontributecode/02.png"></p></li><li><p>Third step: After all the comments are added, click &quot;Review changes&quot;, choose your feedback — &quot;Approve&quot; if it’s ready to merge, &quot;Request changes&quot; if there are bugs that need correction, or &quot;Comment&quot; if you&#39;re unsure. Finally, submit your review comments which will then be visible to the person who submitted the PR.<br><img style="width:100%;max-width:800px;max-height:600px;margin-left:auto;margin-right:auto;display:block;" src="https://alioss.timecho.com/docs/img/zh/development/howtocontributecode/03.png"></p></li></ul></li></ul><h4 id="merge-a-pr" tabindex="-1"><a class="header-anchor" href="#merge-a-pr"><span>Merge a PR</span></a></h4><ul><li><p>Confirm that all review comments have been addressed and you have approval from at least one committer.</p></li><li><p>Choose <code>squash</code> merge. Opt for <code>rebase</code> only if the author has a single, clear commit log.</p></li><li><p>Close the corresponding issue on JIRA, and tag the fixed or completed version. [Note that solving or closing an issue should always include adding a PR or description on JIRA to allow tracking of task changes.]</p></li></ul><h3 id="contribute-to-documentation" tabindex="-1"><a class="header-anchor" href="#contribute-to-documentation"><span>Contribute to Documentation</span></a></h3><p>The process for contributing to the user manual is the same as for code, but involves different files:</p><ul><li>The English user manual is located in <code>src/UserGuide</code>.</li><li>The Chinese version is located in <code>src/zh/UserGuide</code>.</li><li>To update the user manual directory, including adding or deleting markdown documents or changing document names, appropriate modifications should be made in <code>src/.vuepress/sidebar</code> on the main branch.</li></ul><h3 id="new-features-bug-feedback-improvements-etc" tabindex="-1"><a class="header-anchor" href="#new-features-bug-feedback-improvements-etc"><span>New Features, Bug Feedback, Improvements, etc.</span></a></h3><p>Any new features or bugs to be fixed can be submitted as an issue on JIRA.</p><p>You can select the type of issue: bug, improvement, new feature, etc. New issues are automatically synchronized to the mailing list, and subsequent discussions can take place on JIRA or via the mailing list. Please close the issue once it is resolved.</p><h3 id="email-discussion-content" tabindex="-1"><a class="header-anchor" href="#email-discussion-content"><span>Email discussion Content</span></a></h3><p>Please conduct discussions in English:</p><ul><li><p>When joining the mailing list for the first time, you might introduce yourself (e.g., &quot;Hi, I&#39;m xxx...&quot;).</p></li><li><p>Before starting work on a feature, you may announce your intent via email (e.g., &quot;Hi, I&#39;m working on issue IOTDB-XXX, My plan is...&quot;).</p></li></ul><h3 id="frequently-asked-questions" tabindex="-1"><a class="header-anchor" href="#frequently-asked-questions"><span>Frequently Asked Questions</span></a></h3><ul><li><p>Unable to download files such as <code>thrift-*</code>:<br> For example <code>Could not get content org.apache.maven.wagon.TransferFailedException: Transfer failed for https://github.com/apache/iotdb-bin-resources/blob/main/compile-tools/thrift-0.14-ubuntu</code>.<br> This is usually a network issue, requiring manual download of the specified files:</p><ul><li><p>Download manually from:</p><ul><li><a href="https://github.com/apache/iotdb-bin-resources/blob/main/compile-tools/thrift-0.14-MacOS" target="_blank" rel="noopener noreferrer">thrift-0.14-MacOS</a></li><li><a href="https://github.com/apache/iotdb-bin-resources/blob/main/compile-tools/thrift-0.14-ubuntu" target="_blank" rel="noopener noreferrer">thrift-0.14-ubuntu</a></li></ul></li><li><p>Copy the file to the <code>thrift/target/tools/</code> directory.</p></li><li><p>Re-execute the Maven compile command.</p></li></ul></li><li><p>Unable to download <code>errorprone</code>:</p><div class="language-Failed line-numbers-mode" data-highlighter="prismjs" data-ext="Failed" data-title="Failed"><pre><code><span class="line">-shaded:jar:9+181-r4173-1: Could not transfer artifact com.google.errorprone:javac-shaded:pom:9+181-r4173-1</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>Solution:</p><pre><code>1. Manually download the jar package [javac-shaded-9+181-r4173-1.jar](https://repo1.maven.org/maven2/com/google/errorprone/javac-shaded/9+181-r4173-1/javac-shaded-9+181-r4173-1.jar)
2. Install the jar package to the local private repository:
</code></pre><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">mvn install:install-file -DgroupId=com.google.errorprone -DartifactId=javac-shaded -Dversion=9+181-r4173-1 -Dpackaging=jar -Dfile=D:\workspace\iotdb-master\docs\javac-shaded-9+181-r4173-1.jar</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div></li></ul><h2 id="references" tabindex="-1"><a class="header-anchor" href="#references"><span>References</span></a></h2><ul><li><p>Apache IoTDB Official Website:<a href="https://iotdb.apache.org/" target="_blank" rel="noopener noreferrer">https://iotdb.apache.org/</a></p></li><li><p>Code Repository:<a href="https://github.com/apache/iotdb" target="_blank" rel="noopener noreferrer">https://github.com/apache/iotdb</a></p></li><li><p>Go Language Repository: <a href="https://github.com/apache/iotdb-client-go" target="_blank" rel="noopener noreferrer">https://github.com/apache/iotdb-client-go</a></p></li><li><p>Documentation Repository:<a href="https://github.com/apache/iotdb-docs" target="_blank" rel="noopener noreferrer">https://github.com/apache/iotdb-docs</a></p></li><li><p>Resource Repository (project&#39;s documents, compiler, etc): <a href="https://github.com/apache/iotdb-bin-resources" target="_blank" rel="noopener noreferrer">https://github.com/apache/iotdb-bin-resources</a></p></li><li><p>Quick Start Guide:<a href="http://iotdb.apache.org/UserGuide/Master/QuickStart/QuickStart.html" target="_blank" rel="noopener noreferrer">http://iotdb.apache.org/UserGuide/Master/QuickStart/QuickStart.html</a></p></li><li><p>JIRA Task Management:<a href="https://issues.apache.org/jira/projects/IOTDB/issues" target="_blank" rel="noopener noreferrer">https://issues.apache.org/jira/projects/IOTDB/issues</a></p></li><li><p>WiKi Documentation:<a href="https://cwiki.apache.org/confluence/display/IOTDB/Home" target="_blank" rel="noopener noreferrer">https://cwiki.apache.org/confluence/display/IOTDB/Home</a></p></li><li><p>Mailing list: <a href="https://lists.apache.org/list.html?dev@iotdb.apache.org" target="_blank" rel="noopener noreferrer">https://lists.apache.org/list.html?dev@iotdb.apache.org</a></p></li><li><p>Daily Builds: <a href="https://ci-builds.apache.org/job/IoTDB/job/IoTDB-Pipe/job/master/" target="_blank" rel="noopener noreferrer">https://ci-builds.apache.org/job/IoTDB/job/IoTDB-Pipe/job/master/</a></p></li><li><p>Slack: <a href="https://apacheiotdb.slack.com/join/shared_invite/zt-qvso1nj8-7715TpySZtZqmyG5qXQwpg#/shared-invite/email" target="_blank" rel="noopener noreferrer">https://apacheiotdb.slack.com/join/shared_invite/zt-qvso1nj8-7715TpySZtZqmyG5qXQwpg#/shared-invite/email</a></p></li></ul></div><!----><footer class="vp-page-meta"><div class="vp-meta-item edit-link"><a class="auto-link external-link vp-meta-label" href="https://github.com/apache/iotdb-docs/edit/main/src/Community/Development-Guide.md" aria-label="Found Error? Edit this page on GitHub" rel="noopener noreferrer" target="_blank"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon" name="edit"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->Found Error? Edit this page on GitHub<!----></a></div><div class="vp-meta-item git-info"><div class="update-time"><span class="vp-meta-label">Last update: </span><!----></div><!----></div></footer><!----><!----><!----><!--]--></main><!--]--><!--]--><footer style="padding-bottom:2rem;"><span id="doc-version" style="display:none;">latest</span><p style="text-align:center;color:#909399;font-size:12px;margin:0 30px;">Copyright © 2024 The Apache Software Foundation.<br> Apache IoTDB, IoTDB, Apache, the Apache feather logo, and the Apache IoTDB project logo are either registered trademarks or trademarks of The Apache Software Foundation in all countries</p><p style="text-align:center;margin-top:10px;color:#909399;font-size:12px;margin:0 30px;"><strong>Have a question?</strong> Connect with us on QQ, WeChat, or Slack. <a href="https://github.com/apache/iotdb/issues/1995">Join the community</a> now.</p></footer></div><!--]--><!--]--><!--[--><!----><!--]--><!--]--></div>
<script type="module" src="/assets/app-COzQ4uU1.js" defer></script>
</body>
</html>