Fragile window abandonment during concatMap operations; silent data loss
維護者通常 1 天內回覆
還沒有人認領這個 Issue。
評估
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 新手友好度
- 38/100
- Issue 類型
- 缺陷
- 描述清晰度
- 基本清楚
- 活躍度
- 停滯
- 技術堆疊
- java
研究方向
首先使用 Flowable.window() 搭配 concatMapSingle() 和 concatMapMaybe() 執行兩個重現,並比較 blockingSubscribe() 的不同變體。追蹤視窗放棄與下游訂閱之間的互動;當視窗不會被靜默丟棄,或放棄會產生文件中說明的錯誤時,即表示完成。
由索引模型根據 Issue 內容生成。
描述
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.
- 主要語言
- Java
- 星號
- 48.2k
- 分支
- 7.6k
- 平均合併
- 3 小時 9 分鐘
- 30 天內合併 PR
- 25
環境準備
- 沒有 Dockerfile 或 Docker Compose 檔案
- 有 Pull Request 範本
- 閱讀貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
ReactiveX/RxJava 的其他 Issue
-
4.x AI Enhancement Streamable
難度 4/5 3-5 天 新手友好度 45/100
ReactiveX/RxJava#8299 · 1 則留言 ·
維護者通常 1 天內回覆
-
4.x: FlowableBufferTest > longTimeAction() FAILED可能重新可做 @akarnokd 於 73 天前認領,目前沒有進行中的 PR。 未關閉4.x Test-Failures
ReactiveX/RxJava#8280 · 已指派 1 人 ·
維護者通常 1 天內回覆
-
4.x Discussion
難度 5/5 一週以上 新手友好度 25/100
維護者通常 1 天內回覆
-
4.x PR welcome Test Test-Failures
難度 4/5 3-5 天 新手友好度 45/100
ReactiveX/RxJava#8075 · 4 則留言 ·
維護者通常 1 天內回覆
-
4.x: Cache/Replay operators to be more GC friendly可能重新可做 @DragonFSKY 於 87 天前認領,目前沒有進行中的 PR。 未關閉4.x Enhancement
難度 4/5 3-5 天 新手友好度 45/100
ReactiveX/RxJava#7912 · 3 則留言 ·
維護者通常 1 天內回覆
相似的 Issue
-
enhancement
難度 2/5 1-3 小時 新手友好度 65/100
-
難度 2/5 1-3 小時 新手友好度 61/100
維護者通常 1 天內回覆
-
bug
難度 2/5 1-3 小時 新手友好度 72/100
ReChronoRain/HyperCeiler#1743 ·
維護者通常 6 天內回覆
-
難度 2/5 1-3 小時 新手友好度 72/100
ControlSystemStudio/phoebus#3979 ·
維護者通常 2 天內回覆
-
Cannot find symbol CTypedef可能已有人在做 @pellico 今天認領。 未關閉bug
難度 1/5 1 小時以內 新手友好度 82/100