waiting for DdlCommit is unreliable
Сейчас, когда мы делаем кластерный DDL (плюс операции смены метаданных плагинов после этого МРа !928 (merged)), мы используем 2х фазных коммит:
- пропоузим DdlPrepare
- а потом ждём когда в логе появится DdlCommit или DdlAbort, который сообщит нам результат операции.
Проблема в том, что рафт журнал можно компактить в любой момент и при этом может быть закомпакчен этот DdlCommit/DdlAbort, которого мы ждём в другом файбере.
Решения
- Можно запрещать компактить диапазон журнала, начиная с последнего DdlPrepare и заканчивая соответствующей DdlCommit/DdlAbort.
Проблема 1: для плагинов добавляется свой PluginPrepare аналог, и их в будущем может быть много, и сложно будет уследить, о чём должен думать компакшен журнала
Проблема 2: кто будет следить, за тем, что такой запретный диапазон не разрастётся так сильно, что его прям захочется скомпактить? Что тогда?
- Можно вместо ожидания *Commit/*Abort, вместо этого ожидать, что пропадёт _pico_property.pending_schema_change, а потом проверять конкретный результат операции. Мы и так уже это проверяем в reeneterable_schema_change_request.
Описанные проблемы касаются функций:
- schema::wait_for_ddl_commit (Rust)
- pico.wait_ddl_finalize (Lua)