vanessa-opensource / vanessa-runner

утилита автоматизации базовых операций разработчика 1С
Mozilla Public License 2.0
200 stars 106 forks source link

vrunner session kill - Ошибка при получении значения из базы данных. Возможной причиной является отсутствие установленного Microsoft SQL Server Native Client #622

Open Lelushka opened 2 months ago

Lelushka commented 2 months ago

Добрый день, на новом релизе 2.2.2 стабильная ошибка c командой session kill

10:35:53 C:\jenkins\workspace\UT_KG_Refresh-RefreshDB->vrunner session kill --with-nolock --ras "сервер" --db "база" --db-user "Администратор" --db-pwd "**" --uccode "CICD" --debuglog 10:35:53 vanessa-runner v2.2.2 10:35:54 ИНФОРМАЦИЯ - Отключаю существующие сеансы 10:35:54 ИНФОРМАЦИЯ - Получаю список кластеров 10:35:54 ИНФОРМАЦИЯ - Получаю список баз кластера 10:35:56 ИНФОРМАЦИЯ - Пауза перед отключением соединений 10:36:06 ИНФОРМАЦИЯ - Получаю список рабочих процессов... 10:36:06 ИНФОРМАЦИЯ - Получаю список соединений рабочего процесса... 10:36:06 ИНФОРМАЦИЯ - Получаю список соединений рабочего процесса... 10:36:07 ИНФОРМАЦИЯ - Попытка удаления сеансов №1 неудачна. Текст ошибки: 10:36:07 Сообщение от процесса 10:36:07 код:-1 процесс: Ошибка при получении значения из базы данных. Возможной причиной является отсутствие установленного Microsoft SQL Server Native Client. 10:36:07 КРИТИЧНАЯОШИБКА - {Модуль C:\Program Files\OneScript\lib\vanessa-runner\src\Классы\КомандаУправлениеСеансами.os / Ошибка в строке: 303 / Попытка удаления сеансов не удалась. Текст ошибки: 10:36:07 Сообщение от процесса 10:36:07 код:-1 процесс: Ошибка при получении значения из базы данных. Возможной причиной является отсутствие установленного Microsoft SQL Server Native Client.}**

Откатываю на 1.11.11 - все хорошо, работает штатно.

maraty2go commented 1 month ago

У меня на одном из серверов аналогичная ошибка периодически воспроизводится на версии vanessa-runner v1.11.11 Иногда решает повторный перезапуск джобы, иногда перезапуск службы 1С с чисткой сеансового кэша. В некоторых случаях ничего не помогает. Платформа 8.3.25.1257. На других стендах ошибка не воспроизводится при аналогичном окружении. Строка запуска vrunner session kill --ras server:1545 --cluster-admin "" --cluster-pwd "" --db infobase --lockendclear --lockmessage "Происходит обновление 1С на новый релиз!" --uccode "74" --db-user --db-pwd --v8version "8.3.25.1257" --debuglogfile log.txt

vanessa-runner v1.11.11 ИНФОРМАЦИЯ - Получаю список кластеров ИНФОРМАЦИЯ - Получаю список баз кластера ИНФОРМАЦИЯ - Сеансы запрещены ИНФОРМАЦИЯ - Отключаю существующие сеансы ИНФОРМАЦИЯ - Отключаю сеанс: 1 [DefUser] (BackgroundJob) ИНФОРМАЦИЯ - Отключаю сеанс: 4 [DefUser] (BackgroundJob) ИНФОРМАЦИЯ - Отключаю сеанс: 2 [DefUser] (BackgroundJob) ИНФОРМАЦИЯ - Отключаю сеанс: 3 [DefUser] (BackgroundJob) ИНФОРМАЦИЯ - Пауза перед отключением соединений ИНФОРМАЦИЯ - Получаю список рабочих процессов... ИНФОРМАЦИЯ - Получаю список соединений рабочего процесса... КРИТИЧНАЯОШИБКА - {Модуль C:\Program Files\OneScript\lib\vanessa-runner\src\Классы\КомандаУправлениеСеансами.os / Ошибка в строке: 294 / Попытка удаления сеансов не удалась. Текст ошибки: Сообщение от процесса код:-1 процесс: Ошибка при получении значения из базы данных. Возможной причиной является отсутствие установленного Microsoft SQL Server Native Client.}

ps: на тестовом стенде обновил oscript до 1.9.1.7, vrunner до 2.2.22 (через opm) платформа 8.3.25.1257. Ошибка так же стала воспроизводиться на ранее работавших скриптах.

maraty2go commented 1 month ago

Вариант исправления В классе vanessa-runner КомандаУправлениеСеансами.os добавить условие РабочийПроцесс["reserve"] = "no"

`Процедура ОтключитьСоединенияСРабочимиПроцессами()

Процессы = ПолучитьСписокРабочихПроцессов();

Для Каждого РабочийПроцесс Из Процессы Цикл Если РабочийПроцесс["running"] = "yes" И РабочийПроцесс["reserve"] = "no" Тогда

  СписокСоединений = ПолучитьСоединенияРабочегоПроцесса(РабочийПроцесс);
  Для Каждого Соединение Из СписокСоединений Цикл

    // Попытка
      РазорватьСоединениеСПроцессом(РабочийПроцесс, Соединение);
    // Исключение
    //   Лог.Ошибка(ОписаниеОшибки());
    // КонецПопытки;

  КонецЦикла;

КонецЕсли;

КонецЦикла;

КонецПроцедуры`

Мы получаем список рабочих процессов, а потом для каждого процесса отключаем соединения в цикле. В моем случае ошибка возникает, когда мы получаем процесс сервера лицензирования, а он не работает и не настраивался на работу с СУБД. Такой вариант работает, но нужно подумать, возможно по каким то другим критериям отсеивать процесс сервера лицензирования или на второй сервер установить все необходимые компоненты.

240596448 commented 2 weeks ago

По-моему нормальное решение. reserve - само то (спасибо за идею).

PS: Устанавливать на сервер лицензировая клиент - это какая-то крайность.

UPD: беру слова обратно. Процесс на сервере лицензирования вполне себе РабочийПроцесс["reserve"] = "no" и ни чем не отличается от других процессов ;(