diff options
| author | omagdy <omar.professional8777@gmail.com> | 2025-07-23 01:11:12 +0300 |
|---|---|---|
| committer | omagdy <omar.professional8777@gmail.com> | 2025-07-23 01:11:12 +0300 |
| commit | c94f86353dd98a176b61806eb4f25c9170c26717 (patch) | |
| tree | 8425cb5ed8733a979aa3618fea8fc9bb957aedc3 /src | |
| parent | 7dbaa99eb721748f5eff2839817c6742029ad2b3 (diff) | |
| download | redis-rust-c94f86353dd98a176b61806eb4f25c9170c26717.tar.xz redis-rust-c94f86353dd98a176b61806eb4f25c9170c26717.zip | |
feat: Added simple logic to check if redis node role is master or slave
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 48 | ||||
| -rw-r--r-- | src/main.rs | 3 | ||||
| -rw-r--r-- | src/resp_commands.rs | 8 |
3 files changed, 52 insertions, 7 deletions
@@ -7,11 +7,30 @@ pub mod resp_commands; pub mod resp_parser; pub mod shared_cache; +#[derive(Debug, Clone, Default)] +pub struct RedisServer { + pub role: String, + pub port: String, + pub master_host: String, + pub master_port: String, +} + +impl RedisServer { + fn new() -> Self { + Self { + role: "master".to_string(), + port: "6379".to_string(), + master_host: "".to_string(), + master_port: "".to_string(), + } + } +} + #[derive(Debug, Default)] pub struct Config { pub dir: Option<String>, pub dbfilename: Option<String>, - pub port: Option<String>, + pub server: RedisServer, } pub type SharedConfig = Arc<Option<Config>>; @@ -26,7 +45,7 @@ impl Config { let mut dir = None; let mut dbfilename = None; - let mut port = None; + let mut redis_server = RedisServer::new(); let mut i = 1; // Skip program name while i < args.len() { @@ -47,9 +66,28 @@ impl Config { } "--port" => { if i + 1 >= args.len() { - return Err("--dbfilename requires a value".to_string()); + return Err("--port requires a value".to_string()); } - port = Some(args[i + 1].clone()); + redis_server.port = args[i + 1].clone(); + i += 2; + } + "--replicaof" => { + if i + 1 >= args.len() { + return Err("--replicaof requires a value".to_string()); + } + + // TODO: Find a better name for this variable + let info = args[i + 1].clone(); + + let (master_host, master_port) = info + .strip_prefix('"') + .and_then(|x| x.strip_suffix('"')) + .and_then(|x| x.split_once(' ')) + .unwrap_or(("", "")); + + redis_server.role = "slave".to_string(); + redis_server.master_host = master_host.to_string(); + redis_server.master_port = master_port.to_string(); i += 2; } _ => { @@ -61,7 +99,7 @@ impl Config { Ok(Some(Config { dir, dbfilename, - port, + server: redis_server, })) } } diff --git a/src/main.rs b/src/main.rs index 5fdd6c3..3186b6c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -67,7 +67,8 @@ fn main() -> std::io::Result<()> { let mut cache = cache.lock().unwrap(); let dir = conf.dir.clone().unwrap_or("".to_string()); let dbfilename = conf.dbfilename.clone().unwrap_or("".to_string()); - port = conf.port.clone().unwrap_or("6379".to_string()); + let redis_server = conf.server.clone(); + port = redis_server.port.clone(); if let Ok(rdb_file) = RDBFile::read(dir, dbfilename) { if let Some(rdb) = rdb_file { let hash_table = &rdb.databases.get(&0).unwrap().hash_table; diff --git a/src/resp_commands.rs b/src/resp_commands.rs index 0fa6945..2ca9e02 100644 --- a/src/resp_commands.rs +++ b/src/resp_commands.rs @@ -236,7 +236,13 @@ impl RedisCommands { } RC::Info(_sub_command) => { use RespType as RT; - RT::BulkString("# Replication\r\nrole:master".as_bytes().to_vec()).to_resp_bytes() + let config = config.clone(); + let mut role = "master".to_string(); + if let Some(conf) = config.as_ref() { + role = conf.server.clone().role; + } + let response = format!("# Replication\r\nrole:{role}",).as_bytes().to_vec(); + RT::BulkString(response).to_resp_bytes() } RC::Invalid => todo!(), } |
