Skip to content

waiting for DdlCommit is unreliable

Сейчас, когда мы делаем кластерный DDL (плюс операции смены метаданных плагинов после этого МРа !928 (merged)), мы используем 2х фазных коммит:

  • пропоузим DdlPrepare
  • а потом ждём когда в логе появится DdlCommit или DdlAbort, который сообщит нам результат операции.

Проблема в том, что рафт журнал можно компактить в любой момент и при этом может быть закомпакчен этот DdlCommit/DdlAbort, которого мы ждём в другом файбере.

Решения

  1. Можно запрещать компактить диапазон журнала, начиная с последнего DdlPrepare и заканчивая соответствующей DdlCommit/DdlAbort.

Проблема 1: для плагинов добавляется свой PluginPrepare аналог, и их в будущем может быть много, и сложно будет уследить, о чём должен думать компакшен журнала

Проблема 2: кто будет следить, за тем, что такой запретный диапазон не разрастётся так сильно, что его прям захочется скомпактить? Что тогда?

  1. Можно вместо ожидания *Commit/*Abort, вместо этого ожидать, что пропадёт _pico_property.pending_schema_change, а потом проверять конкретный результат операции. Мы и так уже это проверяем в reeneterable_schema_change_request.

Описанные проблемы касаются функций:

  • schema::wait_for_ddl_commit (Rust)
  • pico.wait_ddl_finalize (Lua)
Edited by Yaroslav Dynnikov
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information