-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
1.3.2版本较为核心的类DataSyncer存在并发问题 #3577
Comments
如果确认的话,我可以来修复这个问题 |
这里在很极限的情况下的确可能存在问题,但是这个Distro本身就是AP协议,还有对账机制可以修复遗漏的同步信息,详见/checksum接口。 您说打算修复这个问题,能先同步一下修复的方案吗?讨论下, 如果在不影响性能的情况下,能修复掉最好。 |
此问题的原因是执行143行taskMap.remove操作时,无法知道keys对应的数据在前面是否有更新,但是为了确保相同的key同步到到其他naming节点的顺序性,不能简单通过在129行执行serialize前移除taskMap中的key来解决,我当前想到的办法是引入状态机制,记录序列化后又有更新这个状态 步骤1,将63行taskMap定义的value的数据结构改成
,类型定义如下:
处理流程图如下:
步骤4,假设线程2执行序列化以及发送到其他naming节点的步骤,也就是执行114到144行之间的代码
|
这个方案唯一可能影响性能的是3.2步骤的自旋操作,但是只有在4.2步骤status=3的时候才会走这个逻辑,然而4.2识别到status=3时,只会迅速remove这个key,因此对性能几乎无影响,但是能很好的解决一致性的这个问题,个人认为整体是可行的,编码难度不大 |
我觉得问题复杂了,近期我们计划把AP协议下沉,到时候这个地方会重新修改,改成类似两层key的机制, |
引入状态机制确实变得复杂了些,你提到的下层AP协议计划是在哪个版本呢?你的描述比较简单,还看不出来是如何确保同一个key同步的顺序性的 |
Refer to #3642 |
Distro refactor has done. the new design fixed this problem. |
文件路径nacos/naming/src/main/java/com/alibaba/nacos/naming/consistency/ephemeral/distro/DataSyncer.java
submit方法中,第120行的代码片段1
这里面从dataStore取出了keys对应的数据,并在接下来132行将其序列化后,发送到其他naming节点。
132行代码
但是在发送成功前(执行121至132行间的逻辑时),taskMap中的keys依旧存在,发送成功后才会从taskMap移除,这里存在并发问题。
我们先看88行至105行的代码逻辑
当其他线程执行到88行至105行间的代码时,如果相同的key存在于taskMap中,这个key将不会再执行后续的流程,会导致第一个线程执行132行同步到其他节点的数据是旧的
The text was updated successfully, but these errors were encountered: