diff options
| author | omagdy <omar.professional8777@gmail.com> | 2025-07-23 01:26:04 +0300 |
|---|---|---|
| committer | omagdy <omar.professional8777@gmail.com> | 2025-07-23 01:26:04 +0300 |
| commit | d4dbbda97b42bad8a41297ba1c3a693f1fe66902 (patch) | |
| tree | b240bfdbadb29330c193b53c094e99f4d007613d /src | |
| parent | c94f86353dd98a176b61806eb4f25c9170c26717 (diff) | |
| download | redis-rust-d4dbbda97b42bad8a41297ba1c3a693f1fe66902.tar.xz redis-rust-d4dbbda97b42bad8a41297ba1c3a693f1fe66902.zip | |
feat: Added replicationID and replicationOffset in info command for master nodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 12 | ||||
| -rw-r--r-- | src/resp_commands.rs | 15 |
2 files changed, 23 insertions, 4 deletions
@@ -7,12 +7,16 @@ pub mod resp_commands; pub mod resp_parser; pub mod shared_cache; +// TODO: Model this in a better way there could be an enum where a Slave Server is distinguised +// from master servers in 2 different structs #[derive(Debug, Clone, Default)] pub struct RedisServer { pub role: String, pub port: String, pub master_host: String, pub master_port: String, + pub master_replid: Option<String>, + pub master_repl_offset: Option<String>, } impl RedisServer { @@ -22,6 +26,9 @@ impl RedisServer { port: "6379".to_string(), master_host: "".to_string(), master_port: "".to_string(), + // HACK: Hardcoded for now + master_replid: Some("8371b4fb1155b71f4a04d3e1bc3e18c4a990aeeb".to_string()), + master_repl_offset: Some("0".to_string()), } } } @@ -86,6 +93,11 @@ impl Config { .unwrap_or(("", "")); redis_server.role = "slave".to_string(); + + // slaves don't have master attributes!! + redis_server.master_replid = None; + redis_server.master_repl_offset = None; + redis_server.master_host = master_host.to_string(); redis_server.master_port = master_port.to_string(); i += 2; diff --git a/src/resp_commands.rs b/src/resp_commands.rs index 2ca9e02..2c9c09c 100644 --- a/src/resp_commands.rs +++ b/src/resp_commands.rs @@ -1,5 +1,5 @@ -use crate::SharedConfig; use crate::{resp_parser::*, shared_cache::*}; +use crate::{RedisServer, SharedConfig}; use regex::Regex; use std::time::{SystemTime, UNIX_EPOCH}; @@ -237,11 +237,18 @@ impl RedisCommands { RC::Info(_sub_command) => { use RespType as RT; let config = config.clone(); - let mut role = "master".to_string(); + let mut server = RedisServer::new(); if let Some(conf) = config.as_ref() { - role = conf.server.clone().role; + server = conf.server.clone(); } - let response = format!("# Replication\r\nrole:{role}",).as_bytes().to_vec(); + let response = format!( + "# Replication\r\nrole:{}master_replid:{}master_repl_offset:{}", + server.role, + server.master_replid.unwrap_or("".to_string()), + server.master_repl_offset.unwrap_or("".to_string()) + ) + .as_bytes() + .to_vec(); RT::BulkString(response).to_resp_bytes() } RC::Invalid => todo!(), |
