Ну там вот так в эффектах
def race[A, B](fa: F[A], fb: F[B]): F[Either[A, B]] =
flatMap(racePair(fa, fb)) {
case Left((a, fiberB)) => map(fiberB.cancel)(_ => Left(a))
case Right((fiberA, b)) => map(fiberA.cancel)(_ => Right(b))
}
Проверили - если имплементировать через racePair самим, но до канцеляции залогировать - всё так и работает - таймер просыпается через таймаут, логирует, потом пытается закенселить файбер. Т.к. файбер сидит пыхтит в блокирующем JDBC API, канселлейшен тоже ждет пока тот допыхтит до таймаута DB пула и последующие вычисления честно отменяются