Top.Mail.Ru
Коды ошибок базы данных | Tarantool
Tarantool
Узнайте содержание релиза 2.8

Коды ошибок базы данных

Коды ошибок базы данных

In the current version of the binary protocol, error messages, which are normally more descriptive than error codes, are not present in server responses. The actual message may contain a file name, a detailed reason or operating system error code. All such messages, however, are logged in the error log. Below are general descriptions of some popular codes. A complete list of errors can be found in file errcode.h in the source tree.

Список кодов ошибок

ER_NONMASTER (Репликация) Экземпляр сервера не может вносить изменения в данные, если он не является мастером.
ER_ILLEGAL_PARAMS Недопустимые параметры. Некорректное протокольное сообщение.
ER_MEMORY_ISSUE Нехватка оперативной памяти: достижение предела памяти memtx_memory.
ER_WAL_IO Запись на диск не удалась. Может означать, что не удалось записать изменение в журнале упреждающей записи. Некоторая ошибка на диске.
ER_KEY_PART_COUNT Количество частей ключа не совпадает с количеством частей индекса
ER_NO_SUCH_SPACE Указанный спейс отсутствует.
ER_NO_SUCH_INDEX Указанного индекса нет в указанном спейсе.
ER_PROC_LUA Возникла ошибке в Lua-процедуре.
ER_FIBER_STACK При создании нового файбера был достигнут предел рекурсии. Обычно это указывает на то, что хранимая процедура слишком часто рекурсивно вызывает себя.
ER_UPDATE_FIELD Возникла ошибка во время обновления поля.
ER_TUPLE_FOUND В уникальном индексе есть повторяющийся ключ.

Обработка ошибок

Ниже представлены несколько процедур для более надежного вызова Lua-функций в случае ошибок, в частности, ошибок базы данных.

  1. Вызов с помощью pcall.

    Используйте механизмы Lua для «Обработки ошибок и исключений», в частности pcall. То есть вместо простого вызова функции с помощью
    box.space.имя-спейса:имя-функции()
    выполните
    if pcall(box.space.имя-спейса.имя-функции, box.space.имя-спейса) ...
    Для некоторых функций модуля box в Tarantool’е pcall также вернет описание ошибки, включая имя файла и номер строки в исходном коде Tarantool’а. Например:
    x, y = pcall(function() box.schema.space.create('') end)
    y:unpack()

    Чтобы увидеть применение pcall в приложении, см. практическое задание Подсчет суммы по JSON-полям во всех кортежах.

  2. Проверка и вызов ошибки с помощью box.error.

    В модуле box.error предусмотрена функция box.error(code, errtext [, errtext …]), чтобы создать ошибку и передать ее.

    Чтобы найти последнюю ошибку, в модуле box.error предусмотрена функция box.error.last(). (Также можно найти текст последней ошибки операционной системы для определенной функции – errno.strerror([code]).)

  3. Запись в журнал.

    Записывайте сообщения в журнал с помощью модуля log.

    И отфильтровывайте автоматически созданные сообщения с помощью конфигурационного параметра log.

Как правило, встроенные функции Tarantool’а, которые предназначены для возврата объектов, вернут либо объект, либо нулевое значение nil, либо Lua-ошибку. Например, рассмотрим программу fio_read.lua из рекомендаций по разработке:

#!/usr/bin/env tarantool

local fio = require('fio')
local errno = require('errno')
local f = fio.open('/tmp/xxxx.txt', {'O_RDONLY' })
if not f then
    error("Failed to open file: "..errno.strerror())
end
local 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’а должны работать таким образом, если в руководстве явно не говорится об обратном.