context.Context отправляет в тильт (меня)

Друзья, всем большой привет!

Недавно мне поручили простое дело: добавить таймаут для запроса в кеш. Для контекста: кеш у нас хранится в виде записей в нереляционной БД т.к. туда ходить в 100 раз быстрее, чем в мастер-систему(5 мс против 300).

Казалось бы простое дело, при создании соединения добавить SetTimeout, но я буквально целый день убил, чтобы понять почему оно не работает, хотя делал точно по инструкции. Жутко задизморалился и даже целых 15 минут думал, что я слишком тупой чтобы программировать.

В итоге выяснилось, что документацию к библиотеке лучше читать полностью, а не первые три предложения: в самой последней строчке было сказано, что если context, который передаётся в метод Find имеет deadline (ограничение по времени работы), то он приоритетнее, чем таймаут операции к базе(даже если он больше).

В итоге заменил везде «местный» контекст на context.TODO() и оно завелось. Правда потом на код-ревью узнал от нашего senior, что я дурак и надо было просто сделать копию контекста через ctx, cancel := context.WithTimeoutCause(ctx, time.Second, ErrCacheTimeout) defer cancel()

Кстати, если передать в time.Second 0, то контекст сразу отменится, а не будет бесконечным как я ожидал.

Такие дела

#golang

context.Context отправляет в тильт (меня) | Сетка — социальная сеть от hh.ru