reactor/reactor-core
GitHub で見るEmitterProcessor queue not cleared on immediate cancellation
Open
#3,359 opened on 2023年2月20日
area/doOnDiscardhelp wantedtype/bug
Repository metrics
- Stars
- (4,748 stars)
- PR merge metrics
- (平均マージ 16d 15h) (30d で 25 merged PRs)
説明
EmitterProcessor#remove has support to discard the buffer once the last subscriber is gone. However, it returns early if the subscribers array is already EMPTY. For cases where the subscription is immediately cancelled (e.g. .take(0)) this may leak the buffered elements.
Here is a repro case:
@Test
void shouldClearBufferOnCancellation() {
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
Many<Integer> sink = Sinks.many().unicast().onBackpressureBuffer(queue);
sink.tryEmitNext(1);
sink.tryEmitNext(2);
sink.tryEmitNext(3);
assertThat(queue).hasSize(3);
sink.asFlux().take(0).blockLast();
assertThat(queue).isEmpty();
}
As a workaround .takeWhile(x -> false) does make the test pass for example.