tarantool / tarantool/doc

Fix doc about upsert

Open
#3,537 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
CSS
Stars
15
Forks
49
Avg merge
1d 13h
Merged PRs (30d)
3

Description

Related dev. issue(s): n/a

Product: Tarantool
Root document: https://www.tarantool.io/en/doc/latest/reference/reference_lua/box_space/upsert/
SME: @ alyapunov

Details

Now upsert doc https://www.tarantool.io/en/doc/latest/reference/reference_lua/box_space/upsert/
is wrong in this line:
It is illegal to use upsert with a space that has a unique secondary index.
Actually there's no difference with update there, so you can use upsert with such spaces and even update fields of the secondary index.

Also I would be very glad if we add difference with update and disclaimer that you should not use this operation unless you use vinyl.

Here is some technical details Чтобы не путаться, давайте тут update и upsert будем называть запросами, а второй аргумент в них - массивом операций.
Разница между update и upsert
  1. update первым аргументом принимает ключ, upsert — тапл.
    1. Если update не находит по ключу — без ошибки возвращает nil.
    2. Если upsert не находит по ключу — вставляет тапл.
  2. update возвращает апдейтнутый тапл (если есть), upsert — всегда nil.
  3. если при применении операции в update возникает ошибка — она бросается, а в update — пишется в лог (say_error).
    1. при ошибке в update он откатывается целиком, то есть он применяет либо все операции атомарно, либо ничего.
    2. при ошибке в upsert пропускаются операции с ошибкой, все остальные — применяются. в частности это означает, что если в одном upsert несколько операций, приводящих к ошибке — будет несколько сообщений в логе.
    3. все это не надо путать с ошибками при выполнении запроса (а не операций), которые можно найти без чтения из индекса - например ключ/тапл не соответствуют формату. Такие ошибки бросаются в пользователя сразу, и для update и для upsert.
    4. если при выполнении запроса ошибка происходит при завершении запроса (например ER_CANT_UPDATE_PRIMARY_KEY), то любом случае откатывается весь update/upsert. При этом для update ошибка бросается пользователю, а для upsert - пишется в лог.
  4. В виниле upsert применяется не сразу, а на этапе мержа слоев, поэтому ошибка в лог прилетает в неопределенное время.
  5. Там еще в iproto чехарда. для update пожалели нового поля запроса и операции передаются там в поле IPROTO_TUPLE. Для upsert это уже не прокатило и ввели новое поле запроса IPROTO_OPS.
Предыстория

upsert придумывался строго для винила. Нужен был запрос типа апдейта, но который не требовал дорогого для винила чтения, и, наряду с replace и delete, мержился потоково в фоне. Это если и не бесплатно, то значительно дешевле, чем читающие операции — insert, update и select. Однако при мердже ошибки применения операций предьявлять уже некому, кроме лога. Поэтому операции должны были применяться по-максимуму, а ошибки — игнорироваться (и писаться в лог). По этой же причине было задумано в сам запрос передавать тапл, который нужно было вставить, если не найдено по ключу — с update-то можно было проверить результат выполнения и вставить самому. Поскольку ключ всегда содержится в тапле, то ключ передавать уже не надо, только тапл. Поэтому операцию назвали upsert — update or insert.

При создании upsertа мы очень старались сделать так, чтобы поведение не зависило от движка (memtx/vinyl). Поэтому в memtx оно тоже игнорирует некоторые ошибки.

Имхо название просто неудачное выбрано. По названию может показаться, что это просто update or insert. У нас же upsert - это специальный запрос для винила. Она действительно делает update or insert, но просто винилу это тоже было нужно, и винилу нужно было еще несколько вещей, которые также были впихнуты в этот запрос. Поэтому люди хватают и удивляются.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the upsert reference document at reference/reference_lua/box_space/upsert/ and review the statement about unique secondary indexes. Compare the documented behavior with the update/upsert distinctions and vinyl background described in the issue. Done means correcting the inaccurate statement, documenting the relevant differences, and adding the requested vinyl-use disclaimer.

Written by the indexing model from the issue text.

Assessment

Tech stack
lua
Domain
documentation
Issue type
Documentation
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.