Вызывать cancel должен код, создавший контекст - обычно через defer, чтобы освободить ресурсы таймера и сигнализировать отмену. Даже при срабатывании таймаута cancel нужно вызвать. Ранний return без cancel - утечка ресурсов таймера.
ctx, cancel := context.WithTimeout(parent, d)
defer cancel()