shad-go/retryupdate
2022-02-10 22:06:57 +00:00
..
kvapi Resolve "upgrage to 1.17" 2022-02-10 22:06:57 +00:00
mock_test.go Add retryupdate task 2020-03-07 22:14:49 +03:00
README.md Update README.md 2020-03-14 14:12:01 +00:00
update.go Resolve "upgrage to 1.17" 2022-02-10 22:06:57 +00:00
update_test.go Update comment 2021-03-05 14:06:52 +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.

Для обработки ошибок, вам потребуется использовать функции errors.Is и errors.As. Мы советуем прочитать документацию и заметку в блоге, перед тем как приступать к этому заданию.