раньше работало так:
- нетбокс хранит локально последнюю полученную от сервера версию
- клиент посылает запрос, к которому версия прикрепляется
- если на сервере оказалась другая версия, то возвращается ошибка версии, и нетбокс автоматически переотправляет РОВНО ТАКОЙ ЖЕ запрос снова + запускает рефетч схемы
То есть в старой схеме запрос переотправлялся без изменений, и в этом не было никакого смысла.
теперь:
- небокс тоже хранит локально последнюю полученную от сервера версию
- клиент посылает запрос, но версия к нему не прикрепляется. Такой запрос теперь не сможет сфейлится с ошибкой версии, так как в нем версии нет. Это равносильно тому, что в старой схеме этот запрос переотправлялся без каких-либо изменений. Только теперь не нужны быссмысленные переотправки.
- от сервера ответ приходит с номером версии, и нетбокс сранивает его с локальным. Если они не совпали, то он запускает фоновый рефетч схемы.
Поведение не стало более некорректным после этого изменения — это верно. В остальном, мы таким образом разрешаем выполнить запрос со старым space_id / index_id. Мы также предоставляем пользователю информацию о схеме в space like объектах, и пользователь может воспользоваться ей при формировании запроса (например, для выделения первичного или вторичного ключа из тапла для использования в запросе).
Ошибка E_WRONG_SCHEMA_VERSION нужна, чтобы запрос
не был выполнен, если клиент имел неактуальную информацию о схеме. Мы не можем и не должны делать предположений о том, что схема не использовалась при формировании запроса. Более того, мы сами используем потенциально устаревшую схему для разрешения имен спейса и индекса. После рефетчинга схемы мы должны заново отмапить space name и index name в числовые id: в этом случае мы можем дать гарантию о том, что запрос был сделан по схеме, актуальной на момент вызова net.box-метода или более новой. В текущем варианте схема может быть любой: из прошлого, настоящего или будущего.
На мой взгляд, хорошей схемой взаимодействия является описанная
тут (и, несколько детальней,
тут). Кроме указанных моментов (когда дропать схему, когда слать IPROTO_PING и т. п.) я бы еще отметил парочку:
* Двух случаях
необходимо делать запросы без schema_id: когда качаем саму схему (но мы должны убедиться, что все связанные со схемой ответы содержат одинаковый schema_id) и когда аутентифицируемся.
* Перед повторением запроса, получившего E_WRONG_SCHEMA_VERSION, мы должны заново отрезолвить имена спейса / индекса, если они использовались при запросе.