received msgAppend rejection, ..., reject_hint_term: 0
См флакающий тест в https://git.picodata.io/core/picodata/-/jobs/310183
Наблюдаем ту же ошибку что и в #423 (closed), но симптом теперь не паника, которую мы убрали в !1327 (merged), а прекращение взаимодействия raft машины. Вот копия описания:
Наблюдаемая ситуация не объясняется недетерминированностью сетевого взаимодействия, т.к. сообщения идут по порядку. При этом рафт лидер не меняется. Ситуация примерно такая:
- Фоловер обнаруживая у себя дыру в логе отправляет лидеру reject в ответ на msg append
- Лидер отправляет фоловеру снапшот
- Фоловер применяет снапшот, отправляет append response
- Лидер шлёт следующий append
- Фоловер внезапно шлёт reject с reject_hint_term = 0
- Лидер шлёт снапшот
- Фоловер применяет снапшот, паника, потому что snapshot_index = applied_index
С какого перепуга там reject_hint_term = 0, я понять пока не смог. Локально это не воспроизводится. Похоже где-то какая-то странная гонка..
Сейчас вместо паники мы скипаем применение снапшота, отправляем MsgAppendResponse, но лидер больше не шлёт нам MsgAppend почему-то
Есть подозрение, что проблема связана с вот этой недоработкой: https://git.picodata.io/core/picodata/-/blob/a7acfee173c39da518b6bb51b9c83eeb57c14142/src/traft/node.rs?page=3#L2226-2233
// TODO: As long as the snapshot was sent to us in response to
// a rejected MsgAppend (which is the only possible case
// currently), we will send a MsgAppendResponse back which will
// automatically reset our status from Snapshot to Replicate.
// But when we implement support for manual snapshot requests,
// we will have to also implement sending a MsgSnapStatus,
// to reset out status explicitly to avoid leader ignoring us
// indefinitely after that point.
Возможно что этот костыль работает невсегда, и нужно в любом случае посылать MsgSnapStatus. Проблема в том, что это сообщение нельзя посылать через обычный механиз proc_raft_interact, потому что разработчики raft-rs заботливо вставили костыль, который это запрещает (https://github.com/tikv/raft-rs/issues/502).