reactor/reactor-core
Ver no GitHubEmitterProcessor queue not cleared on immediate cancellation
Open
#3.359 aberto em 20 de fev. de 2023
area/doOnDiscardhelp wantedtype/bug
Métricas do repositório
- Stars
- (4.748 stars)
- Métricas de merge de PR
- (Mesclagem média 16d 15h) (25 fundiu PRs em 30d)
Description
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.