You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Роутер делает ровно то, что указано в документации: возвращает все известные репликасеты, пользователи должны понимать, что некоторые из них могут быть нерабочими (disabled или вес в 0) и должны это учитывать при написании своего кода, раз уж они решили пользоваться routeall.
Вернуть список репликасетов, на которых по мнению роутера есть на данный бакеты мы можем, без проблем, но исходную проблему эту не решает, вот почему:
У роутера имеется только кеш бакетов и где они находятся. Например, репликасет был с бакетами и его резко задизейблили, он больше не отвечает роутеру. Роутер будет считать, что бакеты на репликасете еще есть и вернет этот репликасет в функции, которую вы просите.
Если вес репликасета 0, это не значит, что там на данный момент нет бакетов, они могут только переезжать, и бакеты там могут еще оставаться. Чтобы убедиться, что там этого бакета нет, нужно чаще всего сделать запрос на инстанс и он нам об этом расскажет, после чего мы обновим кеш роутера (есть также обновление кеша роутеров в фоне, но это происходит не сразу). Если мы не можем достучаться до репликасета, то мы ничего и не можем сказать об этом.
Если пользователь использует routeall, это его обязанность проверить weight репликасета, проверить, что он доступен. Нужно понимать, что запросы сделанные через replicaset API (rs:callro например) не обновляют кеш роутера, это не вызов функции роутера.
Пока я не понимаю, чего хочет добиться пользователь, я не могу предложить адекватного решения по проблеме. Возможно, клиент хочет увидеть map_callro (и его други вариации с balance и prefer_replica), в которых мы самостоятельно проверим, что все репликасеты доступны, остановим ребалансинг, сделаем запросы и возобновим ребалансинг. Но если репликасет недоступен, будет также возвращена ошибка.
Мне нужен контекст проблемы, предложенное в тикете решение я считаю невалидным
По тикету https://jira.vk.team/browse/TNT-1175 ,
Функция vshard.router.routeall()
Возвращает все репликасеты не учитывая их вес
Например может быть ситуация когда весь репликасета 0. Тогда нет смысла отправлять запрос на такой репликасет
Предлагает сделать функцию, которая будет возвращать только те репликасеты где есть бакеты.
The text was updated successfully, but these errors were encountered: