diff --git a/Cargo.lock b/Cargo.lock index 01e7925f2545..ee7cfd3550e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1259,6 +1259,7 @@ dependencies = [ "datatypes", "futures", "futures-util", + "humantime", "itertools 0.10.5", "lazy_static", "log-store", @@ -2859,6 +2860,7 @@ dependencies = [ "common-telemetry", "common-test-util", "common-time", + "common-version", "common-wal", "dashmap", "datafusion", @@ -3582,6 +3584,8 @@ dependencies = [ "common-runtime", "common-telemetry", "common-test-util", + "common-time", + "common-version", "datanode", "futures", "humantime-serde", @@ -3884,7 +3888,7 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "greptime-proto" version = "0.1.0" -source = "git+https://github.com/GreptimeTeam/greptime-proto.git?rev=aba235025ac5643c12bfdcefd656af11ad58ea8e#aba235025ac5643c12bfdcefd656af11ad58ea8e" +source = "git+https://github.com/killme2008/greptime-proto.git?rev=83991744468a010512758c2137ff3a4c9fd5eb91#83991744468a010512758c2137ff3a4c9fd5eb91" dependencies = [ "prost 0.12.4", "serde", diff --git a/Cargo.toml b/Cargo.toml index 061e0e8b186f..9ca5052ee7cc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -116,7 +116,7 @@ etcd-client = { git = "https://github.com/MichaelScofield/etcd-client.git", rev fst = "0.4.7" futures = "0.3" futures-util = "0.3" -greptime-proto = { git = "https://github.com/GreptimeTeam/greptime-proto.git", rev = "aba235025ac5643c12bfdcefd656af11ad58ea8e" } +greptime-proto = { git = "https://github.com/killme2008/greptime-proto.git", rev = "83991744468a010512758c2137ff3a4c9fd5eb91" } humantime = "2.1" humantime-serde = "1.1" itertools = "0.10" diff --git a/src/catalog/Cargo.toml b/src/catalog/Cargo.toml index 785f7981405b..ddda28ba8864 100644 --- a/src/catalog/Cargo.toml +++ b/src/catalog/Cargo.toml @@ -31,6 +31,7 @@ datafusion.workspace = true datatypes.workspace = true futures = "0.3" futures-util.workspace = true +humantime.workspace = true itertools.workspace = true lazy_static.workspace = true meta-client.workspace = true diff --git a/src/catalog/src/information_schema/cluster_info.rs b/src/catalog/src/information_schema/cluster_info.rs index 9319226c5aae..2f96c06c51be 100644 --- a/src/catalog/src/information_schema/cluster_info.rs +++ b/src/catalog/src/information_schema/cluster_info.rs @@ -13,6 +13,7 @@ // limitations under the License. use std::sync::{Arc, Weak}; +use std::time::Duration; use arrow_schema::SchemaRef as ArrowSchemaRef; use common_catalog::consts::INFORMATION_SCHEMA_CLUSTER_INFO_TABLE_ID; @@ -24,13 +25,17 @@ use common_query::physical_plan::TaskContext; use common_recordbatch::adapter::RecordBatchStreamAdapter; use common_recordbatch::{RecordBatch, SendableRecordBatchStream}; use common_telemetry::logging::warn; +use common_time::timestamp::Timestamp; use datafusion::physical_plan::stream::RecordBatchStreamAdapter as DfRecordBatchStreamAdapter; use datafusion::physical_plan::streaming::PartitionStream as DfPartitionStream; use datafusion::physical_plan::SendableRecordBatchStream as DfSendableRecordBatchStream; use datatypes::prelude::{ConcreteDataType, ScalarVectorBuilder, VectorRef}; use datatypes::schema::{ColumnSchema, Schema, SchemaRef}; +use datatypes::timestamp::TimestampMillisecond; use datatypes::value::Value; -use datatypes::vectors::{StringVectorBuilder, UInt64VectorBuilder}; +use datatypes::vectors::{ + StringVectorBuilder, TimestampMillisecondVectorBuilder, UInt64VectorBuilder, +}; use snafu::ResultExt; use store_api::storage::{ScanRequest, TableId}; @@ -44,7 +49,8 @@ const PEER_TYPE: &str = "peer_type"; const PEER_ADDR: &str = "peer_addr"; const VERSION: &str = "version"; const GIT_COMMIT: &str = "git_commit"; -// TODO(dennis): adds `uptime`, `start_time` columns etc. +const START_TIME: &str = "start_time"; +const UPTIME: &str = "uptime"; const INIT_CAPACITY: usize = 42; @@ -55,10 +61,13 @@ const INIT_CAPACITY: usize = 42; /// - `peer_addr`: the peer gRPC address. /// - `version`: the build package version of the peer. /// - `git_commit`: the build git commit hash of the peer. +/// - `start_time`: the starting time of the peer. +/// - `uptime`: the uptime of the peer. /// pub(super) struct InformationSchemaClusterInfo { schema: SchemaRef, catalog_manager: Weak, + start_time_ms: u64, } impl InformationSchemaClusterInfo { @@ -66,6 +75,7 @@ impl InformationSchemaClusterInfo { Self { schema: Self::schema(), catalog_manager, + start_time_ms: common_time::util::current_time_millis() as u64, } } @@ -76,11 +86,21 @@ impl InformationSchemaClusterInfo { ColumnSchema::new(PEER_ADDR, ConcreteDataType::string_datatype(), true), ColumnSchema::new(VERSION, ConcreteDataType::string_datatype(), false), ColumnSchema::new(GIT_COMMIT, ConcreteDataType::string_datatype(), false), + ColumnSchema::new( + START_TIME, + ConcreteDataType::timestamp_millisecond_datatype(), + true, + ), + ColumnSchema::new(UPTIME, ConcreteDataType::string_datatype(), true), ])) } fn builder(&self) -> InformationSchemaClusterInfoBuilder { - InformationSchemaClusterInfoBuilder::new(self.schema.clone(), self.catalog_manager.clone()) + InformationSchemaClusterInfoBuilder::new( + self.schema.clone(), + self.catalog_manager.clone(), + self.start_time_ms, + ) } } @@ -120,6 +140,7 @@ impl InformationTable for InformationSchemaClusterInfo { struct InformationSchemaClusterInfoBuilder { schema: SchemaRef, + start_time_ms: u64, catalog_manager: Weak, peer_ids: UInt64VectorBuilder, @@ -127,10 +148,16 @@ struct InformationSchemaClusterInfoBuilder { peer_addrs: StringVectorBuilder, versions: StringVectorBuilder, git_commits: StringVectorBuilder, + start_times: TimestampMillisecondVectorBuilder, + uptimes: StringVectorBuilder, } impl InformationSchemaClusterInfoBuilder { - fn new(schema: SchemaRef, catalog_manager: Weak) -> Self { + fn new( + schema: SchemaRef, + catalog_manager: Weak, + start_time_ms: u64, + ) -> Self { Self { schema, catalog_manager, @@ -139,6 +166,9 @@ impl InformationSchemaClusterInfoBuilder { peer_addrs: StringVectorBuilder::with_capacity(INIT_CAPACITY), versions: StringVectorBuilder::with_capacity(INIT_CAPACITY), git_commits: StringVectorBuilder::with_capacity(INIT_CAPACITY), + start_times: TimestampMillisecondVectorBuilder::with_capacity(INIT_CAPACITY), + uptimes: StringVectorBuilder::with_capacity(INIT_CAPACITY), + start_time_ms, } } @@ -164,7 +194,10 @@ impl InformationSchemaClusterInfoBuilder { last_activity_ts: -1, status: NodeStatus::Standalone, version: build_info.version.to_string(), - git_commit: build_info.commit.to_string(), + git_commit: build_info.commit_short.to_string(), + // Use `self.start_time_ms` instead. + // It's not precise but enough. + start_time_ms: self.start_time_ms, }, ); } @@ -208,6 +241,19 @@ impl InformationSchemaClusterInfoBuilder { self.peer_addrs.push(Some(&node_info.peer.addr)); self.versions.push(Some(&node_info.version)); self.git_commits.push(Some(&node_info.git_commit)); + if node_info.start_time_ms > 0 { + self.start_times + .push(Some(TimestampMillisecond(Timestamp::new_millisecond( + node_info.start_time_ms as i64, + )))); + let now = common_time::util::current_time_millis() as u64; + let duration_since_start = now - node_info.start_time_ms; + let format = humantime::format_duration(Duration::from_millis(duration_since_start)); + self.uptimes.push(Some(format.to_string().as_str())); + } else { + self.start_times.push(None); + self.uptimes.push(None); + } } fn finish(&mut self) -> Result { @@ -217,6 +263,8 @@ impl InformationSchemaClusterInfoBuilder { Arc::new(self.peer_addrs.finish()), Arc::new(self.versions.finish()), Arc::new(self.git_commits.finish()), + Arc::new(self.start_times.finish()), + Arc::new(self.uptimes.finish()), ]; RecordBatch::new(self.schema.clone(), columns).context(CreateRecordBatchSnafu) } diff --git a/src/catalog/src/information_schema/region_peers.rs b/src/catalog/src/information_schema/region_peers.rs index 9a436ab7f7b7..004941a17cb5 100644 --- a/src/catalog/src/information_schema/region_peers.rs +++ b/src/catalog/src/information_schema/region_peers.rs @@ -55,7 +55,7 @@ const INIT_CAPACITY: usize = 42; /// /// - `region_id`: the region id /// - `peer_id`: the region storage datanode peer id -/// - `peer_addr`: the region storage datanode peer address +/// - `peer_addr`: the region storage datanode gRPC peer address /// - `is_leader`: whether the peer is the leader /// - `status`: the region status, `ALIVE` or `DOWNGRADED`. /// - `down_seconds`: the duration of being offline, in seconds. diff --git a/src/catalog/src/information_schema/runtime_metrics.rs b/src/catalog/src/information_schema/runtime_metrics.rs index f665b9c80eab..5ed641f77d31 100644 --- a/src/catalog/src/information_schema/runtime_metrics.rs +++ b/src/catalog/src/information_schema/runtime_metrics.rs @@ -184,14 +184,13 @@ impl InformationSchemaMetricsBuilder { .join(", "), // Safety: always has a sample ts.samples[0].value, - // TODO(dennis): fetching other peers metrics - // The peer column is always `None` for standalone None, "standalone", ); } + // FIXME(dennis): fetching other peers metrics self.finish() } diff --git a/src/cmd/src/frontend.rs b/src/cmd/src/frontend.rs index 81fed9280248..e6e13004af29 100644 --- a/src/cmd/src/frontend.rs +++ b/src/cmd/src/frontend.rs @@ -268,6 +268,7 @@ impl StartCommand { ]); let heartbeat_task = HeartbeatTask::new( + &opts, meta_client.clone(), opts.heartbeat.clone(), Arc::new(executor), diff --git a/src/common/meta/src/cluster.rs b/src/common/meta/src/cluster.rs index 5dc8a640148d..c45afcc195c1 100644 --- a/src/common/meta/src/cluster.rs +++ b/src/common/meta/src/cluster.rs @@ -90,6 +90,8 @@ pub struct NodeInfo { pub version: String, // The node build git commit hash pub git_commit: String, + // The node star timestamp + pub start_time_ms: u64, } #[derive(Debug, Clone, Eq, Hash, PartialEq, Serialize, Deserialize)] @@ -290,6 +292,7 @@ mod tests { }), version: "".to_string(), git_commit: "".to_string(), + start_time_ms: 1, }; let node_info_bytes: Vec = node_info.try_into().unwrap(); @@ -306,6 +309,7 @@ mod tests { leader_regions: 3, follower_regions: 4, }), + start_time_ms: 1, .. } ); diff --git a/src/datanode/Cargo.toml b/src/datanode/Cargo.toml index 4df93d393cf2..6a34918e24b9 100644 --- a/src/datanode/Cargo.toml +++ b/src/datanode/Cargo.toml @@ -30,6 +30,7 @@ common-recordbatch.workspace = true common-runtime.workspace = true common-telemetry.workspace = true common-time.workspace = true +common-version.workspace = true common-wal.workspace = true dashmap.workspace = true datafusion.workspace = true diff --git a/src/datanode/src/heartbeat.rs b/src/datanode/src/heartbeat.rs index 28253f00e59c..01ebacec6508 100644 --- a/src/datanode/src/heartbeat.rs +++ b/src/datanode/src/heartbeat.rs @@ -16,7 +16,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::time::Duration; -use api::v1::meta::{HeartbeatRequest, Peer, RegionRole, RegionStat, Role}; +use api::v1::meta::{HeartbeatRequest, NodeInfo, Peer, RegionRole, RegionStat, Role}; use common_grpc::channel_manager::{ChannelConfig, ChannelManager}; use common_meta::distributed_time_constants::META_KEEP_ALIVE_INTERVAL_SECS; use common_meta::heartbeat::handler::parse_mailbox_message::ParseMailboxMessageHandler; @@ -43,6 +43,7 @@ use crate::region_server::RegionServer; pub(crate) mod handler; pub(crate) mod task_tracker; +/// The datanode heartbeat task which sending `[HeartbeatRequest]` to Metasrv periodically in background. pub struct HeartbeatTask { node_id: u64, node_epoch: u64, @@ -246,6 +247,7 @@ impl HeartbeatTask { } } _ = &mut sleep => { + let build_info = common_version::build_info(); let region_stats = Self::load_region_stats(®ion_server_clone).await; let now = Instant::now(); let duration_since_epoch = (now - epoch).as_millis() as u64; @@ -254,6 +256,12 @@ impl HeartbeatTask { region_stats, duration_since_epoch, node_epoch, + info: Some(NodeInfo { + version: build_info.version.to_string(), + git_commit: build_info.commit_short.to_string(), + // The start timestamp is the same as node_epoch currently. + start_time_ms: node_epoch, + }), ..Default::default() }; sleep.as_mut().reset(now + Duration::from_millis(interval)); diff --git a/src/frontend/Cargo.toml b/src/frontend/Cargo.toml index 0d4e666f8c77..512531565d78 100644 --- a/src/frontend/Cargo.toml +++ b/src/frontend/Cargo.toml @@ -33,6 +33,8 @@ common-query.workspace = true common-recordbatch.workspace = true common-runtime.workspace = true common-telemetry.workspace = true +common-time.workspace = true +common-version.workspace = true datanode.workspace = true humantime-serde.workspace = true lazy_static.workspace = true diff --git a/src/frontend/src/heartbeat.rs b/src/frontend/src/heartbeat.rs index ffe52eece82b..726265b25b3d 100644 --- a/src/frontend/src/heartbeat.rs +++ b/src/frontend/src/heartbeat.rs @@ -14,7 +14,7 @@ use std::sync::Arc; -use api::v1::meta::HeartbeatRequest; +use api::v1::meta::{HeartbeatRequest, NodeInfo, Peer}; use common_meta::heartbeat::handler::{ HeartbeatResponseHandlerContext, HeartbeatResponseHandlerExecutorRef, }; @@ -30,28 +30,40 @@ use tokio::time::{Duration, Instant}; use crate::error; use crate::error::Result; +use crate::frontend::FrontendOptions; pub mod handler; +/// The frontend heartbeat task which sending `[HeartbeatRequest]` to Metasrv periodically in background. #[derive(Clone)] pub struct HeartbeatTask { + node_id: u64, + server_addr: String, meta_client: Arc, report_interval: u64, retry_interval: u64, resp_handler_executor: HeartbeatResponseHandlerExecutorRef, + start_time_ms: u64, } impl HeartbeatTask { pub fn new( + opts: &FrontendOptions, meta_client: Arc, heartbeat_opts: HeartbeatOptions, resp_handler_executor: HeartbeatResponseHandlerExecutorRef, ) -> Self { HeartbeatTask { + // FIXME(dennis): the node_id in FrontendOptions is a string + // so we use 0 instead currently. + node_id: 0, + // We use datanode's start time millis as the node's epoch. + server_addr: opts.grpc.addr.clone(), meta_client, report_interval: heartbeat_opts.interval.as_millis() as u64, retry_interval: heartbeat_opts.retry_interval.as_millis() as u64, resp_handler_executor, + start_time_ms: common_time::util::current_time_millis() as u64, } } @@ -102,12 +114,27 @@ impl HeartbeatTask { }); } + fn build_node_info(start_time_ms: u64) -> NodeInfo { + let build_info = common_version::build_info(); + + NodeInfo { + version: build_info.version.to_string(), + git_commit: build_info.commit_short.to_string(), + start_time_ms, + } + } + fn start_heartbeat_report( &self, req_sender: HeartbeatSender, mut outgoing_rx: Receiver, ) { let report_interval = self.report_interval; + let start_time_ms = self.start_time_ms; + let self_peer = Some(Peer { + id: self.node_id, + addr: self.server_addr.clone(), + }); common_runtime::spawn_bg(async move { let sleep = tokio::time::sleep(Duration::from_millis(0)); @@ -121,6 +148,8 @@ impl HeartbeatTask { Ok(message) => { let req = HeartbeatRequest { mailbox_message: Some(message), + peer: self_peer.clone(), + info: Some(Self::build_node_info(start_time_ms)), ..Default::default() }; Some(req) @@ -138,6 +167,8 @@ impl HeartbeatTask { _ = &mut sleep => { sleep.as_mut().reset(Instant::now() + Duration::from_millis(report_interval)); let req = HeartbeatRequest { + peer: self_peer.clone(), + info: Some(Self::build_node_info(start_time_ms)), ..Default::default() }; Some(req) diff --git a/src/meta-client/src/client.rs b/src/meta-client/src/client.rs index 1a57fe2a51e9..685c12ee8a95 100644 --- a/src/meta-client/src/client.rs +++ b/src/meta-client/src/client.rs @@ -264,9 +264,12 @@ impl ClusterInfo for MetaClient { let mut nodes = if get_metasrv_nodes { let last_activity_ts = -1; // Metasrv does not provide this information. - // TODO(dennis): Get Metasrv build info + + // TODO(dennis): Get Metasrv node info let git_commit = "unknown"; let version = "unknown"; + let start_time_ms = 0; + let (leader, followers) = cluster_client.get_metasrv_peers().await?; followers .into_iter() @@ -276,6 +279,7 @@ impl ClusterInfo for MetaClient { status: NodeStatus::Metasrv(MetasrvStatus { is_leader: false }), version: version.to_string(), git_commit: git_commit.to_string(), + start_time_ms, }) .chain(leader.into_iter().map(|leader| NodeInfo { peer: leader, @@ -283,6 +287,7 @@ impl ClusterInfo for MetaClient { status: NodeStatus::Metasrv(MetasrvStatus { is_leader: true }), version: version.to_string(), git_commit: git_commit.to_string(), + start_time_ms, })) .collect::>() } else { diff --git a/src/meta-srv/src/handler/collect_cluster_info_handler.rs b/src/meta-srv/src/handler/collect_cluster_info_handler.rs index db4ffb9c9984..6fc3937e4e45 100644 --- a/src/meta-srv/src/handler/collect_cluster_info_handler.rs +++ b/src/meta-srv/src/handler/collect_cluster_info_handler.rs @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use api::v1::meta::{HeartbeatRequest, Role}; +use api::v1::meta::{HeartbeatRequest, NodeInfo as PbNodeInfo, Role}; use common_meta::cluster; use common_meta::cluster::{DatanodeStatus, FrontendStatus, NodeInfo, NodeInfoKey, NodeStatus}; use common_meta::peer::Peer; @@ -40,17 +40,17 @@ impl HeartbeatHandler for CollectFrontendClusterInfoHandler { ctx: &mut Context, _acc: &mut HeartbeatAccumulator, ) -> Result { - let Some((key, peer)) = extract_base_info(req, Role::Frontend) else { + let Some((key, peer, info)) = extract_base_info(req, Role::Frontend) else { return Ok(HandleControl::Continue); }; - let build_info = common_version::build_info(); let value = NodeInfo { peer, last_activity_ts: common_time::util::current_time_millis(), status: NodeStatus::Frontend(FrontendStatus {}), - version: build_info.version.to_string(), - git_commit: build_info.commit.to_string(), + version: info.version, + git_commit: info.git_commit, + start_time_ms: info.start_time_ms, }; save_to_mem_store(key, value, ctx).await?; @@ -74,7 +74,7 @@ impl HeartbeatHandler for CollectDatanodeClusterInfoHandler { ctx: &mut Context, acc: &mut HeartbeatAccumulator, ) -> Result { - let Some((key, peer)) = extract_base_info(req, Role::Datanode) else { + let Some((key, peer, info)) = extract_base_info(req, Role::Datanode) else { return Ok(HandleControl::Continue); }; @@ -89,8 +89,6 @@ impl HeartbeatHandler for CollectDatanodeClusterInfoHandler { .count(); let follower_regions = stat.region_stats.len() - leader_regions; - let build_info = common_version::build_info(); - let value = NodeInfo { peer, last_activity_ts: stat.timestamp_millis, @@ -100,8 +98,9 @@ impl HeartbeatHandler for CollectDatanodeClusterInfoHandler { leader_regions, follower_regions, }), - version: build_info.version.to_string(), - git_commit: build_info.commit.to_string(), + version: info.version, + git_commit: info.git_commit, + start_time_ms: info.start_time_ms, }; save_to_mem_store(key, value, ctx).await?; @@ -110,14 +109,22 @@ impl HeartbeatHandler for CollectDatanodeClusterInfoHandler { } } -fn extract_base_info(req: &HeartbeatRequest, role: Role) -> Option<(NodeInfoKey, Peer)> { - let HeartbeatRequest { header, peer, .. } = req; +fn extract_base_info( + req: &HeartbeatRequest, + role: Role, +) -> Option<(NodeInfoKey, Peer, PbNodeInfo)> { + let HeartbeatRequest { + header, peer, info, .. + } = req; let Some(header) = &header else { return None; }; let Some(peer) = &peer else { return None; }; + let Some(info) = &info else { + return None; + }; Some(( NodeInfoKey { @@ -129,6 +136,7 @@ fn extract_base_info(req: &HeartbeatRequest, role: Role) -> Option<(NodeInfoKey, node_id: peer.id, }, Peer::from(peer.clone()), + info.clone(), )) } diff --git a/src/meta-srv/src/service/cluster.rs b/src/meta-srv/src/service/cluster.rs index 69056ffe1bb2..9252eba62cb9 100644 --- a/src/meta-srv/src/service/cluster.rs +++ b/src/meta-srv/src/service/cluster.rs @@ -128,6 +128,7 @@ impl cluster_server::Cluster for Metasrv { impl Metasrv { pub fn is_leader(&self) -> bool { - self.election().map(|x| x.is_leader()).unwrap_or(false) + // Returns true when using memory backend. + self.election().map(|x| x.is_leader()).unwrap_or(true) } } diff --git a/tests-integration/src/cluster.rs b/tests-integration/src/cluster.rs index 2dda1a276c31..cf8016a435c9 100644 --- a/tests-integration/src/cluster.rs +++ b/tests-integration/src/cluster.rs @@ -39,6 +39,7 @@ use common_test_util::temp_dir::create_temp_dir; use common_wal::config::{DatanodeWalConfig, MetasrvWalConfig}; use datanode::config::{DatanodeOptions, ObjectStoreConfig}; use datanode::datanode::{Datanode, DatanodeBuilder, ProcedureConfig}; +use frontend::frontend::FrontendOptions; use frontend::heartbeat::handler::invalidate_table_cache::InvalidateTableCacheHandler; use frontend::heartbeat::HeartbeatTask; use frontend::instance::builder::FrontendBuilder; @@ -372,6 +373,7 @@ impl GreptimeDbClusterBuilder { ]); let heartbeat_task = HeartbeatTask::new( + &FrontendOptions::default(), meta_client.clone(), HeartbeatOptions::default(), Arc::new(handlers_executor), diff --git a/tests/cases/distributed/information_schema/cluster_info.result b/tests/cases/distributed/information_schema/cluster_info.result index 4492b92801ef..892c6be49878 100644 --- a/tests/cases/distributed/information_schema/cluster_info.result +++ b/tests/cases/distributed/information_schema/cluster_info.result @@ -4,30 +4,95 @@ Affected Rows: 0 DESC TABLE CLUSTER_INFO; -+------------+--------+-----+------+---------+---------------+ -| Column | Type | Key | Null | Default | Semantic Type | -+------------+--------+-----+------+---------+---------------+ -| peer_id | UInt64 | | NO | | FIELD | -| peer_type | String | | NO | | FIELD | -| peer_addr | String | | YES | | FIELD | -| version | String | | NO | | FIELD | -| git_commit | String | | NO | | FIELD | -+------------+--------+-----+------+---------+---------------+ ++------------+----------------------+-----+------+---------+---------------+ +| Column | Type | Key | Null | Default | Semantic Type | ++------------+----------------------+-----+------+---------+---------------+ +| peer_id | UInt64 | | NO | | FIELD | +| peer_type | String | | NO | | FIELD | +| peer_addr | String | | YES | | FIELD | +| version | String | | NO | | FIELD | +| git_commit | String | | NO | | FIELD | +| start_time | TimestampMillisecond | | YES | | FIELD | +| uptime | String | | YES | | FIELD | ++------------+----------------------+-----+------+---------+---------------+ +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE unknown UNKNOWN +-- SQLNESS REPLACE (\s\d\.\d\.\d\s) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO; -Error: 3001(EngineExecuteQuery), Internal error: Failed to list nodes in cluster: Retry exceeded max times(3), message: Failed to get_metasrv_peers, last error: Some("127.0.0.1:3002 is not a leader"). -This was likely caused by a bug in DataFusion's code and we would welcome that you file an bug report in our issue tracker ++---------+-----------+----------------+---------+------------+-------------------------+----------+ +| peer_id | peer_type | peer_addr | node_version | git_commit | start_time | uptime | ++---------+-----------+----------------+---------+------------+-------------------------+----------+ +| 0 | METASRV | 127.0.0.1:3002 | UNKNOWN | UNKNOWN | | | +| 1 | DATANODE | 127.0.0.1:4101 |Version |Hash |Start_time|Uptime| +| 2 | DATANODE | 127.0.0.1:4102 |Version |Hash |Start_time|Uptime | +| 3 | DATANODE | 127.0.0.1:4103 |Version |Hash |Start_time|Uptime| +| 0 | FRONTEND | 127.0.0.1:4001 |Version |Hash |Start_time|Uptime | ++---------+-----------+----------------+---------+------------+-------------------------+----------+ +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE unknown UNKNOWN +-- SQLNESS REPLACE (\s\d\.\d\.\d\s) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO WHERE PEER_TYPE = 'METASRV'; -Error: 3001(EngineExecuteQuery), Internal error: Failed to list nodes in cluster: Retry exceeded max times(3), message: Failed to get_metasrv_peers, last error: Some("127.0.0.1:3002 is not a leader"). -This was likely caused by a bug in DataFusion's code and we would welcome that you file an bug report in our issue tracker ++---------+-----------+----------------+---------+------------+------------+--------+ +| peer_id | peer_type | peer_addr | node_version | git_commit | start_time | uptime | ++---------+-----------+----------------+---------+------------+------------+--------+ +| 0 | METASRV | 127.0.0.1:3002 | UNKNOWN | UNKNOWN | | | ++---------+-----------+----------------+---------+------------+------------+--------+ +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE unknown UNKNOWN +-- SQLNESS REPLACE (\s\d\.\d\.\d\s) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime +SELECT * FROM CLUSTER_INFO WHERE PEER_TYPE = 'FRONTEND'; + ++---------+-----------+----------------+---------+------------+-------------------------+--------+ +| peer_id | peer_type | peer_addr | node_version | git_commit | start_time | uptime | ++---------+-----------+----------------+---------+------------+-------------------------+--------+ +| 0 | FRONTEND | 127.0.0.1:4001 |Version |Hash |Start_time|Uptime | ++---------+-----------+----------------+---------+------------+-------------------------+--------+ + +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE unknown UNKNOWN +-- SQLNESS REPLACE (\s\d\.\d\.\d\s) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime +SELECT * FROM CLUSTER_INFO WHERE PEER_TYPE != 'FRONTEND'; + ++---------+-----------+----------------+---------+------------+-------------------------+----------+ +| peer_id | peer_type | peer_addr | node_version | git_commit | start_time | uptime | ++---------+-----------+----------------+---------+------------+-------------------------+----------+ +| 0 | METASRV | 127.0.0.1:3002 | UNKNOWN | UNKNOWN | | | +| 1 | DATANODE | 127.0.0.1:4101 |Version |Hash |Start_time|Uptime| +| 2 | DATANODE | 127.0.0.1:4102 |Version |Hash |Start_time|Uptime| +| 3 | DATANODE | 127.0.0.1:4103 |Version |Hash |Start_time|Uptime| ++---------+-----------+----------------+---------+------------+-------------------------+----------+ + +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE unknown UNKNOWN +-- SQLNESS REPLACE (\s\d\.\d\.\d\s) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO WHERE PEER_ID > 1; -Error: 3001(EngineExecuteQuery), Internal error: Failed to list nodes in cluster: Retry exceeded max times(3), message: Failed to get_metasrv_peers, last error: Some("127.0.0.1:3002 is not a leader"). -This was likely caused by a bug in DataFusion's code and we would welcome that you file an bug report in our issue tracker ++---------+-----------+----------------+---------+------------+-------------------------+----------+ +| peer_id | peer_type | peer_addr | node_version | git_commit | start_time | uptime | ++---------+-----------+----------------+---------+------------+-------------------------+----------+ +| 2 | DATANODE | 127.0.0.1:4102 |Version |Hash |Start_time|Uptime| +| 3 | DATANODE | 127.0.0.1:4103 |Version |Hash |Start_time|Uptime| ++---------+-----------+----------------+---------+------------+-------------------------+----------+ USE PUBLIC; diff --git a/tests/cases/distributed/information_schema/cluster_info.sql b/tests/cases/distributed/information_schema/cluster_info.sql index 9a129ccdef91..81e36b336425 100644 --- a/tests/cases/distributed/information_schema/cluster_info.sql +++ b/tests/cases/distributed/information_schema/cluster_info.sql @@ -2,10 +2,44 @@ USE INFORMATION_SCHEMA; DESC TABLE CLUSTER_INFO; +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE unknown UNKNOWN +-- SQLNESS REPLACE (\s\d\.\d\.\d\s) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO; +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE unknown UNKNOWN +-- SQLNESS REPLACE (\s\d\.\d\.\d\s) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO WHERE PEER_TYPE = 'METASRV'; +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE unknown UNKNOWN +-- SQLNESS REPLACE (\s\d\.\d\.\d\s) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime +SELECT * FROM CLUSTER_INFO WHERE PEER_TYPE = 'FRONTEND'; + +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE unknown UNKNOWN +-- SQLNESS REPLACE (\s\d\.\d\.\d\s) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime +SELECT * FROM CLUSTER_INFO WHERE PEER_TYPE != 'FRONTEND'; + +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE unknown UNKNOWN +-- SQLNESS REPLACE (\s\d\.\d\.\d\s) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO WHERE PEER_ID > 1; USE PUBLIC; diff --git a/tests/cases/standalone/information_schema/cluster_info.result b/tests/cases/standalone/information_schema/cluster_info.result index b2a73f48b9ad..445b158be953 100644 --- a/tests/cases/standalone/information_schema/cluster_info.result +++ b/tests/cases/standalone/information_schema/cluster_info.result @@ -4,44 +4,61 @@ Affected Rows: 0 DESC TABLE CLUSTER_INFO; -+------------+--------+-----+------+---------+---------------+ -| Column | Type | Key | Null | Default | Semantic Type | -+------------+--------+-----+------+---------+---------------+ -| peer_id | UInt64 | | NO | | FIELD | -| peer_type | String | | NO | | FIELD | -| peer_addr | String | | YES | | FIELD | -| version | String | | NO | | FIELD | -| git_commit | String | | NO | | FIELD | -+------------+--------+-----+------+---------+---------------+ - ++------------+----------------------+-----+------+---------+---------------+ +| Column | Type | Key | Null | Default | Semantic Type | ++------------+----------------------+-----+------+---------+---------------+ +| peer_id | UInt64 | | NO | | FIELD | +| peer_type | String | | NO | | FIELD | +| peer_addr | String | | YES | | FIELD | +| version | String | | NO | | FIELD | +| git_commit | String | | NO | | FIELD | +| start_time | TimestampMillisecond | | YES | | FIELD | +| uptime | String | | YES | | FIELD | ++------------+----------------------+-----+------+---------+---------------+ + +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE (\d\.\d\.\d) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO; -+---------+------------+-----------+---------+------------------------------------------+ -| peer_id | peer_type | peer_addr | version | git_commit | -+---------+------------+-----------+---------+------------------------------------------+ -| 0 | STANDALONE | | 0.7.2 | c67f97aed07d2938b41ca9559af5bff48ff3f864 | -+---------+------------+-----------+---------+------------------------------------------+ - ++---------+------------+-----------+---------+------------+-------------------------+--------+ +| peer_id | peer_type | peer_addr | node_version | git_commit | start_time | uptime | ++---------+------------+-----------+---------+------------+-------------------------+--------+ +| 0 | STANDALONE | | Version |Hash |Start_time|Uptime | ++---------+------------+-----------+---------+------------+-------------------------+--------+ + +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE (\d\.\d\.\d) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO WHERE PEER_TYPE = 'STANDALONE'; -+---------+------------+-----------+---------+------------------------------------------+ -| peer_id | peer_type | peer_addr | version | git_commit | -+---------+------------+-----------+---------+------------------------------------------+ -| 0 | STANDALONE | | 0.7.2 | c67f97aed07d2938b41ca9559af5bff48ff3f864 | -+---------+------------+-----------+---------+------------------------------------------+ ++---------+------------+-----------+---------+------------+-------------------------+--------+ +| peer_id | peer_type | peer_addr | node_version | git_commit | start_time | uptime | ++---------+------------+-----------+---------+------------+-------------------------+--------+ +| 0 | STANDALONE | | Version |Hash |Start_time|Uptime | ++---------+------------+-----------+---------+------------+-------------------------+--------+ SELECT * FROM CLUSTER_INFO WHERE PEER_TYPE != 'STANDALONE'; ++ ++ +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE (\d\.\d\.\d) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO WHERE PEER_ID = 0; -+---------+------------+-----------+---------+------------------------------------------+ -| peer_id | peer_type | peer_addr | version | git_commit | -+---------+------------+-----------+---------+------------------------------------------+ -| 0 | STANDALONE | | 0.7.2 | c67f97aed07d2938b41ca9559af5bff48ff3f864 | -+---------+------------+-----------+---------+------------------------------------------+ ++---------+------------+-----------+---------+------------+-------------------------+--------+ +| peer_id | peer_type | peer_addr | node_version | git_commit | start_time | uptime | ++---------+------------+-----------+---------+------------+-------------------------+--------+ +| 0 | STANDALONE | | Version |Hash |Start_time|Uptime | ++---------+------------+-----------+---------+------------+-------------------------+--------+ SELECT * FROM CLUSTER_INFO WHERE PEER_ID > 0; diff --git a/tests/cases/standalone/information_schema/cluster_info.sql b/tests/cases/standalone/information_schema/cluster_info.sql index 725038dc2419..d11f7affd595 100644 --- a/tests/cases/standalone/information_schema/cluster_info.sql +++ b/tests/cases/standalone/information_schema/cluster_info.sql @@ -2,12 +2,27 @@ USE INFORMATION_SCHEMA; DESC TABLE CLUSTER_INFO; +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE (\d\.\d\.\d) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO; +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE (\d\.\d\.\d) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO WHERE PEER_TYPE = 'STANDALONE'; SELECT * FROM CLUSTER_INFO WHERE PEER_TYPE != 'STANDALONE'; +-- SQLNESS REPLACE version node_version +-- SQLNESS REPLACE (\d\.\d\.\d) Version +-- SQLNESS REPLACE (\s[a-z0-9]{7}\s) Hash +-- SQLNESS REPLACE (\s[\-0-9T:\.]{23}\s) Start_time +-- SQLNESS REPLACE (\s(\d+(s|ms|m)\s)+) Uptime SELECT * FROM CLUSTER_INFO WHERE PEER_ID = 0; SELECT * FROM CLUSTER_INFO WHERE PEER_ID > 0;