Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Console doesn't connect when server is busy #3041

Open
dsmmcken opened this issue Oct 27, 2022 · 5 comments
Open

Console doesn't connect when server is busy #3041

dsmmcken opened this issue Oct 27, 2022 · 5 comments
Assignees
Labels
bug Something isn't working grpc session web-client-ui The Web GUI
Milestone

Comments

@dsmmcken
Copy link
Contributor

I had an intentionally terrible sort that I hammered a few times and consumed all the threads the docker container had available. Then I refreshed the page. Unexpectedly the page never loads as it's waiting on the startConsole promise to return, and it never does (as the sorts are still consuming all the threads). I don't know what we can do to make this better, but at least better messaging would be nice.

Eventually if I wait for the 5 minutes for those sorts to return, the page does eventually load.

Steps to reproduce

  1. Give docker 4 threads only (default?)
  2. Run this terrible python
from deephaven import empty_table
import time

# sleep inside a update_view column being sorted
# intentionally terrible for forcing the UI into a loading state
def f(a):
    time.sleep(0.02)
    return a

myTable = empty_table(50_000).update(["a = i", "b = i", "c = i", "d = i", "e = i", "x = i", "y = i", "z = i % 2 == 0 ? `a` : `b`"])
badTable = myTable.update_view("slow = (int)f(x)")
  1. open 4 instances of badTable from the panel menu
  2. do a multi column sort on a different column + slow column in each panel
  3. refresh the page

Page is stuck waiting for console to connect on refresh:

image

@dsmmcken dsmmcken added bug Something isn't working triage labels Oct 27, 2022
@dsmmcken
Copy link
Contributor Author

dsmmcken commented Oct 27, 2022

Log:

dsmmcken@Compy:~/git/deephaven-core$ docker-compose exec server jstack 1
Picked up JAVA_TOOL_OPTIONS: -Xmx4g -Ddeephaven.console.type=python -Ddeephaven.application.dir=/data/app.d
2022-10-27 21:06:56
Full thread dump OpenJDK 64-Bit Server VM (11.0.16+8-post-Debian-1deb10u1 mixed mode, sharing):

Threads class SMR info:
_java_thread_list=0x00007f7e24004dc0, length=62, elements={
0x00007f7f7401a000, 0x00007f7f74288800, 0x00007f7f7428a800, 0x00007f7f74290000,
0x00007f7f74292000, 0x00007f7f74294000, 0x00007f7f74296000, 0x00007f7f74298000,
0x00007f7f742da800, 0x00007f7f751c5800, 0x00007f7f754f7000, 0x00007f7f7550b000,
0x00007f7f76449000, 0x00007f7f041a8000, 0x00007f7f04219000, 0x00007f7f0421b000,
0x00007f7f0421c800, 0x00007f7f76899000, 0x00007f7f7689a000, 0x00007f7f768e7000,
0x00007f7f768e8800, 0x00007f7f768ea800, 0x00007f7f768ef000, 0x00007f7f76a70800,
0x00007f7e54005800, 0x00007f7e4c0dd000, 0x00007f7e500bd000, 0x00007f7e4c10b000,
0x00007f7e6809d800, 0x00007f7e58230000, 0x00007f7e6809f800, 0x00007f7e5407e800,
0x00007f7e307fe000, 0x00007f7e54029800, 0x00007f7e4c095800, 0x00007f7e680a5800,
0x00007f7e3c006000, 0x00007f7e3c008000, 0x00007f7e54085800, 0x00007f7e3c009800,
0x00007f7e3c00b800, 0x00007f7e4c092000, 0x00007f7e4400c800, 0x00007f7e4c091000,
0x00007f7e3c00e000, 0x00007f7df0005800, 0x00007f7dfc001000, 0x00007f7df0007000,
0x00007f7e4008f800, 0x00007f7e5c005800, 0x00007f7e50011800, 0x00007f7e5402b000,
0x00007f7f2c001000, 0x00007f7e68040000, 0x00007f7e0c00f000, 0x00007f7e2400c800,
0x00007f7e0c010000, 0x00007f7e04003800, 0x00007f7e0c007800, 0x00007f7dfc03a800,
0x00007f7e54081000, 0x00007f7e58277800
}

"main" #1 prio=5 os_prio=0 cpu=1993.63ms elapsed=2267.61s tid=0x00007f7f7401a000 nid=0x10 waiting on condition  [0x00007f7f793cd000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000700c6a8a0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.16/LockSupport.java:194)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.16/AbstractQueuedSynchronizer.java:2081)
        at org.eclipse.jetty.util.thread.AutoLock$WithCondition.await(AutoLock.java:126)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.join(QueuedThreadPool.java:748)
        at org.eclipse.jetty.server.Server.join(Server.java:661)
        at io.deephaven.server.jetty.JettyBackedGrpcServer.join(JettyBackedGrpcServer.java:120)
        at io.deephaven.server.runner.DeephavenApiServer.join(DeephavenApiServer.java:174)
        at io.deephaven.server.jetty.JettyMain.main(JettyMain.java:26)

"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=9.26ms elapsed=2267.60s tid=0x00007f7f74288800 nid=0x18 waiting on condition  [0x00007f7f4c716000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.16/Native Method)
        at java.lang.ref.Reference.processPendingReferences(java.base@11.0.16/Reference.java:241)
        at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.16/Reference.java:213)

"Finalizer" #3 daemon prio=8 os_prio=0 cpu=23.42ms elapsed=2267.60s tid=0x00007f7f7428a800 nid=0x19 in Object.wait()  [0x00007f7f4c615000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.16/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x00000007007002e8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.16/ReferenceQueue.java:176)
        at java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.16/Finalizer.java:170)

"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0.41ms elapsed=2267.60s tid=0x00007f7f74290000 nid=0x1a runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #5 daemon prio=9 os_prio=0 cpu=23.82ms elapsed=2267.60s tid=0x00007f7f74292000 nid=0x1b runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #6 daemon prio=9 os_prio=0 cpu=14874.63ms elapsed=2267.60s tid=0x00007f7f74294000 nid=0x1c waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"C1 CompilerThread0" #8 daemon prio=9 os_prio=0 cpu=3534.11ms elapsed=2267.60s tid=0x00007f7f74296000 nid=0x1d waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Sweeper thread" #9 daemon prio=9 os_prio=0 cpu=18.32ms elapsed=2267.60s tid=0x00007f7f74298000 nid=0x1e runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #10 daemon prio=8 os_prio=0 cpu=7.53ms elapsed=2267.57s tid=0x00007f7f742da800 nid=0x1f in Object.wait()  [0x00007f7f27cfb000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.16/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x0000000700711b10> (a java.lang.ref.ReferenceQueue$Lock)
        at jdk.internal.ref.CleanerImpl.run(java.base@11.0.16/CleanerImpl.java:148)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)
        at jdk.internal.misc.InnocuousThread.run(java.base@11.0.16/InnocuousThread.java:161)

"grpc-timer-0" #14 daemon prio=5 os_prio=0 cpu=66.36ms elapsed=2266.98s tid=0x00007f7f751c5800 nid=0x27 waiting on condition  [0x00007f7f270bc000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000700bbad70> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.16/LockSupport.java:194)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.16/AbstractQueuedSynchronizer.java:2081)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.16/ScheduledThreadPoolExecutor.java:1170)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.16/ScheduledThreadPoolExecutor.java:899)
        at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.16/ThreadPoolExecutor.java:1054)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.16/ThreadPoolExecutor.java:1114)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.16/ThreadPoolExecutor.java:628)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"PyObject-cleanup" #16 daemon prio=5 os_prio=0 cpu=228.63ms elapsed=2266.76s tid=0x00007f7f754f7000 nid=0x2c waiting on condition  [0x00007f7f2629a000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(java.base@11.0.16/Native Method)
        at org.jpy.PyObjectReferences.cleanupThreadLogic(PyObjectReferences.java:190)
        at org.jpy.PyObjectReferences$$Lambda$357/0x00000008402a6c40.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"CleanupReferenceProcessor-liveness-drainingThread" #17 daemon prio=5 os_prio=0 cpu=87.84ms elapsed=2266.75s tid=0x00007f7f7550b000 nid=0x2d in Object.wait()  [0x00007f7f26119000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.16/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x0000000702100170> (a java.lang.ref.ReferenceQueue$Lock)
        at io.deephaven.util.reference.CleanupReferenceProcessor$DrainQueue.run(CleanupReferenceProcessor.java:109)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"UpdateGraphProcessor.DEFAULT.refreshThread" #13 daemon prio=5 os_prio=0 cpu=697.30ms elapsed=2266.03s tid=0x00007f7f76449000 nid=0x4f in Object.wait()  [0x00007f7f27ac7000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at io.deephaven.engine.updategraph.UpdateGraphProcessor.waitForEndTime(UpdateGraphProcessor.java:1692)
        - waiting to re-lock in wait() <0x0000000700b14110> (a java.util.concurrent.atomic.AtomicBoolean)
        at io.deephaven.engine.updategraph.UpdateGraphProcessor.waitForNextCycle(UpdateGraphProcessor.java:1667)
        at io.deephaven.engine.updategraph.UpdateGraphProcessor.refreshTablesAndFlushNotifications(UpdateGraphProcessor.java:1575)
        at io.deephaven.engine.updategraph.UpdateGraphProcessor$1.run(UpdateGraphProcessor.java:278)

"Static-FastNIODriver-0" #18 daemon prio=5 os_prio=0 cpu=404.82ms elapsed=2265.98s tid=0x00007f7f041a8000 nid=0x52 waiting on condition  [0x00007f7e8a853000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000702000538> (a io.deephaven.base.UnfairMutex)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.16/LockSupport.java:194)
        at io.deephaven.base.UnfairMutex.lock(UnfairMutex.java:45)
        at io.deephaven.net.impl.nio.FastNIODriver.run(FastNIODriver.java:197)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"Static-FastNIODriver-1" #19 daemon prio=5 os_prio=0 cpu=423.32ms elapsed=2265.98s tid=0x00007f7f04219000 nid=0x53 waiting on condition  [0x00007f7e8a752000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000702000538> (a io.deephaven.base.UnfairMutex)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.16/LockSupport.java:194)
        at io.deephaven.base.UnfairMutex.lock(UnfairMutex.java:45)
        at io.deephaven.net.impl.nio.FastNIODriver.run(FastNIODriver.java:197)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"Static-FastNIODriver-2" #20 daemon prio=5 os_prio=0 cpu=403.29ms elapsed=2265.98s tid=0x00007f7f0421b000 nid=0x54 runnable  [0x00007f7e8a524000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.EPoll.wait(java.base@11.0.16/Native Method)
        at sun.nio.ch.EPollSelectorImpl.doSelect(java.base@11.0.16/EPollSelectorImpl.java:120)
        at sun.nio.ch.SelectorImpl.lockAndDoSelect(java.base@11.0.16/SelectorImpl.java:124)
        - locked <0x0000000702080610> (a sun.nio.ch.Util$2)
        - locked <0x00000007020805b8> (a sun.nio.ch.EPollSelectorImpl)
        at sun.nio.ch.SelectorImpl.select(java.base@11.0.16/SelectorImpl.java:136)
        at io.deephaven.io.sched.YASchedulerImpl.select(YASchedulerImpl.java:504)
        at io.deephaven.io.sched.YASchedulerImpl.work(YASchedulerImpl.java:756)
        at io.deephaven.net.impl.nio.FastNIODriver.run(FastNIODriver.java:208)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"Static-FastNIODriver-3" #21 daemon prio=5 os_prio=0 cpu=418.19ms elapsed=2265.98s tid=0x00007f7f0421c800 nid=0x55 waiting on condition  [0x00007f7e8a423000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000702000538> (a io.deephaven.base.UnfairMutex)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.16/LockSupport.java:194)
        at io.deephaven.base.UnfairMutex.lock(UnfairMutex.java:45)
        at io.deephaven.net.impl.nio.FastNIODriver.run(FastNIODriver.java:197)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"UpdatePerformanceTracker.Driver" #23 daemon prio=5 os_prio=0 cpu=11.22ms elapsed=2265.64s tid=0x00007f7f76899000 nid=0x62 waiting on condition  [0x00007f7e89f22000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(java.base@11.0.16/Native Method)
        at io.deephaven.engine.table.impl.perf.UpdatePerformanceTracker$Driver.run(UpdatePerformanceTracker.java:107)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ServerStateTracker.Driver" #24 daemon prio=5 os_prio=0 cpu=37.43ms elapsed=2265.62s tid=0x00007f7f7689a000 nid=0x63 waiting on condition  [0x00007f7e89e21000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(java.base@11.0.16/Native Method)
        at io.deephaven.engine.table.impl.util.ServerStateTracker$Driver.run(ServerStateTracker.java:120)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-27-acceptor-0@34c0e9d5-ServerConnector@4108fa66{HTTP/1.1, (http/1.1, h2c)}{0.0.0.0:10000}" #27 prio=3 os_prio=0 cpu=396.67ms elapsed=2265.59s tid=0x00007f7f768e7000 nid=0x66 runnable  [0x00007f7e89b1e000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.ServerSocketChannelImpl.accept0(java.base@11.0.16/Native Method)
        at sun.nio.ch.ServerSocketChannelImpl.accept(java.base@11.0.16/ServerSocketChannelImpl.java:533)
        at sun.nio.ch.ServerSocketChannelImpl.accept(java.base@11.0.16/ServerSocketChannelImpl.java:285)
        at org.eclipse.jetty.server.ServerConnector.accept(ServerConnector.java:409)
        at org.eclipse.jetty.server.AbstractConnector$Acceptor.run(AbstractConnector.java:734)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-28" #28 prio=5 os_prio=0 cpu=966.88ms elapsed=2265.59s tid=0x00007f7f768e8800 nid=0x67 waiting on condition  [0x00007f7e89a1d000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000700c6a9e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.16/AbstractQueuedSynchronizer.java:2123)
        at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:219)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.idleJobPoll(QueuedThreadPool.java:975)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1025)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-29" #29 prio=5 os_prio=0 cpu=1405.11ms elapsed=2265.59s tid=0x00007f7f768ea800 nid=0x68 waiting on condition  [0x00007f7e8991c000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000700c6a9e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.16/AbstractQueuedSynchronizer.java:2123)
        at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:219)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.idleJobPoll(QueuedThreadPool.java:975)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1025)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-31" #31 prio=5 os_prio=0 cpu=650.20ms elapsed=2265.59s tid=0x00007f7f768ef000 nid=0x6a waiting on condition  [0x00007f7e8971a000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x00000007050360f0> (a java.util.concurrent.SynchronousQueue$TransferStack)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(java.base@11.0.16/SynchronousQueue.java:462)
        at java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.base@11.0.16/SynchronousQueue.java:361)
        at java.util.concurrent.SynchronousQueue.poll(java.base@11.0.16/SynchronousQueue.java:937)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.reservedWait(ReservedThreadExecutor.java:321)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:397)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"Session-HouseKeeper-f238e4f-1" #33 prio=5 os_prio=0 cpu=2.62ms elapsed=2265.38s tid=0x00007f7f76a70800 nid=0x6c waiting on condition  [0x00007f7e89318000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x00000007068b1588> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.16/AbstractQueuedSynchronizer.java:2123)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.16/ScheduledThreadPoolExecutor.java:1182)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.16/ScheduledThreadPoolExecutor.java:899)
        at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.16/ThreadPoolExecutor.java:1054)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.16/ThreadPoolExecutor.java:1114)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.16/ThreadPoolExecutor.java:628)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"Connector-Scheduler-4108fa66-1" #34 prio=5 os_prio=0 cpu=121.58ms elapsed=2265.02s tid=0x00007f7e54005800 nid=0x6d waiting on condition  [0x00007f7e8ab6e000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000706b00448> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.16/AbstractQueuedSynchronizer.java:2123)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.16/ScheduledThreadPoolExecutor.java:1182)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.16/ScheduledThreadPoolExecutor.java:899)
        at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.16/ThreadPoolExecutor.java:1054)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.16/ThreadPoolExecutor.java:1114)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.16/ThreadPoolExecutor.java:628)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"DeephavenApiServer-Scheduler-Concurrent-1" #35 daemon prio=5 os_prio=0 cpu=417.87ms elapsed=2251.26s tid=0x00007f7e4c0dd000 nid=0xbd waiting for monitor entry  [0x00007f7e88d16000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at io.deephaven.engine.table.impl.QueryTable$MemoizedResult.getOrCompute(QueryTable.java:3128)
        - waiting to lock <0x0000000724b68ef0> (a io.deephaven.engine.table.impl.QueryTable$MemoizedResult)
        at io.deephaven.engine.table.impl.QueryTable.memoizeResult(QueryTable.java:3102)
        at io.deephaven.engine.table.impl.QueryTable.getResult(QueryTable.java:3166)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:2265)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:88)
        at io.deephaven.server.table.ops.SortTableGrpcImpl.create(SortTableGrpcImpl.java:101)
        at io.deephaven.server.table.ops.SortTableGrpcImpl.create(SortTableGrpcImpl.java:24)
        at io.deephaven.server.table.TableServiceGrpcImpl$BatchExportBuilder.doExport(TableServiceGrpcImpl.java:487)
        at io.deephaven.server.table.TableServiceGrpcImpl.lambda$batch$7(TableServiceGrpcImpl.java:341)
        at io.deephaven.server.table.TableServiceGrpcImpl$$Lambda$1307/0x000000084080a040.call(Unknown Source)
        at io.deephaven.server.session.SessionState$ExportObject.doExport(SessionState.java:879)
        at io.deephaven.server.session.SessionState$ExportObject$$Lambda$775/0x0000000840574040.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(java.base@11.0.16/Executors.java:515)
        at java.util.concurrent.FutureTask.run(java.base@11.0.16/FutureTask.java:264)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(java.base@11.0.16/ScheduledThreadPoolExecutor.java:304)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.16/ThreadPoolExecutor.java:1128)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.16/ThreadPoolExecutor.java:628)
        at io.deephaven.server.runner.DeephavenApiServerModule$ThreadFactory.lambda$newThread$0(DeephavenApiServerModule.java:161)
        at io.deephaven.server.runner.DeephavenApiServerModule$ThreadFactory$$Lambda$764/0x000000084056a440.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"DeephavenApiServer-Scheduler-Concurrent-2" #36 daemon prio=5 os_prio=0 cpu=3931.01ms elapsed=2251.20s tid=0x00007f7e500bd000 nid=0xbe runnable  [0x00007f7e88a14000]
   java.lang.Thread.State: RUNNABLE
        at org.jpy.PyLib.callAndReturnObject(Native Method)
        at org.jpy.PyObject.callMethod(PyObject.java:432)
        at io.deephaven.engine.util.PythonScopeJpyImpl$CallableWrapper.call(PythonScopeJpyImpl.java:99)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.applyFormulaPerItem(Formula.java:161)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.lambda$fillChunkHelper$4(Formula.java:152)
        at io.deephaven.temp.c842762718987228486v55_0.Formula$$Lambda$1331/0x0000000840861040.accept(Unknown Source)
        at io.deephaven.engine.rowset.RowSet.lambda$forAllRowKeys$0(RowSet.java:308)
        at io.deephaven.engine.rowset.RowSet$$Lambda$1205/0x00000008407d8840.accept(Unknown Source)
        at io.deephaven.engine.rowset.impl.singlerange.SingleRange.ixForEachLong(SingleRange.java:105)
        at io.deephaven.engine.rowset.impl.WritableRowSetImpl.forEachRowKey(WritableRowSetImpl.java:321)
        at io.deephaven.engine.rowset.RowSet.forAllRowKeys(RowSet.java:307)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.fillChunkHelper(Formula.java:150)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.fillChunk(Formula.java:127)
        at io.deephaven.engine.table.impl.sources.ViewColumnSource.fillChunk(ViewColumnSource.java:219)
        at io.deephaven.engine.table.impl.SortHelpers.makeAndFillValues(SortHelpers.java:740)
        at io.deephaven.engine.table.impl.SortHelpers.doChunkSortingOne(SortHelpers.java:495)
        at io.deephaven.engine.table.impl.SortHelpers.getSortMappingOne(SortHelpers.java:451)
        at io.deephaven.engine.table.impl.SortHelpers.getSortedKeys(SortHelpers.java:253)
        at io.deephaven.engine.table.impl.SortHelpers.getSortedKeys(SortHelpers.java:227)
        at io.deephaven.engine.table.impl.SortOperation.initialize(SortOperation.java:204)
        at io.deephaven.engine.table.impl.QueryTable.lambda$getResultNoMemo$72(QueryTable.java:3185)
        at io.deephaven.engine.table.impl.QueryTable$$Lambda$1321/0x0000000840855840.call(Unknown Source)
        at io.deephaven.engine.table.impl.BaseTable.initializeWithSnapshot(BaseTable.java:1428)
        at io.deephaven.engine.table.impl.QueryTable.lambda$getResultNoMemo$73(QueryTable.java:3184)
        at io.deephaven.engine.table.impl.QueryTable$$Lambda$1320/0x0000000840855040.get(Unknown Source)
        at io.deephaven.engine.table.impl.perf.QueryPerformanceRecorder.withNugget(QueryPerformanceRecorder.java:518)
        at io.deephaven.engine.table.impl.QueryTable.getResultNoMemo(QueryTable.java:3173)
        at io.deephaven.engine.table.impl.QueryTable.lambda$getResult$71(QueryTable.java:3167)
        at io.deephaven.engine.table.impl.QueryTable$$Lambda$1317/0x0000000840851040.get(Unknown Source)
        at io.deephaven.engine.table.impl.QueryTable$MemoizedResult.getOrCompute(QueryTable.java:3135)
        - locked <0x0000000724b68ef0> (a io.deephaven.engine.table.impl.QueryTable$MemoizedResult)
        at io.deephaven.engine.table.impl.QueryTable.memoizeResult(QueryTable.java:3102)
        at io.deephaven.engine.table.impl.QueryTable.getResult(QueryTable.java:3166)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:2265)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:88)
        at io.deephaven.server.table.ops.SortTableGrpcImpl.create(SortTableGrpcImpl.java:101)
        at io.deephaven.server.table.ops.SortTableGrpcImpl.create(SortTableGrpcImpl.java:24)
        at io.deephaven.server.table.TableServiceGrpcImpl$BatchExportBuilder.doExport(TableServiceGrpcImpl.java:487)
        at io.deephaven.server.table.TableServiceGrpcImpl.lambda$batch$7(TableServiceGrpcImpl.java:341)
        at io.deephaven.server.table.TableServiceGrpcImpl$$Lambda$1307/0x000000084080a040.call(Unknown Source)
        at io.deephaven.server.session.SessionState$ExportObject.doExport(SessionState.java:879)
        at io.deephaven.server.session.SessionState$ExportObject$$Lambda$775/0x0000000840574040.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(java.base@11.0.16/Executors.java:515)
        at java.util.concurrent.FutureTask.run(java.base@11.0.16/FutureTask.java:264)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(java.base@11.0.16/ScheduledThreadPoolExecutor.java:304)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.16/ThreadPoolExecutor.java:1128)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.16/ThreadPoolExecutor.java:628)
        at io.deephaven.server.runner.DeephavenApiServerModule$ThreadFactory.lambda$newThread$0(DeephavenApiServerModule.java:161)
        at io.deephaven.server.runner.DeephavenApiServerModule$ThreadFactory$$Lambda$764/0x000000084056a440.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/1" #42 daemon prio=5 os_prio=0 cpu=21.16ms elapsed=2250.86s tid=0x00007f7e4c10b000 nid=0xc4 in Object.wait()  [0x00007f7e88510000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x00000007068b1a20> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/3" #43 daemon prio=5 os_prio=0 cpu=50.43ms elapsed=2250.78s tid=0x00007f7e6809d800 nid=0xc5 in Object.wait()  [0x00007f7e8840f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000706b006a0> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/4" #44 daemon prio=5 os_prio=0 cpu=5.27ms elapsed=2250.75s tid=0x00007f7e58230000 nid=0xc6 in Object.wait()  [0x00007f7e8830e000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <0x0000000706b3a318> (a java.lang.Thread)
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000706b3a318> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/5" #45 daemon prio=5 os_prio=0 cpu=4.30ms elapsed=2250.73s tid=0x00007f7e6809f800 nid=0xc7 in Object.wait()  [0x00007f7e8820d000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <0x00000007068b1cb0> (a java.lang.Thread)
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x00000007068b1cb0> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"DeephavenApiServer-Scheduler-Serial-1" #46 daemon prio=5 os_prio=0 cpu=2366.58ms elapsed=2134.60s tid=0x00007f7e5407e800 nid=0x31d waiting on condition  [0x00007f7e88712000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000700b021f0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.16/LockSupport.java:194)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.16/AbstractQueuedSynchronizer.java:2081)
        at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.16/LinkedBlockingQueue.java:433)
        at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.16/ThreadPoolExecutor.java:1054)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.16/ThreadPoolExecutor.java:1114)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.16/ThreadPoolExecutor.java:628)
        at io.deephaven.server.runner.DeephavenApiServerModule$ThreadFactory.lambda$newThread$0(DeephavenApiServerModule.java:161)
        at io.deephaven.server.runner.DeephavenApiServerModule$ThreadFactory$$Lambda$764/0x000000084056a440.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"DeephavenApiServer-Scheduler-Concurrent-3" #47 daemon prio=5 os_prio=0 cpu=5420.63ms elapsed=2132.18s tid=0x00007f7e307fe000 nid=0x32f runnable  [0x00007f7e1aefc000]
   java.lang.Thread.State: RUNNABLE
        at org.jpy.PyLib.callAndReturnObject(Native Method)
        at org.jpy.PyObject.callMethod(PyObject.java:432)
        at io.deephaven.engine.util.PythonScopeJpyImpl$CallableWrapper.call(PythonScopeJpyImpl.java:99)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.applyFormulaPerItem(Formula.java:161)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.lambda$fillChunkHelper$4(Formula.java:152)
        at io.deephaven.temp.c842762718987228486v55_0.Formula$$Lambda$1331/0x0000000840861040.accept(Unknown Source)
        at io.deephaven.engine.rowset.RowSet.lambda$forAllRowKeys$0(RowSet.java:308)
        at io.deephaven.engine.rowset.RowSet$$Lambda$1205/0x00000008407d8840.accept(Unknown Source)
        at io.deephaven.engine.rowset.impl.singlerange.SingleRange.ixForEachLong(SingleRange.java:105)
        at io.deephaven.engine.rowset.impl.WritableRowSetImpl.forEachRowKey(WritableRowSetImpl.java:321)
        at io.deephaven.engine.rowset.RowSet.forAllRowKeys(RowSet.java:307)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.fillChunkHelper(Formula.java:150)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.fillChunk(Formula.java:127)
        at io.deephaven.engine.table.impl.sources.ViewColumnSource.fillChunk(ViewColumnSource.java:219)
        at io.deephaven.engine.table.impl.SortHelpers.makeAndFillValues(SortHelpers.java:740)
        at io.deephaven.engine.table.impl.SortHelpers.doChunkSortingOne(SortHelpers.java:495)
        at io.deephaven.engine.table.impl.SortHelpers.getSortMappingOne(SortHelpers.java:451)
        at io.deephaven.engine.table.impl.SortHelpers.getSortedKeys(SortHelpers.java:253)
        at io.deephaven.engine.table.impl.SortHelpers.getSortedKeys(SortHelpers.java:227)
        at io.deephaven.engine.table.impl.SortOperation.initialize(SortOperation.java:204)
        at io.deephaven.engine.table.impl.QueryTable.lambda$getResultNoMemo$72(QueryTable.java:3185)
        at io.deephaven.engine.table.impl.QueryTable$$Lambda$1321/0x0000000840855840.call(Unknown Source)
        at io.deephaven.engine.table.impl.BaseTable.initializeWithSnapshot(BaseTable.java:1428)
        at io.deephaven.engine.table.impl.QueryTable.lambda$getResultNoMemo$73(QueryTable.java:3184)
        at io.deephaven.engine.table.impl.QueryTable$$Lambda$1320/0x0000000840855040.get(Unknown Source)
        at io.deephaven.engine.table.impl.perf.QueryPerformanceRecorder.withNugget(QueryPerformanceRecorder.java:518)
        at io.deephaven.engine.table.impl.QueryTable.getResultNoMemo(QueryTable.java:3173)
        at io.deephaven.engine.table.impl.QueryTable.lambda$getResult$71(QueryTable.java:3167)
        at io.deephaven.engine.table.impl.QueryTable$$Lambda$1317/0x0000000840851040.get(Unknown Source)
        at io.deephaven.engine.table.impl.QueryTable$MemoizedResult.getOrCompute(QueryTable.java:3135)
        - locked <0x00000007221e9348> (a io.deephaven.engine.table.impl.QueryTable$MemoizedResult)
        at io.deephaven.engine.table.impl.QueryTable.memoizeResult(QueryTable.java:3102)
        at io.deephaven.engine.table.impl.QueryTable.getResult(QueryTable.java:3166)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:2265)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:88)
        at io.deephaven.server.table.ops.SortTableGrpcImpl.create(SortTableGrpcImpl.java:101)
        at io.deephaven.server.table.ops.SortTableGrpcImpl.create(SortTableGrpcImpl.java:24)
        at io.deephaven.server.table.TableServiceGrpcImpl$BatchExportBuilder.doExport(TableServiceGrpcImpl.java:487)
        at io.deephaven.server.table.TableServiceGrpcImpl.lambda$batch$7(TableServiceGrpcImpl.java:341)
        at io.deephaven.server.table.TableServiceGrpcImpl$$Lambda$1307/0x000000084080a040.call(Unknown Source)
        at io.deephaven.server.session.SessionState$ExportObject.doExport(SessionState.java:879)
        at io.deephaven.server.session.SessionState$ExportObject$$Lambda$775/0x0000000840574040.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(java.base@11.0.16/Executors.java:515)
        at java.util.concurrent.FutureTask.run(java.base@11.0.16/FutureTask.java:264)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(java.base@11.0.16/ScheduledThreadPoolExecutor.java:304)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.16/ThreadPoolExecutor.java:1128)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.16/ThreadPoolExecutor.java:628)
        at io.deephaven.server.runner.DeephavenApiServerModule$ThreadFactory.lambda$newThread$0(DeephavenApiServerModule.java:161)
        at io.deephaven.server.runner.DeephavenApiServerModule$ThreadFactory$$Lambda$764/0x000000084056a440.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"DeephavenApiServer-Scheduler-Concurrent-4" #48 daemon prio=5 os_prio=0 cpu=1515.98ms elapsed=2131.97s tid=0x00007f7e54029800 nid=0x330 waiting for monitor entry  [0x00007f7e1adfc000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at io.deephaven.engine.table.impl.QueryTable$MemoizedResult.getOrCompute(QueryTable.java:3128)
        - waiting to lock <0x00000007221e9348> (a io.deephaven.engine.table.impl.QueryTable$MemoizedResult)
        at io.deephaven.engine.table.impl.QueryTable.memoizeResult(QueryTable.java:3102)
        at io.deephaven.engine.table.impl.QueryTable.getResult(QueryTable.java:3166)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:2265)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:88)
        at io.deephaven.server.table.ops.SortTableGrpcImpl.create(SortTableGrpcImpl.java:101)
        at io.deephaven.server.table.ops.SortTableGrpcImpl.create(SortTableGrpcImpl.java:24)
        at io.deephaven.server.table.TableServiceGrpcImpl$BatchExportBuilder.doExport(TableServiceGrpcImpl.java:487)
        at io.deephaven.server.table.TableServiceGrpcImpl.lambda$batch$7(TableServiceGrpcImpl.java:341)
        at io.deephaven.server.table.TableServiceGrpcImpl$$Lambda$1307/0x000000084080a040.call(Unknown Source)
        at io.deephaven.server.session.SessionState$ExportObject.doExport(SessionState.java:879)
        at io.deephaven.server.session.SessionState$ExportObject$$Lambda$775/0x0000000840574040.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(java.base@11.0.16/Executors.java:515)
        at java.util.concurrent.FutureTask.run(java.base@11.0.16/FutureTask.java:264)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(java.base@11.0.16/ScheduledThreadPoolExecutor.java:304)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.16/ThreadPoolExecutor.java:1128)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.16/ThreadPoolExecutor.java:628)
        at io.deephaven.server.runner.DeephavenApiServerModule$ThreadFactory.lambda$newThread$0(DeephavenApiServerModule.java:161)
        at io.deephaven.server.runner.DeephavenApiServerModule$ThreadFactory$$Lambda$764/0x000000084056a440.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-55" #55 prio=5 os_prio=0 cpu=876.20ms elapsed=2119.52s tid=0x00007f7e4c095800 nid=0x373 waiting on condition  [0x00007f7e1a8fb000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x00000007050360f0> (a java.util.concurrent.SynchronousQueue$TransferStack)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(java.base@11.0.16/SynchronousQueue.java:462)
        at java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.base@11.0.16/SynchronousQueue.java:361)
        at java.util.concurrent.SynchronousQueue.poll(java.base@11.0.16/SynchronousQueue.java:937)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.reservedWait(ReservedThreadExecutor.java:321)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:397)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-54" #54 prio=5 os_prio=0 cpu=862.41ms elapsed=2119.52s tid=0x00007f7e680a5800 nid=0x377 waiting on condition  [0x00007f7e1a4f7000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000700c6a9e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.16/AbstractQueuedSynchronizer.java:2123)
        at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:219)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.idleJobPoll(QueuedThreadPool.java:975)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1025)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/1" #57 daemon prio=5 os_prio=0 cpu=0.59ms elapsed=2117.64s tid=0x00007f7e3c006000 nid=0x389 in Object.wait()  [0x00007f7e1a1f4000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000705d001b0> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/3" #58 daemon prio=5 os_prio=0 cpu=1.86ms elapsed=2117.53s tid=0x00007f7e3c008000 nid=0x38a in Object.wait()  [0x00007f7e1a0f3000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x000000070c780320> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/4" #59 daemon prio=5 os_prio=0 cpu=2.84ms elapsed=2117.50s tid=0x00007f7e54085800 nid=0x38b in Object.wait()  [0x00007f7e19ff2000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000705d00358> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/5" #60 daemon prio=5 os_prio=0 cpu=0.76ms elapsed=2117.45s tid=0x00007f7e3c009800 nid=0x38c in Object.wait()  [0x00007f7e19ef1000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x000000070c7804c8> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/1" #61 daemon prio=5 os_prio=0 cpu=0.46ms elapsed=2090.19s tid=0x00007f7e3c00b800 nid=0x41d in Object.wait()  [0x00007f7e1a2f5000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000705d00500> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/3" #62 daemon prio=5 os_prio=0 cpu=1.40ms elapsed=2090.07s tid=0x00007f7e4c092000 nid=0x41e in Object.wait()  [0x00007f7e19df0000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x000000070c780670> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/4" #63 daemon prio=5 os_prio=0 cpu=2.80ms elapsed=2090.05s tid=0x00007f7e4400c800 nid=0x41f in Object.wait()  [0x00007f7e19cef000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000705d006a8> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/5" #64 daemon prio=5 os_prio=0 cpu=1.17ms elapsed=2090.00s tid=0x00007f7e4c091000 nid=0x420 in Object.wait()  [0x00007f7e19bee000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x000000070c780818> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/1" #65 daemon prio=5 os_prio=0 cpu=1.31ms elapsed=2022.25s tid=0x00007f7e3c00e000 nid=0x57f in Object.wait()  [0x00007f7e88914000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000705d00850> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/3" #66 daemon prio=5 os_prio=0 cpu=1.43ms elapsed=2022.13s tid=0x00007f7df0005800 nid=0x580 in Object.wait()  [0x00007f7e19aed000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x000000070c7809c0> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/4" #67 daemon prio=5 os_prio=0 cpu=0.66ms elapsed=2022.11s tid=0x00007f7dfc001000 nid=0x581 in Object.wait()  [0x00007f7e199ec000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000705d009f8> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/5" #68 daemon prio=5 os_prio=0 cpu=14.84ms elapsed=2022.07s tid=0x00007f7df0007000 nid=0x582 in Object.wait()  [0x00007f7e198eb000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x000000070c780b68> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ForkJoinPool.commonPool-worker-3" #69 daemon prio=5 os_prio=0 cpu=0.38ms elapsed=1596.30s tid=0x00007f7e4008f800 nid=0xe18 waiting on condition  [0x00007f7e89017000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000703094e68> (a java.util.concurrent.ForkJoinPool)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.16/LockSupport.java:194)
        at java.util.concurrent.ForkJoinPool.runWorker(java.base@11.0.16/ForkJoinPool.java:1628)
        at java.util.concurrent.ForkJoinWorkerThread.run(java.base@11.0.16/ForkJoinWorkerThread.java:183)

"qtp546796969-70" #70 prio=5 os_prio=0 cpu=121.12ms elapsed=582.98s tid=0x00007f7e5c005800 nid=0x2278 runnable  [0x00007f7e1a6f9000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.EPoll.wait(java.base@11.0.16/Native Method)
        at sun.nio.ch.EPollSelectorImpl.doSelect(java.base@11.0.16/EPollSelectorImpl.java:120)
        at sun.nio.ch.SelectorImpl.lockAndDoSelect(java.base@11.0.16/SelectorImpl.java:124)
        - locked <0x0000000706b39c48> (a sun.nio.ch.Util$2)
        - locked <0x0000000706b39bf0> (a sun.nio.ch.EPollSelectorImpl)
        at sun.nio.ch.SelectorImpl.select(java.base@11.0.16/SelectorImpl.java:141)
        at org.eclipse.jetty.io.ManagedSelector.nioSelect(ManagedSelector.java:180)
        at org.eclipse.jetty.io.ManagedSelector.select(ManagedSelector.java:187)
        at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.select(ManagedSelector.java:604)
        at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.produce(ManagedSelector.java:541)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.produceTask(AdaptiveExecutionStrategy.java:446)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:239)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.lambda$new$0(AdaptiveExecutionStrategy.java:138)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy$$Lambda$640/0x00000008404b4040.run(Unknown Source)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:407)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-73" #73 prio=5 os_prio=0 cpu=79.39ms elapsed=582.98s tid=0x00007f7e50011800 nid=0x227d waiting on condition  [0x00007f7e1a7fa000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x00000007050360f0> (a java.util.concurrent.SynchronousQueue$TransferStack)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(java.base@11.0.16/SynchronousQueue.java:462)
        at java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.base@11.0.16/SynchronousQueue.java:361)
        at java.util.concurrent.SynchronousQueue.poll(java.base@11.0.16/SynchronousQueue.java:937)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.reservedWait(ReservedThreadExecutor.java:321)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:397)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-76" #76 prio=5 os_prio=0 cpu=160.22ms elapsed=582.98s tid=0x00007f7e5402b000 nid=0x2280 waiting on condition  [0x00007f7e89d20000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000700c6a9e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.16/AbstractQueuedSynchronizer.java:2123)
        at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:219)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.idleJobPoll(QueuedThreadPool.java:975)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1025)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"Attach Listener" #79 daemon prio=9 os_prio=0 cpu=1.36ms elapsed=354.09s tid=0x00007f7f2c001000 nid=0x2735 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"ParserForinmemory://model/1" #80 daemon prio=5 os_prio=0 cpu=0.55ms elapsed=345.87s tid=0x00007f7e68040000 nid=0x2765 in Object.wait()  [0x00007f7e1a5f8000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000721fcf130> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/3" #81 daemon prio=5 os_prio=0 cpu=1.25ms elapsed=345.72s tid=0x00007f7e0c00f000 nid=0x2766 in Object.wait()  [0x00007f7e1b9fe000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000721a57b90> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/4" #82 daemon prio=5 os_prio=0 cpu=0.86ms elapsed=345.70s tid=0x00007f7e2400c800 nid=0x2767 in Object.wait()  [0x00007f7e195aa000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000721a497b0> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"ParserForinmemory://model/5" #83 daemon prio=5 os_prio=0 cpu=2.31ms elapsed=345.67s tid=0x00007f7e0c010000 nid=0x2768 in Object.wait()  [0x00007f7e194a9000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.16/Native Method)
        - waiting on <no object reference available>
        at java.lang.Object.wait(java.base@11.0.16/Object.java:328)
        at io.deephaven.lang.parse.PendingParse.awaitNext(PendingParse.java:148)
        - waiting to re-lock in wait() <0x0000000721a58d78> (a java.lang.Thread)
        at io.deephaven.lang.parse.PendingParse.parse(PendingParse.java:160)
        at io.deephaven.lang.parse.PendingParse$$Lambda$791/0x0000000840586840.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-86" #86 prio=5 os_prio=0 cpu=11.62ms elapsed=74.46s tid=0x00007f7e04003800 nid=0x2cda runnable  [0x00007f7e8981b000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.EPoll.wait(java.base@11.0.16/Native Method)
        at sun.nio.ch.EPollSelectorImpl.doSelect(java.base@11.0.16/EPollSelectorImpl.java:120)
        at sun.nio.ch.SelectorImpl.lockAndDoSelect(java.base@11.0.16/SelectorImpl.java:124)
        - locked <0x00000007068b11e0> (a sun.nio.ch.Util$2)
        - locked <0x00000007068b1188> (a sun.nio.ch.EPollSelectorImpl)
        at sun.nio.ch.SelectorImpl.select(java.base@11.0.16/SelectorImpl.java:141)
        at org.eclipse.jetty.io.ManagedSelector.nioSelect(ManagedSelector.java:180)
        at org.eclipse.jetty.io.ManagedSelector.select(ManagedSelector.java:187)
        at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.select(ManagedSelector.java:604)
        at org.eclipse.jetty.io.ManagedSelector$SelectorProducer.produce(ManagedSelector.java:541)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.produceTask(AdaptiveExecutionStrategy.java:446)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:239)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.lambda$new$0(AdaptiveExecutionStrategy.java:138)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy$$Lambda$640/0x00000008404b4040.run(Unknown Source)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:407)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-89" #89 prio=5 os_prio=0 cpu=2.79ms elapsed=74.46s tid=0x00007f7e0c007800 nid=0x2cdb waiting on condition  [0x00007f7e88813000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000700c6a9e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.16/AbstractQueuedSynchronizer.java:2123)
        at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:219)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.idleJobPoll(QueuedThreadPool.java:975)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1025)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-84" #84 prio=5 os_prio=0 cpu=2.51ms elapsed=74.46s tid=0x00007f7dfc03a800 nid=0x2cdc waiting on condition  [0x00007f7e89619000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000700c6a9e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.16/AbstractQueuedSynchronizer.java:2123)
        at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:219)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.idleJobPoll(QueuedThreadPool.java:975)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1025)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-87" #87 prio=5 os_prio=0 cpu=2.67ms elapsed=74.46s tid=0x00007f7e54081000 nid=0x2cdd waiting on condition  [0x00007f7e89c1f000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000700c6a9e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.16/AbstractQueuedSynchronizer.java:2123)
        at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:219)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.idleJobPoll(QueuedThreadPool.java:975)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1025)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"qtp546796969-88" #88 prio=5 os_prio=0 cpu=2.42ms elapsed=74.46s tid=0x00007f7e58277800 nid=0x2cde waiting on condition  [0x00007f7e192a8000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.16/Native Method)
        - parking to wait for  <0x0000000700c6a9e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.16/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.16/AbstractQueuedSynchronizer.java:2123)
        at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:219)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.idleJobPoll(QueuedThreadPool.java:975)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1025)
        at java.lang.Thread.run(java.base@11.0.16/Thread.java:829)

"VM Thread" os_prio=0 cpu=411.63ms elapsed=2267.60s tid=0x00007f7f74285800 nid=0x17 runnable

"GC Thread#0" os_prio=0 cpu=276.93ms elapsed=2267.61s tid=0x00007f7f74031800 nid=0x11 runnable

"GC Thread#1" os_prio=0 cpu=275.04ms elapsed=2267.28s tid=0x00007f7f30001000 nid=0x22 runnable

"GC Thread#2" os_prio=0 cpu=274.78ms elapsed=2267.28s tid=0x00007f7f30002800 nid=0x23 runnable

"GC Thread#3" os_prio=0 cpu=274.77ms elapsed=2267.28s tid=0x00007f7f30004000 nid=0x24 runnable

"G1 Main Marker" os_prio=0 cpu=1.73ms elapsed=2267.61s tid=0x00007f7f74072000 nid=0x12 runnable

"G1 Conc#0" os_prio=0 cpu=328.00ms elapsed=2267.61s tid=0x00007f7f74073800 nid=0x13 runnable

"G1 Refine#0" os_prio=0 cpu=63.45ms elapsed=2267.61s tid=0x00007f7f74243800 nid=0x14 runnable

"G1 Refine#1" os_prio=0 cpu=23.11ms elapsed=2267.28s tid=0x00007f7f44001000 nid=0x25 runnable

"G1 Refine#2" os_prio=0 cpu=22.57ms elapsed=2267.27s tid=0x00007f7ef4001800 nid=0x26 runnable

"G1 Refine#3" os_prio=0 cpu=18.66ms elapsed=2265.73s tid=0x00007f7ef8001800 nid=0x61 runnable

"G1 Young RemSet Sampling" os_prio=0 cpu=547.84ms elapsed=2267.61s tid=0x00007f7f74245000 nid=0x15 runnable
"StrDedup" os_prio=0 cpu=16.78ms elapsed=2267.61s tid=0x00007f7f7424c000 nid=0x16 runnable

"VM Periodic Task Thread" os_prio=0 cpu=1220.55ms elapsed=2267.57s tid=0x00007f7f742de000 nid=0x20 waiting on condition

JNI global refs: 963, weak refs: 45

@nbauernfeind
Copy link
Member

Hmm. Interesting problem. The server has a multithreaded executor pool that spawns four executors. Each executor here is stuck doing one of the sorts leaving the pool drained of resources. The pool is limited so that it is not easy for users to unintentionally steal all of the CPU from update graph processing.

Perhaps we should add a high-priority single-threaded executor for export work that is guaranteed to have a short runtime (possibly focused on UI interactions like auto-complete, config service lookups, and creating new sessions).

@niloc132 opinions?

@niloc132
Copy link
Member

niloc132 commented Sep 5, 2023

Nate and I discussed this briefly the other day, and the problem is defining "guaranteed to have a short runtime" - for example, the python autocomplete operation requires calling into python, which means taking the GIL - so that is non-interruptably blocked while a long script is running (and as such would block this high priority single thread). We would have to find a way to define these operations in a way that they cannot block for any reason. Start console, config service calls are probably safe, making a new auth session could be unsafe depending on how the authentication provider is implemented. And since an auth session can be created for any http call, technically any call might be unsafe... That isn't all that likely though (metrics/timing logging could help here for warnings/diagnosis).


Looking specifically at the thread dump...

This sort is blocked on an earlier sort, on the same table, with the same sort params. This is a "good thing" so that we don't cancel the existing work and restart it when the second call comes in, but is pretty far from ideal that we have two concurrent threads blocked waiting for one unit of work to complete.

"DeephavenApiServer-Scheduler-Concurrent-4" #48 daemon prio=5 os_prio=0 cpu=1515.98ms elapsed=2131.97s tid=0x00007f7e54029800 nid=0x330 waiting for monitor entry  [0x00007f7e1adfc000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at io.deephaven.engine.table.impl.QueryTable$MemoizedResult.getOrCompute(QueryTable.java:3128)
        - waiting to lock <0x00000007221e9348> (a io.deephaven.engine.table.impl.QueryTable$MemoizedResult)
        at io.deephaven.engine.table.impl.QueryTable.memoizeResult(QueryTable.java:3102)
        at io.deephaven.engine.table.impl.QueryTable.getResult(QueryTable.java:3166)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:2265)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:88)

The actual sort work is busy here, either attempting to take the GIL, or actually took it and momentarily busy running interpreted Python code.

"DeephavenApiServer-Scheduler-Concurrent-3" #47 daemon prio=5 os_prio=0 cpu=5420.63ms elapsed=2132.18s tid=0x00007f7e307fe000 nid=0x32f runnable  [0x00007f7e1aefc000]
   java.lang.Thread.State: RUNNABLE
        at org.jpy.PyLib.callAndReturnObject(Native Method)
        at org.jpy.PyObject.callMethod(PyObject.java:432)
        at io.deephaven.engine.util.PythonScopeJpyImpl$CallableWrapper.call(PythonScopeJpyImpl.java:99)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.applyFormulaPerItem(Formula.java:161)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.lambda$fillChunkHelper$4(Formula.java:152)
        at io.deephaven.temp.c842762718987228486v55_0.Formula$$Lambda$1331/0x0000000840861040.accept(Unknown Source)
        at io.deephaven.engine.rowset.RowSet.lambda$forAllRowKeys$0(RowSet.java:308)
...
        at io.deephaven.engine.table.impl.QueryTable.lambda$getResult$71(QueryTable.java:3167)
        at io.deephaven.engine.table.impl.QueryTable$$Lambda$1317/0x0000000840851040.get(Unknown Source)
        at io.deephaven.engine.table.impl.QueryTable$MemoizedResult.getOrCompute(QueryTable.java:3135)
        - locked <0x00000007221e9348> (a io.deephaven.engine.table.impl.QueryTable$MemoizedResult)
        at io.deephaven.engine.table.impl.QueryTable.memoizeResult(QueryTable.java:3102)
        at io.deephaven.engine.table.impl.QueryTable.getResult(QueryTable.java:3166)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:2265)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:88)

Next thread (out of 4 total by default) is also working on sorting a table, but either not the same originating table, or not the same sort (perhaps the user clicked sort twice, and so both ascending and descending are running at the same time?). This code is also apparently in python, either has the GIL (and is blocking the other thread), or is waiting for the GIL (so cannot proceed and free up this thread until it has has the chance to take it).

"DeephavenApiServer-Scheduler-Concurrent-2" #36 daemon prio=5 os_prio=0 cpu=3931.01ms elapsed=2251.20s tid=0x00007f7e500bd000 nid=0xbe runnable  [0x00007f7e88a14000]
   java.lang.Thread.State: RUNNABLE
        at org.jpy.PyLib.callAndReturnObject(Native Method)
        at org.jpy.PyObject.callMethod(PyObject.java:432)
        at io.deephaven.engine.util.PythonScopeJpyImpl$CallableWrapper.call(PythonScopeJpyImpl.java:99)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.applyFormulaPerItem(Formula.java:161)
        at io.deephaven.temp.c842762718987228486v55_0.Formula.lambda$fillChunkHelper$4(Formula.java:152)
        at io.deephaven.temp.c842762718987228486v55_0.Formula$$Lambda$1331/0x0000000840861040.accept(Unknown Source)
        at io.deephaven.engine.rowset.RowSet.lambda$forAllRowKeys$0(RowSet.java:308)
...
        at io.deephaven.engine.table.impl.QueryTable.lambda$getResult$71(QueryTable.java:3167)
        at io.deephaven.engine.table.impl.QueryTable$$Lambda$1317/0x0000000840851040.get(Unknown Source)
        at io.deephaven.engine.table.impl.QueryTable$MemoizedResult.getOrCompute(QueryTable.java:3135)
        - locked <0x0000000724b68ef0> (a io.deephaven.engine.table.impl.QueryTable$MemoizedResult)
        at io.deephaven.engine.table.impl.QueryTable.memoizeResult(QueryTable.java:3102)
        at io.deephaven.engine.table.impl.QueryTable.getResult(QueryTable.java:3166)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:2265)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:88)

The last thread is blocked on the previous one, waiting for it to finish its work applying the same sort to the same table.

"DeephavenApiServer-Scheduler-Concurrent-1" #35 daemon prio=5 os_prio=0 cpu=417.87ms elapsed=2251.26s tid=0x00007f7e4c0dd000 nid=0xbd waiting for monitor entry  [0x00007f7e88d16000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at io.deephaven.engine.table.impl.QueryTable$MemoizedResult.getOrCompute(QueryTable.java:3128)
        - waiting to lock <0x0000000724b68ef0> (a io.deephaven.engine.table.impl.QueryTable$MemoizedResult)
        at io.deephaven.engine.table.impl.QueryTable.memoizeResult(QueryTable.java:3102)
        at io.deephaven.engine.table.impl.QueryTable.getResult(QueryTable.java:3166)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:2265)
        at io.deephaven.engine.table.impl.QueryTable.sort(QueryTable.java:88)

The serial thread is doing nothing, and PyLib doesn't appear elsewhere in the thread dump, so one of those two sorts holds the GIL, the other sort is waiting on it, and two other operations are waiting on them. So, problem one is "the GIL", problem two is "memoization takes a thread to do nothing", problem three is "if you want to do something that won't touch the GIL or a table, it still is in the same threadpool".

Perhaps this implies existence of some kind of "assertNoTableOperations"/"assertNoGil", and if you want to use the "fast lane" thread, you opt out of those... and possibly have a time budget, can't join/wait on other threads?

Alternatively, just add more threads, and try to mitigate one and two? Or try permit a growing threadpool to handle "everything is blocked on something else"... and correctly implement canceling work?

@nbauernfeind
Copy link
Member

It probably doesn't matter too much what those threads are doing. Obviously, it's a shame if they are blocking each other's access to the GIL. I was able to reproduce this using a groovy REPL and forcing the UI to sort four distinct, large tables.

I don't like the answer of adding more threads. Four parallel sorts is probably pretty heavy usage; remember we don't really want the client to so easily bring a server to its knees.

Should we identify the set of calls that the UI needs to start up a new connection?

Alternatively, we could isolate table instantiation (maybe also python auto-complete?), to a separate thread pool. I feel like a rough division is helpful for the typical user experience and that there is no need to plan for the odd scenario like auth handler blocking forever.

@niloc132
Copy link
Member

@nbauernfeind and I discussed this today briefly, and are planning to add a method to ExportBuilder like requiresSerialQueue(), except to signal that the submitted lambda should be fast and non-blocking. When this willBeFast() is called, this signals to run on a separate queue if there were any unsatisfied requirements, otherwise the lambda can be invoked directly on the same thread that it was submitted on.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working grpc session web-client-ui The Web GUI
Projects
None yet
Development

No branches or pull requests

4 participants