Присоединяясь к новому проекту, разработка и поддержание долгоживущей программы, решил обновить себе ноутбук. Давно хотел приобрести себе что-то такое компактное, легкое, чтоб можно было спокойно взять с собой в кофейню, поработать часик-другой вне офиса.
Выбор пал на ноутбук HP c 14'' экраном, поддерживающим расширение 1920x1080, что и явилось решающим критерием для выбора. Железо вроде хорошее, но вот софт от HP заставляет задумываться, а надо ли оно было.
История
Функционал программы, с которым нужно работать, как я уже сказал, долго живущий, т.е. он пережил много итераций, смен руководителей и разработчиков и представляет из себя такой микс всего правильного, понятного и непонятного со статусом "А зачем это было надо?". В общем, хороший legacy код.
Так вот, одной из особенностью функционала является использование распределённых транзакций. Т.е. на компьютере должен работать сервис MSDTC (он же Distributed Transaction Coordinator, он же Координатор распределённых транзакций) и включены соответствующие настройки.
Вроде всё хорошо. У других участников команды (они не используют HP) проект компилируется, запускается и отрабатываются все сценарии. Работа идёт полным ходом.
Хорошо. Беру свой новенький HP, настраиваю, устанавливаю, скачиваю, компилирую, запускаю, прогоняю сценарии и бац, ошибка:
System.Data.SqlClient.SqlException (0x80131904): MSDTC on server 'MALS-K9CA69NU' is unavailable.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
at System.Data.SqlClient.TdsParser.GetDTCAddress(Int32 timeout, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlInternalConnectionTds.GetDTCAddress()
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.PrepareConnection(DbConnection owningObject, DbConnectionInternal obj, Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at ...
Хорошо. Всякое бывает. Начинаю копать.
После потраченных часов, удаления антивируса, отключения брандмауэра (он же firewall), использования всех рекомендаций из интернета проблема остается. Ошибка упорно вылезает.
Исследуя очередной пост Error: 8004E00F when trying to access COM+ Applications in Component Services натыкаемся на комментарий, спасибо tsd.
Хорошо. Отключаем сервисы начинающиеся с HP, благо их немного:
Отключение первого же сервиса "HP Analytics service" даёт результат. Просто всё начинает работать. MSDTC отрабатывает нормально, все сценарии проходят успешно.
Так кто ты такой, HP Analytics service? Смотрим полный путь и имя исполняемого файла:
C:\windows\System32\DriverStore\FileRepository\hpanalyticscomp.inf_amd64_19ec9c352a1b5135\x64\TouchpointAnalyticsClientService.exe
В поисковике достаточно набрать Touchpoint Analytics Client
, чтоб начитаться всего хорошего про эту программу и как её упорно пытаются удалить.
Кратко, судя по записям в интернете, HP Analytics service (он же TouchpointAnalyticsClientService.exe, он же HP Touchpoint Analytics, он же TAInstaller.exe, и т.д.) это программа, при помощи которой HP снимает телеметрию с вашего компьютера и отправляет в HP. Основная особенность её работы в том, что она портит жизнь пользователям HP, то процессор загружает, то, вот, MSDTC ломает.
Резюмируем
Присутствует проблема с работой MSDTC.
Симптомы:
- У вас компьютер HP.
- У вас упорно возникает ошибка "System.Data.SqlClient.SqlException (0x80131904): MSDTC on server 'имя-сервера' is unavailable."
- Также вы получаетет ошибку "8004E00F when trying to access COM+ Applications in Component Services" при работе со Службой компанентов, (см.).
- Наличие работающего сервиса HP Analytics service.
Быстрое решение:
- Запускаем утилиту
Кофигурация системы
:
- В службах отключаем
HP Analytics service
:
- Перегружаем компьютер.