Results 39 comments of Dongsheng He

> > try #2732 > > (gdb) source /home/yulong.zhao/brpc/tools/gdb_bthread_stack.py (gdb) bthead_begin Undefined command: "bthead_begin". Try "help". (gdb) bthread_begin warning: Could not find DWO CU bazel-out/k8-dbg/bin/_objs/brpc/controller.pic.dwo(0xfc070064084a248f) referenced by CU at offset...

这个PR有考虑继续跟进吗?

什么情况下,在 send_empty_entries(hearbeat = false) 返回前,会发起 send_entries? > " 11应该被ballotBox.commit " 11 是指 log_index 吗?例子中是指的哪儿?

> > 什么情况下,在 send_empty_entries(hearbeat = false) 返回前,会发起 send_entries? > > 这一点我还没有理太清楚,braft有保证这一点吗? > > > 11 是指 log_index 吗?例子中是指的哪儿? > > 是的,11指的是log_index。就是在(3)那一步通过send_entries发送的数据,也就是_append_entries_in_fly队列中的第二个 你可以看下 braft 代码,`send_empty_entries(hearbeat = false)` 主要是用于 check follower 的当前有效的...

重启后会先加载本地 snapshot (如果存在的话), 加载成功后会更新 LogManager 中的 _last_snapshot_id。 具体你看下具体的代码: node 启动的时候初始化时,会调用 _snapshot_executor 的初始化。 https://github.com/baidu/braft/blob/bc9fb052868560322a9b833c8179bb4d1a1f7dc5/src/braft/node.cpp#L270 会注册一个 `FirstSnapshotLoadDone` 的任务 https://github.com/baidu/braft/blob/bc9fb052868560322a9b833c8179bb4d1a1f7dc5/src/braft/snapshot_executor.cpp#L391-L392 如果成功,则更新 _log_manager 的 _last_snapshot_id https://github.com/baidu/braft/blob/bc9fb052868560322a9b833c8179bb4d1a1f7dc5/src/braft/snapshot_executor.cpp#L256

> 我理解在加载完snapshot之后相关资源会被清理掉。 你指的 “相关资源清理掉” 的相关资源具体是指什么。 braft 节点会接收 leader 的快照,同时自身也会打快照。如果有快照产生,每个节点会保留至少一个最新的版本。 > 那么第二次启动的时候并没有snapshot存在,这个时候怎么处理? 如果之前产生过快照,每次重新启动都至少有一个快照存在本地,启动时会预先加载。除非用户自行强行删除,否则不存在产生了了快照,“那么第二次启动的时候并没有snapshot存在” 这种情况,否则会破坏 raft 协议的安全性要求。

> 模拟一个副本数据完全丢失 安全的做法是先从集群移除该节点(remove_peer), 清空该节点的持久化状态,重新 add_peer 进来 (最好是改变 peer_id 的 index,与原先区别)。 > 如果正确的话是不是意味着如果没有新增数据C每次重启时都要收一遍snapshot? 如果你这里的重启都是指的是删除所有数据,那么每次节点的状态都是空,是会做一遍 snapshot.

可以尝试开启 `usercode_in_pthread`, > 代码中广泛地使用pthread local传递session级别全局数据,在RPC前后均使用了相同的pthread local的数据,且数据有前后依赖性。比如在RPC前往pthread-local保存了一个值,RPC后又读出来希望和之前保存的相等,就会有问题。而像tcmalloc虽然也使用了pthread/LWP local,但每次使用之间没有直接的依赖,是安全的。 对于这些情况,brpc提供了pthread模式,开启**-usercode_in_pthread**后,用户代码均会在pthread中运行,原先阻塞bthread的函数转而阻塞pthread。 参考这个文档 https://github.com/apache/brpc/blob/master/docs/cn/server.md#pthread%E6%A8%A1%E5%BC%8F 如果在 server 处理用户请求的代码中,如果没有发生能导致 bthread 阻塞的函数,例如 bthread::usleep、 bthread::bthread_start_urgent 等这些函数,线程是不会发生切换的。