@@ -114,6 +114,21 @@ PikaServer::PikaServer()
114114 LOG (FATAL) << " Failed to initialize Raft manager: " << status.ToString ();
115115 }
116116 LOG (INFO) << " Raft manager initialized successfully" ;
117+
118+ // 设置 Raft binlog 回调(pikiwidb_raft 风格)
119+ // 这样后续创建的所有 DB 都会使用这个回调
120+ std::lock_guard rwl (storage_options_rw_);
121+ storage_options_.append_log_function =
122+ [this ](const ::pikiwidb::Binlog& binlog, std::promise<rocksdb::Status>&& promise) {
123+ // 使用 db_id 确定是哪个数据库(pikiwidb_raft 的实现方式)
124+ // 这里简化处理:使用第一个 DB("db0")
125+ // 更完整的实现需要根据 binlog.db_id() 查找对应的 DB
126+ std::string db_name = " db0" ; // TODO: 支持多 DB
127+
128+ // 调用 RaftManager::AppendLog()
129+ raft_manager_->AppendLog (db_name, binlog, std::move (promise));
130+ };
131+ LOG (INFO) << " Raft append_log_function registered in storage_options" ;
117132 }
118133
119134 bgsave_thread_.set_thread_name (" PikaServer::bgsave_thread_" );
@@ -237,58 +252,23 @@ void PikaServer::Start() {
237252 } else {
238253 LOG (INFO) << " Raft manager started successfully" ;
239254
240- // 为每个数据库注册 binlog 回调
255+ // 为每个数据库设置 Storage 引用并禁用 RocksDB WAL(供 on_apply 使用)
241256 for (const auto & db_item : dbs_) {
242257 std::string db_name = db_item.first ;
243- auto storage = db_item.second ->storage (); // Returns std::shared_ptr<storage::Storage>
258+ auto storage = db_item.second ->storage ();
244259
245260 if (!storage) {
246- LOG (WARNING) << " 数据库 " << db_name << " 的 storage 为空,跳过回调注册 " ;
261+ LOG (WARNING) << " 数据库 " << db_name << " 的 storage 为空,跳过 " ;
247262 continue ;
248263 }
249264
265+ storage->DisableWal (true );
266+ LOG (INFO) << " 已为数据库 " << db_name << " 禁用 RocksDB WAL(Raft 模式)" ;
267+
250268 // 设置存储引擎引用 (使用原始指针)
251269 raft_manager_->SetStorage (storage.get ());
252270
253- // 注册 binlog 回调(使用 promise/future 同步)
254- storage->SetBinlogWriteCallback (
255- [this , db_name](const pikiwidb::Binlog& binlog, std::promise<rocksdb::Status>&& promise) {
256- // 序列化 binlog
257- std::string binlog_data;
258- if (!binlog.SerializeToString (&binlog_data)) {
259- LOG (ERROR) << " Failed to serialize binlog" ;
260- promise.set_value (rocksdb::Status::Corruption (" Binlog serialization failed" ));
261- return ;
262- }
263-
264- LOG (INFO) << " 收到 binlog 回调,数据库: " << db_name
265- << " , binlog 大小: " << binlog_data.size () << " 字节"
266- << " , entries: " << binlog.entries_size ();
267-
268- // 创建异步回调闭包
269- auto * closure = new pika_raft::WriteDoneClosure (nullptr , nullptr );
270- closure->SetBinlogData (binlog_data);
271-
272- // TODO: 这里需要将 promise 传递给 closure,让 Raft apply 完成后设置结果
273- // 目前先立即返回 OK,实际应该等待 Raft 应用完成
274-
275- // 提交到 Raft
276- auto apply_status = raft_manager_->ApplyBinlog (db_name, binlog_data, closure);
277- if (!apply_status.ok ()) {
278- LOG (ERROR) << " 提交 binlog 到 Raft 失败: " << apply_status.ToString ();
279- // 设置错误状态并调用 Run,让 closure 自己清理
280- closure->status ().set_error (-1 , " %s" , apply_status.ToString ().c_str ());
281- closure->Run ();
282- promise.set_value (rocksdb::Status::IOError (apply_status.ToString ()));
283- } else {
284- // TODO: 应该在 Raft apply 完成后才 set_value
285- // 目前先简单地立即返回 OK
286- promise.set_value (rocksdb::Status::OK ());
287- }
288- }
289- );
290-
291- LOG (INFO) << " 已为数据库 " << db_name << " 注册 binlog 回调" ;
271+ LOG (INFO) << " 已为数据库 " << db_name << " 设置 Storage 引用" ;
292272 }
293273 }
294274 }
0 commit comments