1#![doc = include_str!("../../../../README.md")]
16
17use clap::{Parser, Subcommand};
18use cmd::datanode::builder::InstanceBuilder;
19use cmd::error::{InitTlsProviderSnafu, Result};
20use cmd::options::GlobalOptions;
21use cmd::{App, cli, datanode, flownode, frontend, metasrv, standalone};
22use common_base::Plugins;
23use common_version::{verbose_version, version};
24use servers::install_ring_crypto_provider;
25
26#[derive(Parser)]
27#[command(name = "greptime", author, version, long_version = verbose_version(), about)]
28#[command(propagate_version = true)]
29pub(crate) struct Command {
30 #[clap(subcommand)]
31 pub(crate) subcmd: SubCommand,
32
33 #[clap(flatten)]
34 pub(crate) global_options: GlobalOptions,
35}
36
37#[derive(Subcommand)]
38enum SubCommand {
39 #[clap(name = "datanode")]
41 Datanode(datanode::Command),
42
43 #[clap(name = "flownode")]
45 Flownode(flownode::Command),
46
47 #[clap(name = "frontend")]
49 Frontend(frontend::Command),
50
51 #[clap(name = "metasrv")]
53 Metasrv(metasrv::Command),
54
55 #[clap(name = "standalone")]
57 Standalone(standalone::Command),
58
59 #[clap(name = "cli")]
61 Cli(cli::Command),
62}
63
64#[cfg(not(windows))]
65#[global_allocator]
66static ALLOC: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc;
67
68#[cfg(debug_assertions)]
69fn main() -> Result<()> {
70 use snafu::ResultExt;
71 std::thread::Builder::new()
75 .name("main_spawn".to_string())
76 .stack_size(8 * 1024 * 1024)
77 .spawn(|| {
78 {
79 tokio::runtime::Builder::new_multi_thread()
80 .thread_stack_size(8 * 1024 * 1024)
81 .enable_all()
82 .build()
83 .expect("Failed building the Runtime")
84 .block_on(main_body())
85 }
86 })
87 .context(cmd::error::SpawnThreadSnafu)?
88 .join()
89 .expect("Couldn't join on the associated thread")
90}
91
92#[cfg(not(debug_assertions))]
93#[tokio::main]
94async fn main() -> Result<()> {
95 main_body().await
96}
97
98async fn main_body() -> Result<()> {
99 setup_human_panic();
100 install_ring_crypto_provider().map_err(|msg| InitTlsProviderSnafu { msg }.build())?;
101 start(Command::parse()).await
102}
103
104async fn start(cli: Command) -> Result<()> {
105 match cli.subcmd {
106 SubCommand::Datanode(cmd) => match cmd.subcmd {
107 datanode::SubCommand::Start(ref start) => {
108 let opts = start.load_options(&cli.global_options)?;
109 let plugins = Plugins::new();
110 let builder = InstanceBuilder::try_new_with_init(opts, plugins).await?;
111 cmd.build_with(builder).await?.run().await
112 }
113 datanode::SubCommand::Objbench(ref bench) => bench.run().await,
114 },
115 SubCommand::Flownode(cmd) => {
116 cmd.build(cmd.load_options(&cli.global_options)?)
117 .await?
118 .run()
119 .await
120 }
121 SubCommand::Frontend(cmd) => {
122 cmd.build(cmd.load_options(&cli.global_options)?)
123 .await?
124 .run()
125 .await
126 }
127 SubCommand::Metasrv(cmd) => {
128 cmd.build(cmd.load_options(&cli.global_options)?)
129 .await?
130 .run()
131 .await
132 }
133 SubCommand::Standalone(cmd) => {
134 cmd.build(cmd.load_options(&cli.global_options)?)
135 .await?
136 .run()
137 .await
138 }
139 SubCommand::Cli(cmd) => {
140 cmd.build(cmd.load_options(&cli.global_options)?)
141 .await?
142 .run()
143 .await
144 }
145 }
146}
147
148fn setup_human_panic() {
149 human_panic::setup_panic!(
150 human_panic::Metadata::new("GreptimeDB", version())
151 .homepage("https://github.com/GreptimeTeam/greptimedb/discussions")
152 );
153
154 common_telemetry::set_panic_hook();
155}