Коды ошибок базы данных
В таблице ниже перечислены некоторые распространенные ошибки, которые могут возникать в Tarantool при различных проблемах. Полный список ошибок доступен в файле errcode.h.
Код | Значение box.error | Описание |
|---|---|---|
ER_NONMASTER | box.error.NONMASTER | (При репликации) Экземпляр сервера не может изменять данные, если он не является мастером. |
ER_ILLEGAL_PARAMS | box.error.ILLEGAL_PARAMS | Недопустимые параметры. Некорректное сообщение протокола. |
ER_MEMORY_ISSUE | box.error.MEMORY_ISSUE | Нехватка памяти: достигнут предел memtx_memory. |
ER_WAL_IO | box.error.WAL_IO | Ошибка записи на диск. Может означать: не удалось записать изменение в журнал предзаписи. |
ER_READONLY | box.error.READONLY | Невозможно изменить данные на экземпляре, доступном только для чтения. |
ER_KEY_PART_COUNT | box.error.KEY_PART_COUNT | Количество частей ключа не совпадает с количеством частей индекса. |
ER_NO_SUCH_SPACE | box.error.NO_SUCH_SPACE | Указанный спейс не существует. |
ER_NO_SUCH_INDEX | box.error.NO_SUCH_INDEX | Указанный индекс в указанном спейсе не существует. |
ER_PROC_LUA | box.error.PROC_LUA | Произошла ошибка внутри Lua-процедуры. |
ER_FIBER_STACK | box.error.FIBER_STACK | Достигнут предел рекурсии при создании нового файбера. Обычно это означает, что хранимая процедура рекурсивно вызывает сама себя слишком часто. |
ER_UPDATE_FIELD | box.error.UPDATE_FIELD | Произошла ошибка при обновлении поля. |
ER_TUPLE_FOUND | box.error.TUPLE_FOUND | В уникальном индексе обнаружен дубликат ключа. |
Ниже представлены несколько процедур для более надежного вызова Lua-функций в случае ошибок, в частности, ошибок базы данных.
-
Вызов функции с помощью
pcall.Используйте механизмы Lua для обработки ошибок и исключений, в частности
pcall. То есть, вместо вызова ...box.space.{space-name}:{function-name}()... вызывайте функцию следующим образом:
if pcall(box.space.{space-name}.{function-name}, box.space.{space-name}) ...Для некоторых функций box в Tarantool
pcallтакже возвращает детали ошибки, включая имя файла и номер строки в исходном коде Tarantool. Это можно увидеть, распаковав результат, например:status, error = pcall(function() box.schema.space.create('') end)error:unpack()См. руководство Суммирование JSON-поля для всех кортежей, чтобы узнать, как
pcallможно использовать в приложении. -
Анализ ошибок и вызов новых ошибок с помощью
box.error.Для создания новой ошибки и её передачи модуль
box.errorпредоставляет box.error().Для получения последней ошибки подмодуль
box.errorпредоставляет box.error.last(). Также существует способ получить текст последней ошибки операционной системы для определённых функций — errno.strerror([code]). -
Журналирование. Записывайте сообщения в журнал с помощью модуля log.
Фильтрация автоматически генерируемых сообщений выполняется с помощью конфигурационного параметра log.
Как правило, для встроенных функций Tarantool, предназначенных для возврата объектов: результатом является объект, nil или ошибка Lua. Например, рассмотрим программу fio_read.lua из руководства:
#!/usr/bin/env tarantoollocal fio = require('fio')local errno = require('errno')local f = fio.open('/tmp/xxxx.txt', {'O_RDONLY' })if not f thenerror("Failed to open file: "..errno.strerror())endlocal data = f:read(4096)f:close()print(data)
После вызова функции, который может завершиться неудачей, как в случае с
fio.open() выше, часто встречается конструкция вида
if not f then ... или if f == nil then ..., проверяющая типичные
ошибки. Но если бы была допущена синтаксическая ошибка, например
fio.opex вместо fio.open, то возникла бы ошибка Lua, и значение f не
изменилось бы. Если бы проверка таких очевидных ошибок имела значение,
программист, вероятно, использовал бы pcall().
Все функции в модулях Tarantool должны работать таким образом, если в руководстве явно не говорится об обратном.