shad-go/retryupdate/README.md
2020-03-07 22:14:49 +03:00

2.2 KiB
Raw Blame History

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.