From d936003c92a8e3ac2e1c0637ac240f3d7624bc0d Mon Sep 17 00:00:00 2001 From: Teemu Suo-Anttila Date: Mon, 27 Nov 2017 13:15:56 +0200 Subject: Prevent killing UI if heartbeats are pending (#10371) Fixes #9663 --- .../main/java/com/vaadin/server/VaadinService.java | 23 +++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'server') diff --git a/server/src/main/java/com/vaadin/server/VaadinService.java b/server/src/main/java/com/vaadin/server/VaadinService.java index d086b68a12..9b9c7fd913 100644 --- a/server/src/main/java/com/vaadin/server/VaadinService.java +++ b/server/src/main/java/com/vaadin/server/VaadinService.java @@ -1363,12 +1363,25 @@ public abstract class VaadinService implements Serializable { public boolean isUIActive(UI ui) { if (ui.isClosing()) { return false; - } else { - long now = System.currentTimeMillis(); - int timeout = 1000 * getHeartbeatTimeout(); - return timeout < 0 - || now - ui.getLastHeartbeatTimestamp() < timeout; } + + // Check for long running tasks + Lock lockInstance = ui.getSession().getLockInstance(); + if (lockInstance instanceof ReentrantLock) { + if (((ReentrantLock) lockInstance).hasQueuedThreads()) { + /* + * Someone is trying to access the session. Leaving all UIs + * alive for now. A possible kill decision will be made at a + * later time when the session access has ended. + */ + return true; + } + } + + // Check timeout + long now = System.currentTimeMillis(); + int timeout = 1000 * getHeartbeatTimeout(); + return timeout < 0 || now - ui.getLastHeartbeatTimestamp() < timeout; } /** -- cgit v1.2.3