Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Исправление ошибки разрыва соединений при наличии сервера лицензирования без установленного на него native клиента. #651

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -287,9 +287,9 @@
Сеансы = ПолучитьСписокСеансов();

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

Сеансы = ПолучитьСписокСеансов();
Если Сеансы.Количество() = 0 Тогда
Expand Down Expand Up @@ -510,99 +510,66 @@

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

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

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

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

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

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

РазорватьПовисшиеСоединение(Соединение);
КонецЦикла;

КонецЕсли;
КонецЦикла;

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

Функция ПолучитьСписокРабочихПроцессов()
Функция ПолучитьСоединения()

ОписаниеКластера = МенеджерRac.ОписаниеКластера();
КомандаЗапускаПроцессы = МенеджерRac.СтрокаЗапускаКлиента() + СтрШаблон("process list --cluster=""%1""%2",
МенеджерRac.ИдентификаторКластера(ОписаниеКластера),
МенеджерRac.КлючиАвторизацииВКластере()) + " " + Настройки.АдресСервераАдминистрирования;

Лог.Информация("Получаю список рабочих процессов...");
СписокПроцессов = ЗапуститьПроцесс(КомандаЗапускаПроцессы);

Результат = МенеджерRAC.РазобратьПоток(СписокПроцессов);

Возврат Результат;

КонецФункции

Функция ПолучитьСоединенияРабочегоПроцесса(Знач РабочийПроцесс)

ОписаниеКластера = МенеджерRac.ОписаниеКластера();
КомандаЗапускаСоединения = МенеджерRac.СтрокаЗапускаКлиента() + СтрШаблон("connection list --cluster=""%1""%2 --infobase=%3%4 --process=%5",
КомандаЗапускаСоединения = МенеджерRac.СтрокаЗапускаКлиента()
+ СтрШаблон("connection list --cluster=""%1""%2 --infobase=%3%4",
МенеджерRac.ИдентификаторКластера(ОписаниеКластера),
МенеджерRac.КлючиАвторизацииВКластере(),
МенеджерRAC.ИдентификаторБазы(),
МенеджерRAC.КлючиАвторизацииВБазе(),
РабочийПроцесс["process"]) + " " + Настройки.АдресСервераАдминистрирования;
МенеджерRAC.КлючиАвторизацииВБазе()) + " " + Настройки.АдресСервераАдминистрирования;

Результат = Новый Массив;
Лог.Информация("Получаю список соединений рабочего процесса...");
Соединения = Новый Массив;
Лог.Информация("Получаю список соединений...");

Попытка
Соединения = МенеджерRAC.РазобратьПоток(ЗапуститьПроцесс(КомандаЗапускаСоединения));
Исключение
ТекстОшибки = ОписаниеОшибки();
Если СтрНайти(ВРег(ТекстОшибки), "РАБОЧИЙ ПРОЦЕСС С УКАЗАННЫМ ИДЕНТИФИКАТОРОМ НЕ НАЙДЕН") = 0 Тогда
ВызватьИсключение;
КонецЕсли;
Лог.Отладка("Пропускаю ошибку: " + ТекстОшибки);

Соединения = Новый Массив;
КонецПопытки;

Для Каждого ТекПроцесс Из Соединения Цикл
Если ВРег(ТекПроцесс["app-id"]) = "RAS"
Или Не МенеджерФильтраПриложений.СеансПодходит(ТекПроцесс["app-id"], ТекПроцесс["user-name"]) Тогда
Продолжить;
КонецЕсли;

Результат.Добавить(ТекПроцесс);
Результат = Новый Массив;

Для каждого Соединение Из Соединения Цикл
Если МенеджерФильтраПриложений.СеансПодходит(Соединение["application"]) Тогда
Результат.добавить(Соединение);
КонецЕсли;
КонецЦикла;

Возврат Результат;
Возврат Соединения;

КонецФункции

Процедура РазорватьСоединениеСПроцессом(Знач РабочийПроцесс, Знач Соединение)
Процедура РазорватьПовисшиеСоединение(Знач Соединение)

Если Не Соединение["session-number"] = 0 Тогда
// Это не повисшее соединение. Его мы разрывать не будем
Возврат;
КонецЕсли;

ОписаниеКластера = МенеджерRac.ОписаниеКластера();
КомандаРазрывСоединения = МенеджерRac.СтрокаЗапускаКлиента() + СтрШаблон("connection disconnect --cluster=""%1""%2 %3 --process=%4 --connection=%5",
КомандаРазрывСоединения = МенеджерRac.СтрокаЗапускаКлиента()
+ СтрШаблон("connection disconnect --cluster=""%1""%2 %3 --process=%4 --connection=%5",
МенеджерRac.ИдентификаторКластера(ОписаниеКластера),
МенеджерRac.КлючиАвторизацииВКластере(),
МенеджерRAC.КлючиАвторизацииВБазе(),
РабочийПроцесс["process"],
Соединение["process"],
Соединение["connection"]) + " " + Настройки.АдресСервераАдминистрирования;

Сообщение = СтрШаблон("Отключаю соединение %1 [%2] (%3)",
Соединение["conn-id"],
Соединение["app-id"],
Соединение["user-name"]
);
Сообщение = СтрШаблон("Отключаю соединение %1 [%2]",
Соединение["conn-id"],
Соединение["application"]);

Лог.Информация(Сообщение);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,14 @@
Лог = ПарамЛог;
КонецПроцедуры

Функция СеансПодходит(Приложение, Пользователь) Экспорт
// Функция - СеансПодходит предназначена для определения соответствия сеанса критериям фильтрации
//
// Параметры:
// Приложение - Строка - Идентификатор типа приложения
// Пользователь - Строка - Имя пользователя иб которому принадлежит сеанс
// Возвращаемое значение:
// Булево - результат. Истина если сеанс подходит под критерии
Функция СеансПодходит(Приложение, Пользователь = Неопределено) Экспорт

Если РежимРаботыФильтра = "OFF" Тогда
Возврат Истина;
Expand Down
Loading