Обработка исключений#

В разделе описываются основные исключения, которые может сгенерировать DataGrid, а также объясняется, как настроить и использовать обработчик критических ошибок.

В таблице описаны исключения, которые поддерживает Ignite API, и действия для обработки исключений:

Исключение

Описание

Действие для обработки исключения

Исключения в режиме выполнения (runtime)

CacheInvalidStateException

Генерируется при попытке выполнения операций с кешем, в котором есть потерянные партиции. В зависимости от политики потери партиций, которая настроена для кеша, это исключение генерируется при операциях чтения или записи. Подробнее об этом написано в подразделе «Политика потери партиций» раздела «Настройка кешей»

Сброс потерянных партиций. Чтобы восстановить данные, верните в кластер узлы, которые привели к потере партиций

Да

IgniteException

Указывает на наличие ошибки в кластере

Операция не выполнена. Выйдите из метода

Да

IgniteClientDisconnectedException

Генерируется с помощью Ignite API при отключении клиентского узла от кластера. Генерируется из операций с кешем, Compute API и структур данных

Подождите и повторите выполнение операции

Да

IgniteAuthenticationException

Генерируется при ошибках аутентификации узла или безопасности

Операция не выполнена. Выйдите из метода

Нет

IgniteClientException

Может быть сгенерировано из операций c кешем

Проверьте сообщение об исключении — в нем указано, что нужно сделать

Да

IgniteDeploymentException

Генерируется, когда Ignite API не может развернуть задание или задачу на узле. Генерируется из Compute API

Операция не выполнена. Выйдите из метода

Да

IgniteInterruptedException

Используется при обертывании стандартного InterruptedException в IgniteException

Повторите выполнение операции после очистки флага Interrupted

Да

IgniteSpiException

Генерируется различными SPI (CollisionSpi, LoadBalancingSpi, TcpDiscoveryIpFinder, FailoverSpi, UriDeploymentSpi и прочие)

Операция не выполнена. Выйдите из метода

Да

IgniteSQLException

Генерируется при ошибке обработки SQL-запроса. Исключение также предоставляет коды ошибок, которые относятся к запросу

Операция не выполнена. Выйдите из метода

Да

IgniteAccessControlException

Генерируется при наличии ошибок аутентификации/авторизации

Операция не выполнена. Выйдите из метода

Нет

IgniteCacheRestartingException

Генерируется из API кеша DataGrid при перезапуске кеша

Подождите и повторите выполнение операции

Да

IgniteFutureTimeoutException

Генерируется, когда истекает время получения результата асинхронных вычислений

Увеличьте ограничение по тайм-ауту или выйдите из метода

Да

IgniteFutureCancelledException

Генерируется, когда вычисление Future нельзя получить, так как его отклонили

Повторите выполнение операции

Да

IgniteIllegalStateException

Указывает, что экземпляр DataGrid находится в недопустимом состоянии для запрошенной операции

Операция не выполнена. Выйдите из метода

Да

IgniteNeedReconnectException

Указывает, что узел должен попытаться повторно подключиться к кластеру

Повторите выполнение операции

Нет

IgniteDataIntegrityViolationException

Генерируется, если обнаружено нарушение целостности данных

Операция не выполнена. Выйдите из метода

Да

IgniteOutOfMemoryException

Генерируется из операций с кешем, когда система не имеет достаточного размера памяти для обработки операций DataGrid

Операция не выполнена. Выйдите из метода

Да

IgniteTxOptimisticCheckedException

Генерируется при оптимистичном падении транзакции

Повторите выполнение операции

Нет

IgniteTxRollbackCheckedException

Генерируется при автоматическом откате транзакции

Повторите выполнение операции

Нет

IgniteTxTimeoutCheckedException

Генерируется, когда время выполнения транзакции истекло

Повторите выполнение операции

Нет

ClusterTopologyException

Указывает на наличие ошибки в топологии кластера, например критического сбоя узла и других. Генерируется из Compute и Events API

Подождите выполнение Future и повторите выполнение операции

Да

Обработка критических сбоев#

DataGrid — отказоустойчивая система. В реальности могут возникать непредсказуемые проблемы, которые влияют на состояние отдельного узла или всего кластера. Такие проблемы можно обнаружить во время выполнения и устранить с помощью предварительно настроенного обработчика критических ошибок.

Критические сбои#

Ошибки, которые относятся к критическим:

  • системные критические ошибки, в том числе OutOfMemoryError (подробнее написано в перечне ниже);

  • случайные завершения работы системных рабочих потоков, в том числе из-за необработанных исключений;

  • зависание системных рабочих потоков;

  • сегментация узлов кластера.

Системные критические ошибки ведут к неработоспособности системы, например:

  • Ошибки файлового ввода-вывода — обычно IOException генерируется во время операций чтения и записи. Ошибка может появляться при режиме хранения в памяти и включенной персистентности регионов данных (в том числе при ошибках устройства и в случаях, когда не осталось места в памяти). DataGrid использует диск для хранения метаданных, например в случаях, когда превышен лимит файловых дескрипторов или запрещен доступ к файлу.

  • Ошибка нехватки памяти — системе управления памяти DataGrid не удается выделить больше места (IgniteOutOfMemoryException).

  • Ошибка нехватки памяти — на узле кластера заканчивается Java heap (OutOfMemoryError).

Обработка критических сбоев#

Когда DataGrid обнаруживает критический сбой, он устраняется в соответствии с предварительно настроенным обработчиком ошибок. Пример настройки обработчика:

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="failureHandler">
        <bean class="org.apache.ignite.failure.StopNodeFailureHandler"/>
    </property>
</bean>
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setFailureHandler(new StopNodeFailureHandler());
Ignite ignite = Ignition.start(cfg);

DataGrid поддерживает следующие обработчики ошибок:

Класс

Описание

NoOpFailureHandler

Игнорирует любые сбои. Полезно для тестирования и отладки

RestartProcessFailureHandler

Реализация, которую можно использовать только с ignite.sh|bat. Процесс можно остановить с помощью метода Ignition.restart(true)

StopNodeFailureHandler

Вызывает остановку узла в случае критических ошибок с помощью вызова метода Ignition.stop(true) или Ignition.stop(nodeName, true)

StopNodeOrHaltFailureHandler

Обработчик ошибок по умолчанию, который вызывает остановку узла. Если узел не может остановиться, обработчик прекращает процессы JVM

Проверка работоспособности критически важных потоков#

В DataGrid есть несколько внутренних потоков, которые критически важны для корректной работы кластера. Если один из них остановился, узел может стать неработоспособным.

Критически важные системные потоки:

  • Discovery worker — обработка событий Discovery.

  • TCP communication worker — одноранговая (peer-to-peer) коммуникация между узлами.

  • Exchange worker — обмен картой партиций.

  • Striped pool — выполнение пользовательских операций

  • System pool — координация работы кластера, обработка системных событий, управление кешем.

  • Timeout worker — обработка тайм-аутов.

  • Checkpoint thread — создание контрольных точек в персистентном DataGrid.

  • WAL workers — ведение WAL-журнала, архивирование сегментов и сжатие.

  • Expiration worker — отслеживание срока жизни кешей TTL.

  • NIO workers — обработка сетевых операций.

В DataGrid есть внутренний механизм проверки работоспособности критически важных потоков. Каждый поток регулярно проверяется, чтобы подтвердить, что он активен и обновляет временную метку Heartbeat. Если поток неактивен и не обновляется, он считается заблокированным. DataGrid выведет сообщение в log-файл. Можно установить период неактивности с помощью свойства IgniteConfiguration.systemWorkerBlockedTimeout.

Хотя в DataGrid отсутствие ответа системного потока считается критической ошибкой, эта ситуация не обрабатывается автоматически, кроме вывода сообщения в log-файл. Чтобы включить конкретный обработчик ошибок для не отвечающих системных потоков всех типов, очистите свойство обработчика ignoredFailureTypes:

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="systemWorkerBlockedTimeout" value="#{60 * 60 * 1000}"/>
    <property name="failureHandler">
        <bean class="org.apache.ignite.failure.StopNodeFailureHandler">
          <!-- Разрешите обработчику реагировать на неактивные критические потоки. -->
          <property name="ignoredFailureTypes">
            <list>
            </list>
          </property>
      </bean>
    </property>
</bean>
StopNodeFailureHandler failureHandler = new StopNodeFailureHandler();
failureHandler.setIgnoredFailureTypes(Collections.EMPTY_SET);

IgniteConfiguration cfg = new IgniteConfiguration().setFailureHandler(failureHandler);

Ignite ignite = Ignition.start(cfg);

Обработка исключений в вычислительных заданиях#

Если ComputeTaskAdapter используется в качестве реализации вычислительной задачи и любое сопоставленное вычислительное задание генерирует исключение во время выполнения, вся вычислительная задача немедленно завершается с исключением IgniteException, а все оставшиеся вычислительные задания останавливаются асинхронно. Сбои вычислительных заданий можно отслеживать в лог-файле DataGrid по сообщениям вида Remote job throws user exception…. Подробнее о классе ComputeTaskAdapter написано в подразделе «Адаптеры вычислительных задач» раздела «MapReduce API».

Примечание

В данном случае нет гарантии, что все вычислительные задания завершат свое исполнение к концу выполнения вычислительной задачи.