Skip to content
Snippets Groups Projects
Commit e6aaa459 authored by Georgy Moshkin's avatar Georgy Moshkin :speech_balloon:
Browse files

feat: .proc_runtime_info

parent 573aec7b
No related branches found
No related tags found
1 merge request!840Info proc API
...@@ -4,6 +4,8 @@ use crate::replicaset::ReplicasetId; ...@@ -4,6 +4,8 @@ use crate::replicaset::ReplicasetId;
use crate::traft::error::Error; use crate::traft::error::Error;
use crate::traft::node; use crate::traft::node;
use crate::traft::RaftId; use crate::traft::RaftId;
use crate::traft::RaftIndex;
use crate::traft::RaftTerm;
use std::borrow::Cow; use std::borrow::Cow;
use tarantool::proc; use tarantool::proc;
...@@ -180,3 +182,59 @@ pub fn proc_raft_info() -> Result<RaftInfo, Error> { ...@@ -180,3 +182,59 @@ pub fn proc_raft_info() -> Result<RaftInfo, Error> {
Ok(RaftInfo::get(node)) Ok(RaftInfo::get(node))
} }
////////////////////////////////////////////////////////////////////////////////
// InternalInfo
////////////////////////////////////////////////////////////////////////////////
#[derive(Clone, Debug, ::serde::Serialize, ::serde::Deserialize)]
pub struct InternalInfo<'a> {
pub main_loop_status: Cow<'a, str>,
pub governor_loop_status: Cow<'a, str>,
}
impl tarantool::tuple::Encode for InternalInfo<'_> {}
impl InternalInfo<'static> {
pub fn get(node: &node::Node) -> Self {
InternalInfo {
main_loop_status: node.status().main_loop_status.into(),
governor_loop_status: node.governor_loop.status.get().governor_loop_status.into(),
}
}
}
////////////////////////////////////////////////////////////////////////////////
// RuntimeInfo
////////////////////////////////////////////////////////////////////////////////
/// Info returned from [`.proc_runtime_info`].
///
/// [`.proc_runtime_info`]: proc_runtime_info
#[derive(Clone, Debug, ::serde::Serialize, ::serde::Deserialize)]
pub struct RuntimeInfo<'a> {
pub raft: RaftInfo,
pub internal: InternalInfo<'a>,
}
impl tarantool::tuple::Encode for RuntimeInfo<'_> {}
impl RuntimeInfo<'static> {
pub fn try_get(node: &node::Node) -> Result<Self, Error> {
Ok(RuntimeInfo {
raft: RaftInfo::get(node),
internal: InternalInfo::get(node),
})
}
}
////////////////////////////////////////////////////////////////////////////////
// .proc_runtime_info
////////////////////////////////////////////////////////////////////////////////
#[proc]
pub fn proc_runtime_info() -> Result<RuntimeInfo<'static>, Error> {
let node = node::global()?;
RuntimeInfo::try_get(node)
}
...@@ -390,3 +390,26 @@ def test_proc_raft_info(instance: Instance): ...@@ -390,3 +390,26 @@ def test_proc_raft_info(instance: Instance):
leader_id=1, leader_id=1,
state="Leader", state="Leader",
) )
def test_proc_runtime_info(instance: Instance):
info = instance.call(".proc_runtime_info")
assert isinstance(info["raft"]["applied"], int)
# This field is super volatile, don't want to be updating it every time we
# add a bootstrap entry.
info["raft"]["applied"] = 69
assert info == dict(
raft=dict(
id=1,
term=2,
applied=69,
leader_id=1,
state="Leader",
),
internal=dict(
main_loop_status="idle",
governor_loop_status="idle",
),
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment