c# - 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,因此它无限等待,因此可以将其设置为有限值。但这看起来不是一个好的解决方案。
解决方案
在我们的网络中,有一个 Symantec 保护系统,它意外地开始关闭 Ignite 使用的端口。在客户端和服务器端。此外,在启动后的某个事件或一段时间后,它开始关闭这些端口 - 我不明白。我在赛门铁克日志中找到了它。
将使用的端口添加到白名单后,问题就解决了。
推荐阅读
- c# - Converting some VB.NET code to C# - Need Advice
- vba - 用于匹配 sheet1 中的字符串值的宏,如果匹配则将下一个单元格值复制到 sheet2
- vbscript - 经典 ASP 中的客户端 VBScript:未定义的函数
- templates - 在 Meteor JS 中创建多个组件实例
- reactjs - Set State from ajax call to insert into db outside function?
- python - Conda-Build:平台 osx-64 无法满足的依赖关系:{"torch[version='>=0.4']"}
- seaborn - 从 seaborn regplot 获取拟合参数?
- javascript - Handling a rotated canvas image dragable relative to the canvas not the image
- ios - 如何以编程方式获取已安装的 mapbox SDK 的当前版本?
- reactjs - 滑动 ListView 将转到另一个 ListView