Reading container logs with 'follow' flag, thread is blocked forever

137 Views Asked by At

Given backend, which processes user requests of reading container logs(with follow option). Following approach is used:

Future<?> f = threadPool.submit(() -> {
  try {
    while (logStream.hasNext()) {
      LogMessage msg = logStream.next();
      String text = StandardCharsets.UTF_8.decode(msg.content()).toString();
      emitter.send(SseEmitter.event().data(text).name(msg.stream().name()));
    }
    emitter.complete();
  } catch (Exception ex) {
    emitter.completeWithError(ex);
  }
});

Where threadPool is just a Executors.newCachedThreadPool() and emitter is Spring's SseEmitter.

The problem is: when user no longer wants to read logs, he just closes the connection, but this thread is still running(execution is blocked in logStream.hasNext() which is calling InputStream.read(..)).

As far as I understand, hasNext() will never return false(at least while container is running properly), so this loop is endless, and we need to stop it somehow. Possible solution I tried:

emitter.onCompletion(() -> {
  f.cancel(true);
});

was not successful. No InterruptedException was thrown.

Question: Is there any way of unblocking thread? Or maybe there is another approach of solving this problem (i.e. have a possibility to stop waiting for logs)?

0

There are 0 best solutions below