Fix doc about upsert
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
- update первым аргументом принимает ключ, upsert — тапл.
- Если update не находит по ключу — без ошибки возвращает nil.
- Если upsert не находит по ключу — вставляет тапл.
- update возвращает апдейтнутый тапл (если есть), upsert — всегда nil.
- если при применении операции в update возникает ошибка — она бросается, а в update — пишется в лог (say_error).
- при ошибке в update он откатывается целиком, то есть он применяет либо все операции атомарно, либо ничего.
- при ошибке в upsert пропускаются операции с ошибкой, все остальные — применяются. в частности это означает, что если в одном upsert несколько операций, приводящих к ошибке — будет несколько сообщений в логе.
- все это не надо путать с ошибками при выполнении запроса (а не операций), которые можно найти без чтения из индекса - например ключ/тапл не соответствуют формату. Такие ошибки бросаются в пользователя сразу, и для update и для upsert.
- если при выполнении запроса ошибка происходит при завершении запроса (например ER_CANT_UPDATE_PRIMARY_KEY), то любом случае откатывается весь update/upsert. При этом для update ошибка бросается пользователю, а для upsert - пишется в лог.
- В виниле upsert применяется не сразу, а на этапе мержа слоев, поэтому ошибка в лог прилетает в неопределенное время.
- Там еще в 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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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