Repository navigation
perf: cache parsed CRL as a compact revocation index - #231
Merged
Merged
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
При проверке отзыва в `/xml/verify` каждый запрос заново разбирал все CRL-файлы. Основной GOST CRL в рабочем наборе имеет размер около 19 МБ, а разобранный `X509CRL` занимал около 218 МБ памяти. `CrlService` теперь один раз строит для каждой версии файла компактный `CrlWrapper`: индекс «издатель → отсортированные серийные номера с датами и причинами отзыва». Индекс занимает около 34 МБ, а дальнейший поиск выполняется бинарно без повторного разбора DER. Ключ кэша включает каталог, имя, время изменения и размер файла. При удалении или успешной перезаписи CRL индекс дополнительно инвалидируется явно. Индексы исчезнувших и старых версий файлов очищаются. Если CRL содержит повторяющуюся пару «издатель + серийный номер», используется прежний путь через `X509CRL`, чтобы не менять неоднозначную семантику результата. Сохранена совместимость с `X509CRL`: поиск выполняется по издателю и серийному номеру, поддерживается `certificateIssuer` для косвенных CRL, возвращаются прежние дата и причина отзыва. A/B-проверка выполнялась на Java 25 через настоящий `POST /xml/verify` с `revocationCheck=["CRL"]`, валидным сертификатом 2026–2027, одинаковым 19-МБ CRL-кэшем и отдельным Jaeger для каждой версии. Фоновые обращения к PKI были завершены до измерений; трассы фильтровались по серверной операции `http post /xml/verify` и содержали только XML-, certificate- и CRL-проверку. Старая: 2.048, 1.912, 1.531, 1.500, 1.554 с Новая: 2.980, 0.080, 0.066, 0.061, 0.077 с первый запрос 2,980 с на однократное построение индекса Медиана прогретых запросов сократилась примерно с 1,55 с до 0,071 с (около 22 раз). Обе версии вернули одинаковый результат проверки: подпись валидна, сертификат не отозван.
aidoskz
force-pushed
the
perf/xml-verify
branch
from
September 16, 2026 11:50
91e05d0 to
4f5c4db
Compare
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.
perf: cache parsed CRL as a compact revocation index
Что изменено
При
POST /xml/verifyс проверкой через CRL каждый запрос повторно разбирал все CRL-файлы. Основной GOST CRL размером около 19 МБ:X509CRL;Теперь
CrlServiceодин раз строит для каждой версии CRL компактныйCrlWrapper— индекс:Последующие проверки выполняются бинарным поиском без повторного разбора DER. Размер индекса — около 34 МБ вместо 218 МБ.
Инвалидация кэша
Версия файла определяется по:
При удалении или успешной перезаписи CRL индекс дополнительно инвалидируется явно. Индексы удалённых и устаревших файлов очищаются.
Совместимость
Поведение
X509CRLсохранено:certificateIssuerдля indirect CRL;X509CRL, чтобы не менять результат в неоднозначном случае.API и формат ответа не изменялись.
Результаты A/B-теста
Первый запрос новой версии строит индекс, поэтому занимает около 3 секунд. Последующие запросы используют готовый индекс.
Медиана прогретых запросов:
Ускорение — примерно в 22 раза.
Обе версии вернули одинаковый результат: подпись валидна, сертификат не отозван.
Проверка
./gradlew testпроходит.X509CRL;certificateIssuer;Изменение локализовано в
CrlServiceи новомCrlWrapper; внешнее поведение сервиса не меняется.До
После