A borrowed resource can postpone its termination
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 45/100
Direzione di ricerca
Inizia individuando nel repository keypool il codice relativo alla finalizzazione del pool e al ciclo di vita delle risorse prese in prestito. Riproduci l’esempio Scala dell’issue, incluso il caso IO.never, e verifica come vengono tracciate le risorse prese in prestito dopo la chiusura del pool. Il lavoro è completato quando la connessione presa in prestito viene distrutta e chiusa prima del completamento della finalizzazione del pool, in modo da ottenere l’output previsto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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:
sealed trait Key
case object Key extends Key
class Connection(val isOpen: Ref[IO, Boolean])
val pool = KeyPool
.Builder(
(_: Key) => IO.ref(true).map(new Connection(_)),
(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"))
def example(outerAwait: Deferred[IO, Unit]): IO[FiberIO[(Boolean, Boolean)]] =
pool.use { p =>
def job(innerAwait: Deferred[IO, Unit]): IO[(Boolean, Boolean)] =
p.take(Key).use { managed =>
val connection = 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
- Lingua principale
- Scala
- Stelle
- 39
- Fork
- 19
- Merge medio
- 15g 2h
- PR unite (30g)
- 3
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di typelevel/keypool
-
PoolSpec flakeAperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
-
Implement evictionPolicyApertacommons-pool2 parity
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
-
Implement blockWhenExhaustedApertacommons-pool2 parity
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
-
bug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 42/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
Tutte le issue di typelevel/keypool
Issue simili
-
withMaxHeaderSize is not applied to HTTP/2 since h2c support in 0.7.2 (431 Request Header Fields Too Large)Forse già presa @rbos-dhl l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
http4s/http4s-netty#1028 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 2 giorni
-
area/map-site bug layer/core size/S
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
marola-dev/marola-app#60 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
lambdaworks/zio-elasticsearch#863 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
I maintainer di solito rispondono entro 1 giorno