From 62053cac61a08383abfadf0a3ebac7ca74943ce3 Mon Sep 17 00:00:00 2001 From: vladimirkl <72238+vladimirkl@users.noreply.github.com> Date: Sat, 15 Mar 2025 20:29:07 +0300 Subject: [PATCH 1/2] Fix ZIO#timeoutTo inheriting wrong value from FiberRef#locally (#9693) --- core-tests/shared/src/test/scala/zio/FiberRefSpec.scala | 9 +++++++++ core/shared/src/main/scala/zio/ZIO.scala | 6 +++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/core-tests/shared/src/test/scala/zio/FiberRefSpec.scala b/core-tests/shared/src/test/scala/zio/FiberRefSpec.scala index e6dd180dce10..3561f8fe690b 100644 --- a/core-tests/shared/src/test/scala/zio/FiberRefSpec.scala +++ b/core-tests/shared/src/test/scala/zio/FiberRefSpec.scala @@ -101,6 +101,15 @@ object FiberRefSpec extends ZIOBaseSpec { value <- fiberRef.get } yield assert(localValue)(equalTo(update)) && assert(value)(equalTo(initial)) }, + test("`locally` restores parent's value after timeout") { + for { + fiberRef <- FiberRef.make(initial) + child <- fiberRef.locally(update)(ZIO.sleep(10.seconds)).timeout(1.second).fork + _ <- TestClock.adjust(1.second) + _ <- child.join + value <- fiberRef.get + } yield assert(value)(equalTo(initial)) + }, test("`modify` changes value") { for { fiberRef <- FiberRef.make(initial) diff --git a/core/shared/src/main/scala/zio/ZIO.scala b/core/shared/src/main/scala/zio/ZIO.scala index 9bf8f6cae723..56e64674557f 100644 --- a/core/shared/src/main/scala/zio/ZIO.scala +++ b/core/shared/src/main/scala/zio/ZIO.scala @@ -5603,14 +5603,14 @@ object ZIO extends ZIOCompanionPlatformSpecific with ZIOCompanionVersionSpecific self.raceFibersWith[R, Nothing, E, Unit, B1](ZIO.sleep(duration).interruptible)( (winner, loser) => winner.await.flatMap { exit => - winner.inheritAll *> loser.interruptAs(parentFiberId) *> exit.mapExit(f) + loser.interruptAs(parentFiberId) *> winner.inheritAll *> exit.mapExit(f) }, (winner, loser) => winner.await.flatMap { case e: Exit.Failure[Nothing] => - loser.inheritAll *> loser.interruptAs(parentFiberId) *> e + loser.interruptAs(parentFiberId) *> loser.inheritAll *> e case _ => - loser.inheritAll *> loser.interruptAs(parentFiberId).as(b()) + loser.interruptAs(parentFiberId) *> loser.inheritAll.as(b()) }, null, FiberScope.global From c145e8bc02fcfe86429bccf5622f419ccdeeacc9 Mon Sep 17 00:00:00 2001 From: Adam Hearn <22334119+hearnadam@users.noreply.github.com> Date: Sat, 15 Mar 2025 15:03:01 -0700 Subject: [PATCH 2/2] use ZIO.never --- core-tests/shared/src/test/scala/zio/FiberRefSpec.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-tests/shared/src/test/scala/zio/FiberRefSpec.scala b/core-tests/shared/src/test/scala/zio/FiberRefSpec.scala index 3561f8fe690b..89d75b00c44d 100644 --- a/core-tests/shared/src/test/scala/zio/FiberRefSpec.scala +++ b/core-tests/shared/src/test/scala/zio/FiberRefSpec.scala @@ -104,7 +104,7 @@ object FiberRefSpec extends ZIOBaseSpec { test("`locally` restores parent's value after timeout") { for { fiberRef <- FiberRef.make(initial) - child <- fiberRef.locally(update)(ZIO.sleep(10.seconds)).timeout(1.second).fork + child <- fiberRef.locally(update)(ZIO.never).timeout(1.second).fork _ <- TestClock.adjust(1.second) _ <- child.join value <- fiberRef.get