Implement caching for _pico_instance, _pico_replicaset records in rust memory
На данный момент каждый раз когда нужно выяснить что-то про инстанс или репликасет читаем данные напрямую из системных таблиц _pico_instance, _pico_replicaset и т.д. Это плохо, потому что помимо поиска по индексу и похода в хранилище кортежей, там так же делаются лишние копирования данных и десериализация из мсжпака в растовые структуры. При этом большая часть информации в этих таблицах никогда не меняется. Меняются только поля target/current state. Это в частности вызывает вот такие проблемы: #1184 (closed)
Вместо постоянного перечитывания системных таблиц нам нужно создать кэш десериализованных структур Instance, Replicaset (и возможно других), и обновлять их только в момент, когда в raft_main_loop прилетает соответствующая Op::Dml операция.
-
добавить TopologyCacheструктуру, которая будет содержать внутри HashMap для инстансов и репликасетов -
вносить изменения в неё когда в handle_committed_normal_entry прилетает Dml в _pico_instance или _pico_replicaset -
давать доступ к ней только через fiber::Mutex, т.к. значения внутри будут изменяться из файберов -
использовать её везде где можно, везде мы читаем pico_instance и pico_replicaset -
в частности в resolve_rpc_target(см. #1184 (closed))