@@ -94,9 +94,17 @@ void RaftClusterCmd::Do() {
9494 << " with peers: " << argv_[2 ];
9595 status = raft_mgr->InitCluster (db_name_, args_);
9696 if (status.ok ()) {
97- // Raft 模式下关闭 RocksDB WAL(Raft Log 已提供持久化)
98- db_->storage ()->DisableWal (true );
99- LOG (INFO) << " Disabled RocksDB WAL for Raft mode (DB: " << db_name_ << " )" ;
97+ // Update raft-peers in config file and persist
98+ std::string peers_str = argv_[2 ];
99+ if (g_pika_conf->SetConfStr (" raft-peers" , peers_str)) {
100+ if (g_pika_conf->WriteBack ()) {
101+ LOG (INFO) << " Updated raft-peers in config file: " << peers_str;
102+ } else {
103+ LOG (WARNING) << " Failed to write raft-peers to config file" ;
104+ }
105+ } else {
106+ LOG (WARNING) << " Failed to update raft-peers in config" ;
107+ }
100108 res_.AppendStringRaw (" +OK\r\n " );
101109 } else {
102110 res_.SetRes (CmdRes::kErrOther , " Failed to initialize cluster: " + status.ToString ());
@@ -109,9 +117,6 @@ void RaftClusterCmd::Do() {
109117 << " to leader: " << args_[0 ];
110118 status = raft_mgr->JoinCluster (db_name_, args_[0 ]);
111119 if (status.ok ()) {
112- // Raft 模式下关闭 RocksDB WAL(Raft Log 已提供持久化)
113- db_->storage ()->DisableWal (true );
114- LOG (INFO) << " Disabled RocksDB WAL for Raft mode (DB: " << db_name_ << " )" ;
115120 res_.AppendStringRaw (" +OK\r\n " );
116121 } else {
117122 res_.SetRes (CmdRes::kErrOther , " Failed to join cluster: " + status.ToString ());
@@ -123,7 +128,6 @@ void RaftClusterCmd::Do() {
123128 std::string info;
124129 status = raft_mgr->GetClusterInfo (db_name_, &info);
125130 if (status.ok ()) {
126- // 拆分成多行,以数组格式返回
127131 std::vector<std::string> lines;
128132 std::stringstream ss (info);
129133 std::string line;
@@ -200,6 +204,22 @@ void RaftNodeCmd::Do() {
200204 << " , peer: " << peer_addr_;
201205 status = raft_mgr->AddNode (db_name_, peer_addr_);
202206 if (status.ok ()) {
207+ // Update raft-peers in config file
208+ std::string current_peers = g_pika_conf->raft_peers ();
209+ if (current_peers.empty ()) {
210+ current_peers = peer_addr_;
211+ } else if (current_peers.find (peer_addr_) == std::string::npos) {
212+ current_peers += " ," + peer_addr_;
213+ }
214+
215+ if (g_pika_conf->SetConfStr (" raft-peers" , current_peers)) {
216+ if (g_pika_conf->WriteBack ()) {
217+ LOG (INFO) << " Updated raft-peers in config file: " << current_peers;
218+ } else {
219+ LOG (WARNING) << " Failed to write raft-peers to config file" ;
220+ }
221+ }
222+
203223 res_.AppendStringRaw (" +OK\r\n " );
204224 } else {
205225 res_.SetRes (CmdRes::kErrOther , " Failed to add node: " + status.ToString ());
@@ -212,6 +232,39 @@ void RaftNodeCmd::Do() {
212232 << " , peer: " << peer_addr_;
213233 status = raft_mgr->RemoveNode (db_name_, peer_addr_);
214234 if (status.ok ()) {
235+ // Update raft-peers in config file
236+ std::string current_peers = g_pika_conf->raft_peers ();
237+ if (!current_peers.empty ()) {
238+ // Parse and rebuild peer list without the removed peer
239+ std::vector<std::string> peer_list;
240+ std::stringstream ss (current_peers);
241+ std::string peer;
242+ while (std::getline (ss, peer, ' ,' )) {
243+ peer.erase (0 , peer.find_first_not_of (" \t " ));
244+ peer.erase (peer.find_last_not_of (" \t " ) + 1 );
245+ if (!peer.empty () && peer != peer_addr_) {
246+ peer_list.push_back (peer);
247+ }
248+ }
249+
250+ // Rebuild peers string
251+ std::string new_peers;
252+ for (size_t i = 0 ; i < peer_list.size (); i++) {
253+ new_peers += peer_list[i];
254+ if (i < peer_list.size () - 1 ) {
255+ new_peers += " ," ;
256+ }
257+ }
258+
259+ if (g_pika_conf->SetConfStr (" raft-peers" , new_peers)) {
260+ if (g_pika_conf->WriteBack ()) {
261+ LOG (INFO) << " Updated raft-peers in config file: " << new_peers;
262+ } else {
263+ LOG (WARNING) << " Failed to write raft-peers to config file" ;
264+ }
265+ }
266+ }
267+
215268 res_.AppendStringRaw (" +OK\r\n " );
216269 } else {
217270 res_.SetRes (CmdRes::kErrOther , " Failed to remove node: " + status.ToString ());
0 commit comments