Переделал фантомные записи, чтобы они были валидными только для следующего поколения которое мы создаём, т.к. у меня не было никакого механизма по их удалению. Теперь когда фантом создаётся — его идентификатор сохраняется в коллекции, а при коммите/отмене поколения увеличиваем идентификатор последнего фантома до максимального из существующих.
Кое-как впихнул в query-запросы код который когда видит фантом с идентификатором меньше разрешённого — удаляет его.
Затем попытался в диффы подпихнуться, но там как-то сложно сильно всё оказалось, решил заодно итератор который ходит по записям RocksDB переписать, чтобы во-первых заиспользовать raw-итераторы, которые выдают &[u8] вместо Box для ключей/значений, во-вторых чтобы оно прозрачно у себя там проверяло фантомы эти и если нашло — то запомнило что его нужно удалить и выдало следующее значение.
Но не получилось, тесты свалились. Разбирался-разбирался, плюнул, решил диффы совсем переписать. Второй раз заиспользовал FSM/FSA подход для выделения чистой логики нетривиального алгоритма от конкретных кусков его выполнения (первый раз был для трансформаций). Забил на I/O, определился какое состояние у меня должно быть, сделал два енама: Action и Input и начал обрабатывать приходящий Input в зависимости от текущего состояния, выдавая в результате Action. И они простенькие довольно, вроде «установи курсор вот на такую запись, дай мне ключ который там нашёлся, а так же дай следующий изменённый ключ». Если интересно, можно откуда-то отсюда посмотреть https://github.com/anfivewer/diffbelt/blob/cc747e642a873cbc7ff8e3d86815d0ba1c806dd0/crates/diffbelt/src/raw_db/diff_logic/mod.rs#L245 , там по методам более или менее понятно, что происходит. Поленился только для будущего себя комментарий написать, почему всё именно так.
А само исполнение этого добра происходит снаружи. Сразу два плюса получается: логика не асинхронна, уже меньше головной боли и если баг найду, то тесты будет довольно легко написать на саму логику, даже мокать ничего не нужно.
Мёртвый старый код, правда, не почистил, но чуть позже займусь, периодически прохожусь по всем ворнингам и чищу в ноль, там оно неиспользуемых методов насыпет, ресурсивно приберу.
Позже, возможно, придётся выкинуть это ленивое удаление и сделать как со старыми поколениями сейчас происходит — фоново потихонечку удаляются записи старых поколений для которых были более новые записи и если нет указателей на старые поколения. Так оно не будет лишний раз тормозить чтения и можно будет управлять этим процессом/подзабить на время. Но тоже не сейчас.
Сейчас нужно научиться из васма считать перцентили, чтобы догнать функциональность прототипа, а так же сменить источник данных которые используются в качестве примера. Пока использую куски логов телеграм бота одного, а хочется сделать в самом diffbelt логирование наконец, чтобы понимать что происходит, сделать жёсткий режим логирования в режиме трассировки и скормить логи diffbelt самому diffbelt, нарисовать графичков разных по временам исполнения/прочему, которые в любом случае для мониторинга пригодятся. Так же нужно написать e2e тестов, которые заставляют систему сгенерировать пару килограмм логов, обработать их, что сгенерирует уже пару тонн логов, обработать их, а затем сравнить результат с тем, что было более тупыми алгоритмами посчитано.
Ну и если всё сойдётся, то по фану реализуем эту штуковину для взаимодействия бота с телеграмом https://t.me/alexandersmind/521 , запилю бота к фиесте (давно данные не обновлял, кстати), может и антиспамного бота перепилю, а там посмотрим 🙂
#diffbelt
Кое-как впихнул в query-запросы код который когда видит фантом с идентификатором меньше разрешённого — удаляет его.
Затем попытался в диффы подпихнуться, но там как-то сложно сильно всё оказалось, решил заодно итератор который ходит по записям RocksDB переписать, чтобы во-первых заиспользовать raw-итераторы, которые выдают &[u8] вместо Box для ключей/значений, во-вторых чтобы оно прозрачно у себя там проверяло фантомы эти и если нашло — то запомнило что его нужно удалить и выдало следующее значение.
Но не получилось, тесты свалились. Разбирался-разбирался, плюнул, решил диффы совсем переписать. Второй раз заиспользовал FSM/FSA подход для выделения чистой логики нетривиального алгоритма от конкретных кусков его выполнения (первый раз был для трансформаций). Забил на I/O, определился какое состояние у меня должно быть, сделал два енама: Action и Input и начал обрабатывать приходящий Input в зависимости от текущего состояния, выдавая в результате Action. И они простенькие довольно, вроде «установи курсор вот на такую запись, дай мне ключ который там нашёлся, а так же дай следующий изменённый ключ». Если интересно, можно откуда-то отсюда посмотреть https://github.com/anfivewer/diffbelt/blob/cc747e642a873cbc7ff8e3d86815d0ba1c806dd0/crates/diffbelt/src/raw_db/diff_logic/mod.rs#L245 , там по методам более или менее понятно, что происходит. Поленился только для будущего себя комментарий написать, почему всё именно так.
А само исполнение этого добра происходит снаружи. Сразу два плюса получается: логика не асинхронна, уже меньше головной боли и если баг найду, то тесты будет довольно легко написать на саму логику, даже мокать ничего не нужно.
Мёртвый старый код, правда, не почистил, но чуть позже займусь, периодически прохожусь по всем ворнингам и чищу в ноль, там оно неиспользуемых методов насыпет, ресурсивно приберу.
Позже, возможно, придётся выкинуть это ленивое удаление и сделать как со старыми поколениями сейчас происходит — фоново потихонечку удаляются записи старых поколений для которых были более новые записи и если нет указателей на старые поколения. Так оно не будет лишний раз тормозить чтения и можно будет управлять этим процессом/подзабить на время. Но тоже не сейчас.
Сейчас нужно научиться из васма считать перцентили, чтобы догнать функциональность прототипа, а так же сменить источник данных которые используются в качестве примера. Пока использую куски логов телеграм бота одного, а хочется сделать в самом diffbelt логирование наконец, чтобы понимать что происходит, сделать жёсткий режим логирования в режиме трассировки и скормить логи diffbelt самому diffbelt, нарисовать графичков разных по временам исполнения/прочему, которые в любом случае для мониторинга пригодятся. Так же нужно написать e2e тестов, которые заставляют систему сгенерировать пару килограмм логов, обработать их, что сгенерирует уже пару тонн логов, обработать их, а затем сравнить результат с тем, что было более тупыми алгоритмами посчитано.
Ну и если всё сойдётся, то по фану реализуем эту штуковину для взаимодействия бота с телеграмом https://t.me/alexandersmind/521 , запилю бота к фиесте (давно данные не обновлял, кстати), может и антиспамного бота перепилю, а там посмотрим 🙂
#diffbelt