Fragile window abandonment during concatMap operations; silent data loss
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 38/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- À l'abandon
- Stack technique
- java
- Domaine
- backend-api-design
Piste de recherche
Commencez par exécuter les deux reproductions avec Flowable.window() en utilisant concatMapSingle() et concatMapMaybe(), en comparant les variantes de blockingSubscribe(). Suivez l’interaction entre l’abandon des fenêtres et l’abonnement downstream ; le travail est terminé lorsque les fenêtres ne sont pas supprimées silencieusement ou que l’abandon produit l’erreur documentée.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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.
- Langage dominant
- Java
- Étoiles
- 48.2k
- Forks
- 7.6k
- Merge moyen
- 3 h 2 min
- PR mergées (30 j)
- 27
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de ReactiveX/RxJava
-
4.x Streamable Test-Failures
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
Les mainteneurs répondent en général sous 1 jour
-
4.x AI Enhancement Streamable
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
ReactiveX/RxJava#8299 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
4.x: FlowableBufferTest > longTimeAction() FAILEDPeut-être à nouveau libre @akarnokd l’a pris il y a 75 jours, et aucune pull request n’est ouverte. Ouverte4.x Test-Failures
ReactiveX/RxJava#8280 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
4.x Discussion
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 25/100
Les mainteneurs répondent en général sous 1 jour
-
4.x PR welcome Test Test-Failures
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
ReactiveX/RxJava#8075 · 4 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de ReactiveX/RxJava
Issues similaires
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
-
[Bug]: REST API URL starting with "http" but no scheme (e.g. httpbin.org/get) is not given an http:// prefixPeut-être pris @ItsDeadlyProgrammer l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
appsmithorg/appsmith#42471 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
code-maintenance
Difficulté 2/5 1-3 heures Accessibilité débutants 77/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
-
bug priority: medium Review effort [1-5]: 3 status: needs-triage type: bug
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
carlos-emr/carlos#5258 ·
Les mainteneurs répondent en général sous 1 jour