AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.04.2025, 10:06   #1  
kitty is offline
kitty
Участник
 
383 / 30 (2) +++
Регистрация: 24.05.2005
AX2012: Как CIL может работать в PROD, если есть ошибки компиляции?
Есть клиент с Ax2012 R3
У них крутится аксапта в продакшн 3 года уже, и ее не трогают. Начались проблемы с перформансом. Дали мне PrePROD. Там попыталась запустить одну функциональность в батч ,и выдалась .net ошибка ( в интеррактиве нет) microsoft. dynamics.ax.xpp.errorException was thrown.. Function XXX incorrectly called.
Запустила создание CIL, и комп упал с сообщением "недостаточно памяти". Запустила просто компиляцию, чтобы посмотреть, что происходит c environnement. Она выдала 14 ошибок. Из которых 5 - ссылка на Dll , которой нет в и 9 - связаны с привидегиями и duty . которые сслыдаются на таблицы и меню айтемы, которых в AOT нет. Преимущественно retail и какие-то кастомные разработки. Клиент говорит,что PrePROD несколько месяцев назад восстанавливали из PROD (данные и modelstore)

Проверила в PROD , там тоже этих объектов нет!

1) Как так возможно, что объектов нет, но батчи работают в PROD? То есть, в какой-то момент CIl был сгенерирован же , когда приложение в PROD последний раз устанавливали. И потом никто приложение не трогал. Возможно ли, что объекты Security были созданы как-то иначе(скриптом)? Или возможно ли установить патч layer без перегенерации CIL?

2) Если восстановим сейчас копию базы в PrePROD (то есть, modelstore тоже), то все равно на PrePROD нужно будет перегенерировать CIL ? Или можно избежать этого? Мне на данный момент , чтобы время сэкономить, нужно только , чтобы бытчи работали, чтобы мне с основной performance проблемой быстро работать . Разбираться с ошибками компиляции (пропавшими объектами) потом будем.

Спасибо за помощь

Последний раз редактировалось kitty; 07.04.2025 в 11:06.
Старый 07.04.2025, 12:41   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,971 / 3267 (116) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Ну, в общем-то такое не редкость.
Были какие-то объекты (классы, менюитемы, таблички). Были security сущности которые на них ссылались. Объекты удалили или переименовали. Security смотрят в никуда теперь и поэтому при компиляции выдают ошибки. Это не катастрофа. Сборке CIL не мешает. Это же не пакеты а какие-то другие объекты.

CIL может собираться успешно даже по приложению которое скомпилировано с ошибками. Там просто в CIL будет вкомпилирован выброс исключения и все.
За это сообщение автора поблагодарили: kitty (1).
Старый 07.04.2025, 13:20   #3  
kitty is offline
kitty
Участник
 
383 / 30 (2) +++
Регистрация: 24.05.2005
Ого! Спасибо! Век живи - век учись. Всегда корректировали по умолчанию все ошибки на проектах, тк считалось, что иначе CIL не генерировался.

Если на то пошло, то какие ошибки тогда мешают а, какие - нет?
Что значит "будет вкомпилирован выброс искоючения" ?
Старый 07.04.2025, 15:47   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,971 / 3267 (116) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от kitty Посмотреть сообщение
Ого! Спасибо! Век живи - век учись. Всегда корректировали по умолчанию все ошибки на проектах, тк считалось, что иначе CIL не генерировался.
Долгое время так и было. Но начиная с одной из версий сделали оптимизацию, так что если какой-то метод не компилируется, то ЦИЛ все равно собирается, но в код этого метода ставится выброс исключения. В R3 точно уже должно быть так.

Цитата:
Сообщение от kitty Посмотреть сообщение
Если на то пошло, то какие ошибки тогда мешают а, какие - нет?
Что значит "будет вкомпилирован выброс искоючения" ?
Ну вместо кода соответствующего тому, что написано на X++ там будет стоять эквивалент
X++:
throw error('Блабла сообщение об ошибке');
Ну ошибки в правах доступа не мешают, так как сборка CIL не использует эти объекты.
Также по логике не должны мешать ошибки в джобах и формах, так как они не влияют на CIL. Но я не проверял.
Старый 08.04.2025, 09:34   #5  
kitty is offline
kitty
Участник
 
383 / 30 (2) +++
Регистрация: 24.05.2005
Спасибо огромное!
Старый 09.04.2025, 23:43   #6  
kitty is offline
kitty
Участник
 
383 / 30 (2) +++
Регистрация: 24.05.2005
Если все работает в PROD и копию базы(то есть, включая modelstore) восстановить в PrePROD, то обязательно ли снова гегерить CIL? Или можно скопировать XppIL.dll и обойтись без повторной компиляции + генерации CIL? (впевдо-код все равно в model store уже есть, то есть, компилировать не обязательно, думаю. А вот с dll не очень понимаю. Наверное, зависит от машины, на которой генеришь) Таким образом можно сэкономить несколько часов и иметь гарантированно рабочее приложение, как в PROD
Старый 10.04.2025, 11:33   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,340 / 3558 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от kitty Посмотреть сообщение
Если все работает в PROD и копию базы(то есть, включая modelstore) восстановить в PrePROD, то обязательно ли снова гегерить CIL? Или можно скопировать XppIL.dll и обойтись без повторной компиляции + генерации CIL? (впевдо-код все равно в model store уже есть, то есть, компилировать не обязательно, думаю. А вот с dll не очень понимаю. Наверное, зависит от машины, на которой генеришь) Таким образом можно сэкономить несколько часов и иметь гарантированно рабочее приложение, как в PROD
CIL состоит из двух частей (условно) - это записи в таблички SysXppAssembly, которая находится в БД модели и папка XppIL с лежащими в ней подпапками и файлами, которая хранится на АОСе.
Т.е. теоретически, если восстановить БД модели и заменить папку XppIL на всех АОСах PrePROD-а, то должно сработать.
Но я не проверял, потому что при копировании приложения (через бекап / восстановление БД модели) я просто собираю полный CIL на целевом приложении (в данном случае PrePROD). Это занимает минут 20-30. Тут достаточно спорный вопрос - что быстрее копировать папку XppIL или собрать полный CIL при условии, что копируется еще подпапка source c более, чем 300 тыс файлов. Без нее конечно быстрее, но у нас обычно PrePROD еще иногда может использоваться для отладки, а значит эта папка 100% нужна

В то же время, зашив в Powershell-скрипт все шаги по копированию БД, сборки CIL, перенастройки SSRS-отчетов и прочих интеграций - можно добиться достаточно быстрого копирования. Собственно - без учета времени копирования основной БД или синхронизации (если брать только модель) - то в сумме вся процедура занимает около 30-40 минут (5 минут тратится на первый старт АОСа после очистки таблички SysXppAssembly).
__________________
Возможно сделать все. Вопрос времени
Старый 11.04.2025, 15:08   #8  
kitty is offline
kitty
Участник
 
383 / 30 (2) +++
Регистрация: 24.05.2005
Я хотела точно не огрести проблем с CIL , тк надо срочно сделать багфикс. Поэтому по-максимому хотела избежать ошибкок кв нем, да и время на его генерацию не тратить.

Нашла старый док по этому клиенту , указано, что полная компиляция в продакшн 5 часов и Cil полчаса . В PrePROD тут дольше будет. Но, как я понимаю, можно только CIL обойтись, без полной компиляции, тк modelstore уже содержит откомпилированный код. Поэтому вопрос времени отпадает сам собой, вы правы. Ну час -два будет генериться. Это терпимо
Старый 11.04.2025, 15:20   #9  
kitty is offline
kitty
Участник
 
383 / 30 (2) +++
Регистрация: 24.05.2005
А вот обратный вопрос. Я сейчас сделаю фикс на PrePROD. Его патчем на PROD надо положить (на USR слой). Фикс - это изменение кода в методе класса. Может, еще существующем menu item сделаю runOn = Server. То есть, с ID никаких проблем не должно быть.

Можно ли такую процедуру успользовать,
  1. Делаю бэкап modelstore с помощью AXUtil
  2. Останавливаю все AOS, кроме одного. Передодключаюсь и попадаю на этот оставшийся АОС и на нем делаю reject new users
  3. Импортирую xpo на USR слой (естественно, проверяя, что нет модицикаций в лкссе на нем уже и делая сравнения и бэкап, если есть)
  4. Компилирую + compile forward на импортируемом классе
  5. Делаю Incremental CIL
  6. Запускаю остановленные AOS
  7. Даю доступ пользователям на текущий AOS
?
Или нужно для такого патча также делать полный compile и генерировать полный CIL

Последний раз редактировалось kitty; 11.04.2025 в 15:27.
Старый 11.04.2025, 15:21   #10  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,340 / 3558 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от kitty Посмотреть сообщение
Я хотела точно не огрести проблем с CIL , тк надо срочно сделать багфикс. Поэтому по-максимому хотела избежать ошибкок кв нем, да и время на его генерацию не тратить.

Нашла старый док по этому клиенту , указано, что полная компиляция в продакшн 5 часов и Cil полчаса . В PrePROD тут дольше будет. Но, как я понимаю, можно только CIL обойтись, без полной компиляции, тк modelstore уже содержит откомпилированный код. Поэтому вопрос времени отпадает сам собой, вы правы. Ну час -два будет генериться. Это терпимо
Ну смотрите - из опыта проведения релиза:
1. Договариваемся между разработчиками, что перенос любых классов, имеющих наследников требует их инкрементной компиляции. Перенос имеется в виду через XPO на BUILD-приложение
2. Запускаю многопоточную компиляцию на BUILD-приложении. Это где-то 30 минут (если нет ошибок). Если есть ошибки - то может и до 1 часу доходить. Здесь я каждую ночь по шедулеру запускаю многопоточную компиляцию и сборку CIL. Да, если есть пресловутые 5 часов - то конечно можно и полную компиляцию запустить (хотя у знакомых коллег - полная компиляция из АОТ вообще всего часа 2 занимает - и это из-за старой версии SQL Server и старой версии Windows под нее)
3. Варианты: 1) Делаю выгрузку в modelStore и загружаю на PROD modelStore-файл
2) Делаю бекап-ресторе БД model и собираю CIL уже на PROD.
Оба варианта по времени плюс-минус одинаковы, но второй вариант позволяет меньше простаивать PROD-у. Это условно 30 минут (по факту 20-30)
3) Разворачиваю SSRS-отчеты и выполняю синхронизацию (40-45 минут)
4) Разворачиваю AIF-порты (минут 5-10)

Итого:
30 минут - компиляция BUILD
30 минут - накат кода + CIL (или накат modelstore)
50 минут - SSRS, синхронизация, AIF-порты

Условно - 2 часа.


При этом BUILD-приложение 1 раз в неделю компилируется из АОТ "на всякий случай"
__________________
Возможно сделать все. Вопрос времени
Старый 11.04.2025, 15:24   #11  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,340 / 3558 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от kitty Посмотреть сообщение
А вот обратный вопрос. Я сейчас сделаю фикс на PrePROD. Его патчем на PROD надо положить (на USR слой). Фикс - это изменение кода в методе класса. Может, еще существующем menu item сделаю runOn = Server. То есть, с ID никаких проблем не должно тыть.

Можно такую процедуру успользовать:
Да, так и надо делать. Но я еще предпочитаю после сборки CIL (равно как и после компиляции) рестартовать АОС, на котором эта сборка / компиляция выполнялась. Иначе в случае компиляции высока вероятность глюков (таблицы, View и Map могут переходить друг в другаЗ), а в случае CIL - просто очищаю оперативную память от мусора (иначе в ней все классы и таблицы находятся)
__________________
Возможно сделать все. Вопрос времени
Теги
ax2012 r3

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Почему может не работать Exception внутри транзакции axm2017 DAX: Программирование 3 27.03.2023 11:29
ax7: есть ли способ сделать так, чтобы в VS ошибки не пропадали при сохранении файла? mazzy DAX: Программирование 6 18.10.2017 10:41
stephenmann: Technical History of Dynamics AX - From Axapta 3.0 to AX2012 Blog bot DAX Blogs 5 03.03.2017 10:22
X++: X++ Function num2Str: Difference in .NET CIL Mode Blog bot DAX Blogs 0 09.03.2012 07:45
Может ли Axapta3.0 работать под MSSQL SERVER 2005 grishan DAX: Администрирование 3 12.03.2006 18:08

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:50.