Fragile window abandonment during concatMap operations; silent data loss
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 38/100
- Tipo de issue
- Bug
- Clareza
- Razoavelmente clara
- Status de atividade
- Estagnada
- Stack de tecnologia
- java
- Domínio
- backend-api-design
Direção de pesquisa
Comece executando as duas reproduções usando Flowable.window() com concatMapSingle() e concatMapMaybe(), comparando as variantes de blockingSubscribe(). Rastreie a interação entre o abandono das janelas e a inscrição downstream; o trabalho estará concluído quando as janelas não forem descartadas silenciosamente ou quando o abandono produzir o erro documentado.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Combining the Flowable.window() family of operators with any of the Flowable.concatMap*() operators appears to cause window abandonment bugs which are sensitive to how the outer Flowable is processed downstream. This despite the given concatMap lambdas returning an Rx Single/Maybe ready to be subscribed as soon as they are returned and which will signal the upstream window for subscription synchronously.
In the demonstrations below, I subscribe to identical .window().concatMap() constructions with very slightly different downstreams (.blockingSuscribe(System.out::println) vs. .doOnNext(System.out::println).blockingSubscribe()) and they emit drastically different results due to silent data-loss.
Example: Windowing a stream into lists, similar to the buffer() operator.
public static void main(String[] args) {
final var content = Flowable
.rangeLong(0, 100)
.window(10)
.concatMapSingle(Flowable::toList);
System.out.println("Example 1: Expected behavior for concetMapSingle(Flowable::toList)");
content
.doOnNext(System.out::println)
.blockingSubscribe();
System.out.println("Example 2: Window abandonment & data-loss");
content
.blockingSubscribe(System.out::println);
}
Output:
Example 1: Expected behavior for concetMapSingle(Flowable::toList)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
[50, 51, 52, 53, 54, 55, 56, 57, 58, 59]
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69]
[70, 71, 72, 73, 74, 75, 76, 77, 78, 79]
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
Example 2: Window abandonment & data-loss
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[10]
[20]
[30]
[40]
[50]
[60]
[70]
[80]
[90]
Example: Windowing a stream into a simple reduction operation.
public static void main(String[] args) {
final var windowSums = Flowable
.rangeLong(0, 100)
.window(10)
.concatMapMaybe(window -> window.reduce(Long::sum));
System.out.println("Example 3: Expected behavior for concetMapMaybe(window -> window.reduce(Long::sum))");
windowSums
.doOnNext(System.out::println)
.blockingSubscribe();
System.out.println("Example 4: Silent data loss");
windowSums
.blockingSubscribe(System.out::println);
}
Output:
Example 3: Expected behavior for concetMapMaybe(window -> window.reduce(Long::sum))
45
145
245
345
445
545
645
745
845
945
Example 4: Silent data loss
45
10
20
30
40
50
60
70
80
90
The flatMap*() family of operators seem less prone to this behavior but don't guarantee to retain the upstream ordering.
Ideally, I'd expect window() to be compatible with concatMap(). But if such is impossible, I'd expect the window-abandonment detection described in https://github.com/ReactiveX/RxJava/wiki/What%27s-different-in-3.0#window-abandonment-in-window to at least signal an error.
- Linguagem predominante
- Java
- Estrelas
- 48.2k
- Forks
- 7.6k
- Merge médio
- 3h 9min
- PRs com merge (30d)
- 25
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de ReactiveX/RxJava
-
4.x AI Enhancement Streamable
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 45/100
ReactiveX/RxJava#8299 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
4.x: FlowableBufferTest > longTimeAction() FAILEDTalvez livre de novo @akarnokd assumiu há 74 dias e não há nenhum pull request aberto. Aberta4.x Test-Failures
ReactiveX/RxJava#8280 · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
4.x Discussion
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 25/100
Mantenedores costumam responder em até 1 dia
-
4.x PR welcome Test Test-Failures
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 45/100
ReactiveX/RxJava#8075 · 4 comentários ·
Mantenedores costumam responder em até 1 dia
-
4.x: Cache/Replay operators to be more GC friendlyTalvez livre de novo @DragonFSKY assumiu há 87 dias e não há nenhum pull request aberto. Aberta4.x Enhancement
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 45/100
ReactiveX/RxJava#7912 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
Todas as issues de ReactiveX/RxJava
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 1 dia
-
2026 Error Report
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
triplea-game/triplea#15096 ·
Mantenedores costumam responder em até 1 dia
-
[Bug][API] Switching workflow versions leaves schedules onlineTalvez já em andamento @zhuangchong assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
apache/dolphinscheduler#18731 ·
Mantenedores costumam responder em até 1 dia
-
Implement JDBC Domain Enums (`SqlCategory`, `SqlExecutionStatus`, `SqlExecutionType`) in Core ModuleAbertacore-module enhancement good first issue
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 87/100
sdlc-pro/spring-lens#531 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
apache/rocketmq-dashboard#7340 ·
Mantenedores costumam responder em até 3 dias