shad-go/retryupdate/README.md
2020-03-14 14:12:01 +00:00

34 lines
No EOL
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# retryupdate
В этой задаче, вам нужно познакомиться с паттернами обработки ошибок в golang.
Вам дан клиент вымышленного сервиса. Сервис хранит отображение `key -> (value, version)`,
где `key` и `value` - это обычные строки. А `version` - уникальный идентификатор, который сгенерировал
клиент.
Вам доступны два метода - `Get` и `Set`. Поведение методов описано в пакете `kvapi`.
Методы могут завершаться с различными ошибками. Ошибки описаны в том же пакете.
Вам нужно реализовать функцию `UpdateValue`, которая принимает ключ и функцию
для "обновления" значения. Функция должна обновить значение по ключу, правильно обрабатывая
ошибки, возникающие в процессе работы.
- Если ключ не нашёлся, нужно передать в `updateFn` значение `nil`.
- Если произошла ошибка доступа, то нужно сразу выходить.
- Если произошла ошибка внутри updateFn, то нужно сразу выходить.
- Если случился конфликт при записи, и значение изменилось с момента последнего чтения,
то нужно прочитать новое значение и попробовать заново.
- Любые другие ошибки из `api` нужно "ретраить" бесконечно.
Функция должна минимизировать число запросов к API.
Для генерации нового `uuid` на клиенте, используйте вызов `uuid.Must(uuid.NewV4())`.
Большую цепочку `if`-ов удобнее писать через `switch`.
Для выхода из вложенных циклов вам помогут [loop labels](https://golang.org/doc/effective_go.html#switch).
Для обработки ошибок, вам потребуется использовать функции `errors.Is` и `errors.As`. Мы
советуем прочитать документацию и [заметку](https://blog.golang.org/go1.13-errors) в блоге,
перед тем как приступать к этому заданию.