Apache.Ignite.Core.Impl.Unmanaged.UnmanagedCallbacks.CacheEntryFilterApply崩溃

Apache.Ignite.Core.Impl.Unmanaged.UnmanagedCallbacks.CacheEntryFilterApply crash

我正在使用 Ignite.NET 2.7.6,有时它会在

中崩溃

Apache.Ignite.Core.Impl.Unmanaged.UnmanagedCallbacks.CacheEntryFilterApply(long memPtr)

因为 var t == null 和 t.Invoke(stream) 抛出 NullPointerException。

我做错了什么触发了这个问题?

添加: stream.ReadLong() 提到的方法returns 0,所以表达式

_ignite.HandleRegistry.Get(stream.ReadLong())

获取 id == 0 的过滤器持有者,看起来像无效 id。

可能的解决方案:我使用这样的二进制过滤器创建扫描查询:

    cursor = cache.WithKeepBinary.Query(new ScanQuery(myFilter))

稍后我在一个单独的线程中使用这个游标来收集结果:从中获取一个枚举器并遍历对象。

但是我有一个逻辑错误,可能导致游标被释放时的情况,但相应的迭代器调用了 MoveNext 或 Current。 这种情况下没有抛出异常,调用了上面提到的JNI handler,导致里面出现了异常,从而导致了Ignite的undefined behavior。

我会查看问题是否已解决并报告结果。

如果从多个线程使用 IQueryCursor<K, V> 实例,并且一个线程处理它而另一个线程枚举它,我可以确认竞争条件是可能的。

查询游标不是线程安全的,它们应该在单线程中使用。

提交的工单:https://issues.apache.org/jira/browse/IGNITE-12348