Skip to content

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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information