Zhengqing Dai
Zhengqing Dai
co_routine.cpp: static stCoRoutineEnv_t* g_arrCoEnvPerThread[ 102400 ] = { 0 }; 采用数组的好处显而易见,但以pid索引这个数组很可能越界。需要该为其他数据结构。
如题。在AskforcheckpointMode模式下,Instance::OnReceive会忽略所有的paxos消息,然而OnTimeout却没有忽略。在如下事件发生时会导致问题: 1、一个节点N正常启动,instance处于非常落后的状态,设其当前instance id为x。 2、N收到一个新的propose请求并进行了处理(prepare+accept)。 3、N通过AskforLearn发现自己落后,并开始传输chekcpoint。 4、在checkpoint传输过程中,prepare超时,通过OnTimeout进行了第二次prepare+accept。此时,paxos存储中应该是完全空的,但由于该问题被意外写入了一个记录。 5、checkpoint传输完成。N重启。 6、重启后成功加载checkpoint。 7、paxos初始化,发现当前日志里最大的instance id是x,而checkpoint的instance id远大于x,触发保护逻辑,paxos初始化失败。
遇到一种情况,3个节点,断电后重启,原master节点报告checksum不正确所以phxbinlogsvr无法启动。而尽管另外的节点数据正常,但mysql却卡在GetLastSendGtid函数上,同时phxbinlogsvr由于也无法连接到mysql从而也不能满足选主的条件,然后整个系统会一直卡住。 重现方法:3个节点,正常运行一段时间后同时关闭所有节点,启动原来的两个slave节点且不要启动原master节点,问题重现。 另外请教一下,mysql的GetLastSendGtid能否直接从本地的phxbinlogsvr获取信息,而不是 Get from Global? 谢谢!
StorageFileManager::Init 函数里似乎多写了一个return OK ,导致后面的代码执行不到 https://github.com/Tencent/phxsql/blob/54e568cb5968a7c43c65edf1aa0497afa61616d4/phxbinlogsvr/core/storage/storage_file_manager.cpp#L89