Vaadin 8.4.1 works in single-thread mode while changing the views

If I open my Vaadin-based app in different tabs and try to navigate to a view that loads a lot of data on one tab I can’t navigate among the views in the others. They stuck while changing the view until long-running operation on the first tab is over.

And another example of the issue: if I open multiple tabs simultaneously they noticeable render one by one. So it looks like only one “Navigator” in one thread works at the same time.

I’m using Vaadin 8.4.1, vaadin-cdi 2.0.0, Java EE 7, GlassFish 4.1.1, Eclipselink 2.7.1.

Stuck threads looks like this:

 "http-listener-1(4)" - Thread t@36
    java.lang.Thread.State: WAITING
    at sun.misc.Unsafe.park(Native Method)
    - waiting to lock <8d265d2> (a java.util.concurrent.locks.ReentrantLock$NonfairSync) owned by "http-listener-1(3)" t@35
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
    at com.vaadin.server.VaadinService.lockSession(VaadinService.java:702)
    at com.vaadin.server.VaadinService.findOrCreateVaadinSession(VaadinService.java:738)
    at com.vaadin.server.VaadinService.findVaadinSession(VaadinService.java:602)
    at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1595)
    at com.vaadin.cdi.server.VaadinCDIServletService.handleRequest(VaadinCDIServletService.java:92)
    at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:445)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
	...
	

Running thread:

 "http-listener-1(3)" - Thread t@35
    java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:170)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:140)
    at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:109)
    at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:67)
    at org.postgresql.core.PGStream.receiveChar(PGStream.java:293)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1947)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:306)
    - locked <237b368a> (a org.postgresql.core.v3.QueryExecutorImpl)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:155)
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:118)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:1009)
    ...
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
    at com.sun.proxy.$Proxy190.fetchData(Unknown Source)
    ...
    at myCustomApp.vaadin.view.MyView.enter(MyView.java:123)
	at com.vaadin.navigator.Navigator.performNavigateTo(Navigator.java:778)
    at com.vaadin.navigator.Navigator.lambda$navigateTo$9a874efd$1(Navigator.java:702)
    at com.vaadin.navigator.Navigator$$Lambda$29/69849314.run(Unknown Source)
    at com.vaadin.navigator.ViewBeforeLeaveEvent.navigate(ViewBeforeLeaveEvent.java:54)
    at com.vaadin.navigator.View.beforeLeave(View.java:79)
    at com.vaadin.navigator.Navigator.runAfterLeaveConfirmation(Navigator.java:730)
    at com.vaadin.navigator.Navigator.navigateTo(Navigator.java:701)
    at com.vaadin.navigator.Navigator.navigateTo(Navigator.java:678)
    ...
	

Threads:

I have 100% uncoupled backend so along with Vaadin UI I have the spare old-good-servlet-based one that works perfectly. I can open couple of dozens tabs with servlets that invoke absolutely the same backend methods and they render simultaneously. So it’s hardly something with Java EE/EclipseLink.

Does anybody have any ideas where to start in solving this mystery? Maybe it’s related to CDI somehow? Is it bug or feature eventually :)?
17168652.png

It looks like it’s core limitation of the Vaadin framework. According to the stack-trace it stuck on obtaining a session. But session is shared among tabs so unavoidably any attempt to open a new tab or navigate to another view will lead to a lock. If it’s so it means that Vaadin can’t normally work in a different tabs what is a dramatic disadvantage :(.

If I open new tabs in an incognito mode (no cookies - different sessions) it works fine and tabs render simultaneously as expected.