Для фичи compare and swap нужны т.н. эфемерные спейсы — это такие спейсы, которые существуют как объект в памяти, но не оставляют следов ни в системных спейсах ни в репликации. Они немного похожи на темпорари спейсы, только без имени и без айдишника, и даже факт их создания нигде не персистится (в отличие от темпорари).
В CaS эфемерные спейсы нужны для реализации "лимба" — копии кластерного храниища, но с еще незакоммиченными записями. Эти спейсы создает лидер в начале терма, поэтому невозможность создавать темпорари спейсы на ридонли инстансе делает их непригодными в текущем виде.
Немного по-другому дела обстоят с "обычными" кластерными спейсами (с закоммиченными данными). Эти спейсы должны персиститься, поэтому ни темпорари ни эфемерные здесь не подходят. Так как данные в них реплицируются через рафт, то тарантульная репликация здесь тоже не нужна. Остается единственный вариант - локальные спейсы.
Проблема состоит в том, что локальные спейсы тоже нельзя создавать на ридонли реплике. А значит применение рафт журнала с записью в такой спейс на ридонли инстансе залипнет в ожидании тарантульной репликации.
box.space._func надо разделить на две части. Персистентные функции (для функциональных индексов) реплицироваться должны, а сишные и луашные хранимки должны быть темпорари. Они завязаны на символы в бинаре (или в луа скрипте), и должна быть возможность инициализировать их на старте даже в ридонли.
Звучит логично, но кажется что реализовать это будет довольно сложно, плюс скорее всего вызовет проблемы в будущем при ребейзе на новые версии коры. Я сейчас уже на пол пути к вынесению эфемерных спейсов.
КЯП проблема с эфемерными спейсами в том, что они безымянные и не лежат в _space, из-за чего с ними не работает некоторые sql юзкейсы. Поэтому апи эфемерных спейсов отменяется, вместо этого:
Нам надо закостылить добавить возможность существующим temporary спейсам создаваться с добавлением в _space но без попадания этой записи в wal и следовательно без репликации этой записи.
Из-за отсутствия репликации у нас пропадёт механизм защиты от коллизий айдишников, для этого надо будет нашим temporary+ спейсам выдавать айдишники из эксклюзивно выданного диапазона (в который не будут попадать реплицируемые спейсы).
Плюс нужно будет убедиться в том, что temporary+ спейсы могут создаваться на readonly реплике
Возню с апишкой box_ephemeral_space_new прекращаем. Сброду нужна возможность работать с этими спейсами через локальный sql, а локальному sql нужно имя (FROM "foo" SELECT *). Пикодате эфемерных спейсов тоже мало, ей нужны еще персистентные нереплицируемые (локальные) спейсы. Так что вместо доработки эфемерных спейсов мы пробуем починить правила создания темпорари и локал спейсов и смотрим что из этого получится.
Разделение _space на три части таит свои опасности - так мы лишимся структурной связности. Грубо говоря, найти спейс по айдишнику будет совсем не тривиальной задачей.
Чтобы не терять структурную связность можно попробовать сделать row-based репликацию записей в _space, т.е. реплицироваться будет только часть таплов. В таком случае появится еще одна задачка — проследить чтобы нереплицируемые персистентные (локальные) записи не попали на реплику вместе со снапшотом при бутстрапе.