Skip to content

received msgAppend rejection, ..., reject_hint_term: 0

См флакающий тест в https://git.picodata.io/core/picodata/-/jobs/310183

job-310183.log

Наблюдаем ту же ошибку что и в #423 (closed), но симптом теперь не паника, которую мы убрали в !1327 (merged), а прекращение взаимодействия raft машины. Вот копия описания:

Наблюдаемая ситуация не объясняется недетерминированностью сетевого взаимодействия, т.к. сообщения идут по порядку. При этом рафт лидер не меняется. Ситуация примерно такая:

  1. Фоловер обнаруживая у себя дыру в логе отправляет лидеру reject в ответ на msg append
  2. Лидер отправляет фоловеру снапшот
  3. Фоловер применяет снапшот, отправляет append response
  4. Лидер шлёт следующий append
  5. Фоловер внезапно шлёт reject с reject_hint_term = 0
  6. Лидер шлёт снапшот
  7. Фоловер применяет снапшот, паника, потому что 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).

Edited by Georgy Moshkin
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information