The case: joining stucks with PoolSendError::UnknownRecipient
Проблема пару раз проявляла себя на ветке test-big-cluster (3f41cb52). Вот на таком тесте:
def test(cluster: Cluster):
cluster.deploy(instance_count=100)
Из того что я успел понять, происходило примерно следующее:
-
Залипание происходило на этой строчке: src/main.rs#L604
-
В спейсе raft_group залипшего инстанса было 3 инстанса (видимо ответ JoinResponse был сформирован на заре кластера, когда воутеров было всего 3).
-
Среди этих трех не было текущего рафт лидера.
-
Рафт лидер бомбил залипший инстанс хартбитами, на который тот не мог ответить из-за указанной ошибки
PoolSendError::UnknownRecipient.
Вот то, что я успел проверить:
$ # Это консоль залипшего инстанса
$ ttc localhost:3323
connected to localhost:3323
localhost:3323> box.space.raft_group:fselect()
---
- - +-----------+------------------------+-------+----------------+-------------+------------------------+------------+--------+---------------+
- |instance_id| instance_uuid |raft_id| peer_address |replicaset_id| replicaset_uuid |commit_index| health |failure_domains|
- +-----------+------------------------+-------+----------------+-------------+------------------------+------------+--------+---------------+
- | "i1" |"68d4a766-4144-3248-aeb4| 1 |"127.0.0.1:3301"| "r1" |"e0df68c5-e7f9-395f-86b3| 1 |"Online"| {} |
- | "i15" |"91afe472-47d9-3897-b801| 2 |"127.0.0.1:3315"| "r1" |"e0df68c5-e7f9-395f-86b3| 5 |"Online"| {} |
- | "i23" |"c68998b3-dbe0-38ab-8cde| 4 |"127.0.0.1:3323"| "r2" |"eff4449e-feb2-3d73-87bc| 8 |"Online"| {} |
- +-----------+------------------------+-------+----------------+-------------+------------------------+------------+--------+---------------+
...
localhost:3323> box.space.raft_state:get('voters')
---
...
localhost:3323>
---
...
localhost:3323> box.space.raft_state:fselect()
---
- - +-------------+-------------+
- | key | value |
- +-------------+-------------+
- | "applied" | 1 |
- |"cluster_id" |"cluster-0-0"|
- | "commit" | 1 |
- | "gen" | 1 |
- |"instance_id"| "i23" |
- | "raft_id" | 4 |
- | "term" | 6 |
- | "vote" | 0 |
- +-------------+-------------+
...
$ # А это - рандомного фоловера
$ ttc localhost:3311
connected to localhost:3311
localhost:3311> box.space.raft_state:fselect()
---
- - +-----------------+------------------------------------------------------------------------------------------------------------------------+
- | key | value |
- +-----------------+------------------------------------------------------------------------------------------------------------------------+
- | "applied" | 131 |
- | "auto_leave" | false |
- | "cluster_id" | "cluster-0-0" |
- | "commit" | 131 |
- | "gen" | 1 |
- | "instance_id" | "i11" |
- | "learners" |[58,55,52,49,46,43,40,37,34,31,28,25,22,19,16,13,7,4,59,56,53,50,47,44,41,38,35,32,29,26,23,20,17,14,8,60,57,54,51,48,45|
- | "learners_next" | [] |
- | "raft_id" | 50 |
- | "term" | 6 |
- | "vote" | 0 |
- | "voters" | [5,2,10,1,11] |
- |"voters_outgoing"| [] |
- +-----------------+------------------------------------------------------------------------------------------------------------------------+
...
localhost:3311> picolib.raft_status()
---
- is_ready: true
leader_id: 11
raft_state: Follower
id: 50
...
Edited by Yaroslav Dynnikov