perf(save): пропускать запись файла объектов при неизменном инвентаре (#3440)#3452
Open
bylins wants to merge 1 commit into
Open
perf(save): пропускать запись файла объектов при неизменном инвентаре (#3440)#3452bylins wants to merge 1 commit into
bylins wants to merge 1 commit into
Conversation
Crash_frac_save_all (размазанный crash-сейв) каждый цикл безусловно переписывал файл объектов всех онлайн-игроков по очереди через save_char_objects, даже если инвентарь не менялся. Синхронная дисковая запись неизменившихся инвентарей -- основной источник спайков "Crash frac save" в хартбите (до 100+ мс). Теперь для периодического crash-сейва (RENT_CRASH) считаем хеш содержимого файла объектов и пропускаем дисковую запись + пересчёт CRC, если оно не изменилось с прошлого сейва. Файл объектов -- это чистый payload предметов (рент-таймеры пишутся отдельно в .time), поэтому одинаковый payload даёт байт-в-байт идентичный файл, и запись не нужна -- данные не теряются. Остальные типы сейва (рент/ребут/idle-rent) пишут всегда. Хеш в кэше обновляется при каждой реальной записи; на пути "нет предметов" сбрасывается. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Проблема
Спайки
Crash frac saveв хартбите (до 100+ мс, напр. 0.1018с на проде).Crash_frac_save_allкаждый цикл по очереди сохраняет онлайн-игроков и безусловно переписывает файл объектов черезsave_char_objects, даже если инвентарь не менялся. Синхронная дисковая запись (write=) неизменившихся инвентарей и есть источник спайков (в отличие от аккаунта, у файла объектов skip-by-unchanged не было).Решение
Для периодического crash-сейва (
RENT_CRASH) считаем хеш содержимого файла объектов и пропускаем дисковую запись + пересчёт CRC, если оно не изменилось с прошлого сейва.Ключевой момент: файл объектов — это чистый payload предметов; рент-таймеры пишутся отдельно в
.time. Поэтому одинаковый набор предметов даёт байт-в-байт идентичный файл → запись не нужна, данные не теряются (.timeпишется как обычно).uid → hashобновляется при каждой реальной записи; на пути «нет предметов» сбрасывается.В духе фикса аккаунта из #3440 (skip-by-unchanged), но для файла объектов.
Эффект
Большинство онлайн-игроков в каждом цикле инвентарь не меняют → их файлы больше не переписываются → дробный crash-сейв перестаёт молотить диск на ровном месте.
Проверка
ninja -C build— собирается чисто, без предупреждений.🤖 Generated with Claude Code