首页 > 解决方案 > Ignite 的缓存方法挂起

问题描述

我正在使用 Ignite.NET 2.7.6,有时它会挂起调用缓存的方法,例如缓存的枚举器 TryGet 或 MoveNext。

我有一台服务器和多个客户端节点,挂起发生在客户端。

典型的调用栈:

Apache.Ignite.Core.dll!Apache.Ignite.Core.Impl.Unmanaged.Jni.Env.CallVoidMethod(Apache.Ignite.Core.Impl.Unmanaged.Jni.GlobalRef obj, System.IntPtr methodId, long* argsPtr) 第 213 行C# Apache.Ignite.Core.dll!Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils.TargetOutStream(Apache.Ignite.Core.Impl.Unmanaged.Jni.GlobalRef target, int opType, long memPtr) 第 145 行 C# Apache.Ignite .Core.dll!Apache.Ignite.Core.Impl.PlatformJniTarget.OutStream(int type, System.Func readAction) 第 147 行 C# Apache.Ignite.Core.dll!Apache.Ignite.Core.Impl.PlatformTargetAdapter.DoInOp(int type , System.Func 动作) 第 193 行 C# Apache.Ignite.Core.dll!Apache.Ignite.Core.Impl.Cache.CacheEnumerator.MoveNext() 第 55 行 C# Apache.Ignite.Core.dll!Apache.Ignite.Core.Impl .Cache.CacheEnumeratorProxy.MoveNext() 第 71 行 C# AlphaLib.dll!Casino.Table。Enumerator.MoveNext() 第 503 行 C#

它挂在 CallVoidMethod 中。我试图在一个简单的项目上重现这一点,但失败了。

如果我在启动服务器节点的机器上启动客户端,这种情况会更频繁地重现。

关于为什么会发生这种情况的任何假设?

添加

我检查了 JVM 状态以防挂起,这是完整的堆栈:https ://pastebin.com/v5HiuQWb 看起来这个线程被卡住了:

"Thread-11" #148 prio=5 os_prio=0 tid=0x000001ae99665800 nid=0x34c4 in Object.wait() [0x00000050156bc000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.internalIterator(GridCacheQueryFutureAdapter.java:301)
        - locked <0x00000005d494de98> (a org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryFuture)
        at org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.next(GridCacheQueryFutureAdapter.java:158)
        at org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$5.onHasNext(GridCacheDistributedQueryManager.java:642)
        at org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:53)
        at org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:45)
        at org.apache.ignite.internal.processors.platform.cache.query.PlatformAbstractQueryCursor.processOutStream(PlatformAbstractQueryCursor.java:92)
        at org.apache.ignite.internal.processors.platform.PlatformTargetProxyImpl.outStream(PlatformTargetProxyImpl.java:93)

这段代码似乎挂起:

        long waitTime = timeout == 0 ? Long.MAX_VALUE : timeout - (U.currentTimeMillis() - startTime);

        if (waitTime <= 0) {
            it = Collections.<R>emptyList().iterator();

            break;
        }

        synchronized (this) {
            try {
                if (queue.isEmpty() && !isDone())
                    wait(waitTime); /* HERE!!! */
            }
            catch (InterruptedException e) {
                Thread.currentThread().interrupt();

                throw new IgniteCheckedException("Query was interrupted: " + qry, e);
            }
        }

我想在我的情况下超时为 0,因此它无限等待,因此可以将其设置为有限值。但这看起来不是一个好的解决方案。

标签: c#ignite

解决方案


在我们的网络中,有一个 Symantec 保护系统,它意外地开始关闭 Ignite 使用的端口。在客户端和服务器端。此外,在启动后的某个事件或一段时间后,它开始关闭这些端口 - 我不明白。我在赛门铁克日志中找到了它。

将使用的端口添加到白名单后,问题就解决了。


推荐阅读