Conversation
- МодельДанных хранит объекты модели в СинхронизированнаяКарта и обходит ее
через ДляКаждого: регистрация класса параллельно операциям больше не роняет
обход модели ("Collection was modified"). Повторная регистрация типа не
подменяет объект модели, с которым уже работают хранилища.
- ОбъектМодели.Колонки() снова отдает копию: правка результата не меняет общую
модель. Библиотека и встроенные коннекторы читают таблицу без копии через
служебный Служебный_Колонки().
- Имя таблицы объекта модели подчиненной таблицы передается третьим параметром
конструктора ОбъектМодели; мутатор Служебный_ИмяТаблицы удален.
- ТипыКолонок.Типы() и ТипыПодчиненныхТаблиц.Типы() отдают ФиксированныйМассив.
Изменения поведения: Колонки() - копия, как до nixel2007#151; Типы() нельзя менять.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (20)
Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review. WalkthroughИзменены контракты объекта модели и хранилища моделей. Внутренние операции и коннекторы используют исходные колонки модели. Перечни типов колонок и подчинённых таблиц теперь представлены фиксированными массивами. ChangesМодель данных и её потребители
Фиксированные массивы типов
Priority: ➖ Normal Estimated code review effort: 3 (Moderate) | ~25 minutes Change: Bug fix Suggested reviewers: Merge Risk: ⚪ Minimal · up to The changes are mergeable after normal checks. No actionable failure was identified; the concurrency tests exercise registration alongside model enumeration. Architecture SummaryArchitecture risk: 🔵 Low · up to The change affects 3 systems. Changed systems: Architecture concerns Review detailsSystems and components
Before / after behavior
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches 💡 1🧪 Generate unit tests (beta)
🛠️ Fix failing CI checks 💡
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Пишет кролик: модель обновлена, Comment |
Что чинит
Общие описания модели, которые читают все потоки, работающие с менеджером. Для каждого пункта сначала написан тест, красный на
master, потом исправление.masterМодельДанныххранила объекты модели в обычномСоответствиебез блокировки, а классы можно регистрировать и после передачи менеджера другим потокамИнициализировать), падало с «Collection was modified», пока другой поток регистрировал классыСинхронизированнаяКарта, обход — черезДляКаждого, под её блокировкой.Значения().ВМассив()не годится: обходит внутреннюю карту уже после снятия блокировки, такой вариант тест тоже роняетВставитьЕслиОтсутствует: для известного типа возвращается существующий объектОбъектМодели.Колонки()отдавал саму общую таблицу (с #151)Колонки()снова отдаёт копию. Библиотека и встроенные коннекторы читают таблицу без копии через служебныйСлужебный_Колонки(), выигрыш #151 на внутренних путях сохраняетсяСлужебный_ИмяТаблицыОбъектМодели, мутатор удалёнТипыКолонок.Типы()иТипыПодчиненныхТаблиц.Типы()отдавали общий изменяемыйМассивФиксированныйМассивЧто меняется снаружи
Колонки()отдаёт копию, как до perf(model): сборка сущности без копий таблицы колонок #151. Сторонние коннекторы, читающие колонки через публичный метод, платят за копирование.Типы()—ФиксированныйМассив: код, который менял результат, получит ошибку.Служебный_ИмяТаблицы(помечен@internal) удалён. У конструктораОбъектМоделиновый необязательный параметрПИмяТаблицы.ПолучитьОбъектыМоделисобирает массив лямбдой под блокировкой модели, это около 1,7 мс на вызов. Зовёт его толькоИнициализировать.Связь с #154
#154 добавляет ещё два места, читающих
Колонки():КоннекторInMemory.СобратьСущностьВБДиЗаписьСущности. Наmasterих пока нет. Тот из двух PR, который вольётся вторым, переведёт их наСлужебный_Колонки().Тесты
Новые:
МодельДанных— повторная регистрация не подменяет объект модели; задание обходит модель, пока тест регистрирует 50 сгенерированных классов. Наmasterвторой тест падал в задании три раза из трёх.ОбъектМодели—КолонкиОтдаютКопию,ИзменениеКопииКолонокНеМеняетМодель,СлужебныеКолонкиОтдаютТаблицуМодели,ИмяТаблицыЗадаетсяПриСоздании.ТипыКолонок— обаТипы()отдаютФиксированныйМассив.Тесты #151, которые требовали от
Колонки()ту же таблицу, переписаны наСлужебный_Колонки().Полный прогон:
🤖 Generated with Claude Code
Summary by CodeRabbit
Колонки(), теперь можно изменять без изменения модели.