You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When a resource is borrowed from the pool, it's not a part of the PoolMap anymore. Hence it will not be destroyed during the finalization of the pool.
The resource will be open until it's not completed itself. Thus IO.never as a part of the operation with the resource can hang the whole system.
Example:
sealedtraitKeycaseobjectKeyextendsKeyclassConnection(valisOpen:Ref[IO, Boolean])
valpool=KeyPool
.Builder(
(_: Key) =>IO.ref(true).map(newConnection(_)),
(conn: Connection) => conn.isOpen.set(false)
)
.doOnCreate(conn =>IO.println(s"created $conn"))
.doOnDestroy(conn =>IO.println(s"destroyed $conn"))
.build
.onFinalize(IO.println("pool was closed"))
defexample(outerAwait: Deferred[IO, Unit]):IO[FiberIO[(Boolean, Boolean)]] =
pool.use { p =>defjob(innerAwait: Deferred[IO, Unit]):IO[(Boolean, Boolean)] =
p.take(Key).use { managed =>valconnection= managed.value
for {
status1 <- connection.isOpen.get
_ <-IO.println("awaiting inner")
_ <- innerAwait.complete(())
_ <-IO.println("awaiting outer")
_ <- outerAwait.get // wait for the signal from the outside
_ <-IO.println("after awaits")
status2 <- connection.isOpen.get // isOpen should be 'false' there// _ <- IO.never[Unit] // once uncommented the program will hang
} yield (status1, status2)
}
for {
await <-IO.deferred[Unit]
fiber <- job(await).start
_ <- await.get // make sure first part happens inside of the open pool
} yield fiber
}
for {
await <-IO.deferred[Unit]
fiber <- example(await)
_ <- await.complete(()) // pool is closed and we continue execution of the job
outcome <- fiber.join
(status1, status2) <- outcome.embedNever
_ <-IO.println(s"(pool open): is connection open $status1")
_ <-IO.println(s"(pool closed): is connection open $status2")
} yield ()
Output:
created Connection@76426537
awaiting inner
awaiting outer
pool was closed
after awaits
destroyed Connection@76426537
(pool open): is connection open true
(pool closed): is connection open true
Expected output:
created Connection@76426537
awaiting inner
awaiting outer
destroyed Connection@76426537
pool was closed
after awaits
(pool open): is connection open true
(pool closed): is connection open false
The text was updated successfully, but these errors were encountered:
keypool version: 0.4.7
When a resource is borrowed from the pool, it's not a part of the
PoolMap
anymore. Hence it will not be destroyed during the finalization of the pool.The resource will be open until it's not completed itself. Thus
IO.never
as a part of the operation with the resource can hang the whole system.Example:
Output:
Expected output:
The text was updated successfully, but these errors were encountered: