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>
实例,并且一个线程处理它而另一个线程枚举它,我可以确认竞争条件是可能的。
查询游标不是线程安全的,它们应该在单线程中使用。
我正在使用 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>
实例,并且一个线程处理它而另一个线程枚举它,我可以确认竞争条件是可能的。
查询游标不是线程安全的,它们应该在单线程中使用。