2.6 KiB
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.
Для обработки ошибок, вам потребуется использовать функции errors.Is
и errors.As
. Мы
советуем прочитать документацию и заметку в блоге,
перед тем как приступать к этому заданию.