Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

Fragile window abandonment during concatMap operations; silent data loss

Aberta
#7,956 2 comentários 1 reação 0 responsáveis Ver no GitHub

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

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

3.x 4.x Investigating

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

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de ReactiveX/RxJava

Todas as issues de ReactiveX/RxJava

Issues semelhantes

Mais issues de Java

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.