Repository navigation
Потокобезопасный индекс параметров, версия 0.12.1 - #50
Merged
Merged
Conversation
Индекс строился заново на каждый вызов Параметр() в общее поле экземпляра, из-за чего параллельные вызовы из фоновых заданий падали с исключениями Dictionary и возвращали пустые или чужие значения. - ИндексЗначений строит индекс в локальную карту в Коллекция() и публикует его одним присваиванием поля; чтение идет без блокировок - Прочитать() больше не очищает индекс заранее: новый индекс подменяет прежний только после полного построения - исправлено исключение "Коллекция индекса не установлена" (Новый ИнформацияОбОшибке в 2.x не создается) - документирован контракт многопоточности и ПрочитанныеПараметры() - тесты на однократное построение и параллельное чтение Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- описание возвращаемого значения ОпубликованныйИндекс() - объединены одинаковые ветки для Соответствие и Структура Co-Authored-By: Claude Opus 5.5 <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.

0 New Issues
1 Fixed Issue
0 Accepted Issues
Проблема
ИндексЗначений.ИндексСформированнигде не становилсяИстина, поэтому каждый вызовМенеджерПараметров.Параметр()заново строил весь плоский индекс в общее поле экземпляра. При параллельных вызовах из фоновых заданий потоки подменяли друг другуИндексКоллекцияи одновременно писали в одинСоответствие(.NETDictionary). Результат:InvalidOperationException,ArgumentException,NullReferenceException, пустые или чужие значения. Заодно это была проблема производительности: на каждое чтение перестраивался весь индекс, включая все переменные окружения у ENV-провайдера без префикса.Решение
ИндексЗначений.Коллекция()строит индекс в локальную карту и публикует его одним присваиванием поля. После публикации карта не меняется, поэтомуЗначение()иПолучитьИндекс()читают её без блокировок. Отдельного флага нет: всё состояние хранится в одной ссылке (Неопределенозначит «коллекция не установлена»), так что ни флаг, ни порядок его записи не нужны.МенеджерПараметров.Прочитать()больше не вызываетИндексПараметров.Очистить(). Новый индекс строится полностью и только потом подменяет прежний, поэтомуПараметр()можно вызывать параллельно сПрочитать(). Параллельные вызовыПрочитать()между собой не поддерживаются, это задокументировано.Новый ИнформацияОбОшибке(...)в 2.x падает с «Конструктор не найден». Исправлено.ПрочитанныеПараметры()не попадают вПараметр()до повторногоПрочитать(). До4103624индекс тоже строился один раз при чтении, а видимость изменений появилась случайно вместе с пересборкой на каждый вызов.Индекс строится один раз в
Прочитать(), даже еслиПараметр()потом не вызывается.Тесты
Новый файл
tests/ИндексЗначений_test.os:ПолучитьИндекс()возвращает тот же объект, а послеКоллекция()/Прочитать()— новый;Очистить()выдаётся корректное исключение;Параметр(): ни одного исключения, все значения верные;Прочитать().Без исправления падают все 5 тестов: в параллельных ошибки в 32 из 32 заданий. С исправлением на 2.3.0-dev и 2.2.0 все unit-тесты и BDD (14/14) проходят. Исключение — 2 теста Vault, которые так же падают на master локально: тестовый сервер на winow не стартует.
Вне рамок PR
Прочитать()по-прежнему очищает и заполняетПрочитанныеПараметрына месте.Параметр(), общие с исходными данными, иОбъединитьПрочитанныеПараметрыпри нескольких провайдерах дописывает данные прямо в них.🤖 Generated with Claude Code