shad-go/retryupdate
2020-03-11 16:17:13 +03:00
..
kvapi Use sentinel value 2020-03-11 16:17:13 +03:00
mock_test.go Add retryupdate task 2020-03-07 22:14:49 +03:00
README.md Add retryupdate task 2020-03-07 22:14:49 +03:00
update.go Add retryupdate task 2020-03-07 22:14:49 +03:00
update_test.go Use sentinel value 2020-03-11 16:17:13 +03:00

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.