Details
Description
With the security enabled without specifying eventFilter on ContinuousQuery, we get an error: CacheEntryEventFilter failed: java.lang.NullPointerException. This error does not reproduce on java but is stable on C#
java.lang.NullPointerException at org.apache.ignite.internal.processors.cache.query.continuous.SecurityAwareFilter.evaluate(SecurityAwareFilter.java:61) at org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler.filter(CacheContinuousQueryHandler.java:1013) at org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler$2.onEntryUpdated(CacheContinuousQueryHandler.java:473) at org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryManager.onEntryUpdated(CacheContinuousQueryManager.java:447) at org.apache.ignite.internal.processors.cache.GridCacheMapEntry.innerUpdate(GridCacheMapEntry.java:2513) at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateSingle(GridDhtAtomicCache.java:2654) at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.update(GridDhtAtomicCache.java:2114) at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal0(GridDhtAtomicCache.java:1931) at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.updateAllAsyncInternal(GridDhtAtomicCache.java:1724) at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.processNearAtomicUpdateRequest(GridDhtAtomicCache.java:3293) at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache.access$400(GridDhtAtomicCache.java:146) at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5.apply(GridDhtAtomicCache.java:287) at org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCache$5.apply(GridDhtAtomicCache.java:282) at org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:1142) at org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:591) at org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:392) at org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:318) at org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$100(GridCacheIoManager.java:109) at org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:308) at org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1908) at org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1529) at org.apache.ignite.internal.managers.communication.GridIoManager.access$5300(GridIoManager.java:242) at org.apache.ignite.internal.managers.communication.GridIoManager$9.execute(GridIoManager.java:1422) at org.apache.ignite.internal.managers.communication.TraceRunnable.run(TraceRunnable.java:55) at org.apache.ignite.internal.util.StripedExecutor$Stripe.body(StripedExecutor.java:569) at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:120) at java.lang.Thread.run(Thread.java:748)
This seems to be because PlatformContinuousQueryImpl sets himself as a remote filter by default (as a wrapper, see PlatformContinuousQueryImpl#start and PlatformContinuousQueryImpl#evaluate), but serializes only the real filter if it exists (PlatformContinuousQueryImpl#writeReplace), so we wrap the PlatformContinuousQueryImpl with a SecurityAwareFilter, but the original PlatformContinuousQueryImpl filter is serialized to null because no real filter was set.
Reproducer:
public class ContinuousQuerySecurityEnabledTest { private static readonly string TempDir = PathUtils.GetTempDirectoryName(); private static ListLogger _logger = new ListLogger(new ConsoleLogger()) { EnabledLevels = new[] {LogLevel.Error} }; [Test] [Category(TestUtils.CategoryIntensive)] public void TestQuerySecurityEnabled() { using (var ignite = StartIgnite()) { using (StartIgnite()) { ignite.GetCluster().SetActive(true); var cache = ignite.CreateCache<int, string>("TEST"); cache.QueryContinuous(new ContinuousQuery<int, string>(new LocalListener())); for (int i = 0; i < 100; i++) cache.Put(i, "test" + i); var errs = _logger.Entries.FindAll( e => e.Message.Contains("CacheEntryEventFilter failed: java.lang.NullPointerException")); Assert.AreEqual(0, errs.Count); } } } [Serializable] class LocalListener : ICacheEntryEventListener<int, string> { public void OnEvent(IEnumerable<ICacheEntryEvent<int, string>> evts) { // No-op. } } private static IIgnite StartIgnite() { return Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration()) { AutoGenerateIgniteInstanceName = true, DataStorageConfiguration = new DataStorageConfiguration { DefaultDataRegionConfiguration = new DataRegionConfiguration { PersistenceEnabled = true, Name = "default", } }, AuthenticationEnabled = true, WorkDirectory = TempDir, Logger = _logger }); } [TearDown] public void TearDown() { _logger.Clear(); Directory.Delete(TempDir, true); } }
Attachments
Attachments
Issue Links
- is related to
-
IGNITE-12342 Continuous Queries: Remote filter and transformer have to run with appropriate SecurityContext.
- Resolved
- links to