ruby-concurrency / ruby-concurrency/concurrent-ruby

Promise.zip hangs on rejected promise in chain

Aperta
#870 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Lingua principale
Ruby
Stelle
5.8k
Fork
420
Merge medio
20h 45m
PR unite (30g)
4

Descrizione

Promise.zip seems to hang with any rejected promise in its collection for large enough collections (several hundred items).

Here is a minimal repro:

1.upto(1000).map do |n|
  puts n
  promises = Array.new(n) do |i|
    Concurrent::Promise.new do
      raise 'rejected' if i.zero?
      '.'
    end
  end
  all = Concurrent::Promise.zip(*promises).execute
  all.wait(1)
  raise 'failed' if all.state == :unscheduled
end

Removing the rejected promise (e.g., removing the raise 'rejected' if i.zero? line) causes the code to run without issue for higher n as expected.

Tested on concurrent-ruby version 1.1.6, Ubuntu 18.04.4, with various rubies installed via rbenv:

  • MRI 2.7.1 (fails at n = 340 both with and without concurrent-ruby-ext)
  • MRI 2.6.0 (fails at n = 261)
  • JRuby 9.2.11.1 (fails at n usually somewhere between 100-500)
  • TruffleRuby 20.0.0 (fails randomly with [ruby] WARNING StackOverflowError, sometimes handling n > 10000, other times failing at n = 50)

Using the newer Promises APIs (e.g., replacing Concurrent::Promise.new with Concurrent::Promises.future and Concurrent::Promises.zip with Concurrent::Promises) seems to work without any issues for much higher n. This still seems like a valid bug for as long the original Promise APIs are still available and bugs are still being fixed in them.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Start by running the provided reproduction against the legacy Concurrent::Promise.zip API and compare its behavior with Concurrent::Promises.zip. Trace the rejection handling and completion behavior in Promise.zip; done means rejected collections complete without hanging, with a regression test covering a large collection.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
ruby
Ambito
backend
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.