You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Pavel Pereslegin (Jira)" <ji...@apache.org> on 2021/07/22 13:10:00 UTC

[jira] [Updated] (IGNITE-15045) .NET: Continuous query with enabled security produces NullPointerException

     [ https://issues.apache.org/jira/browse/IGNITE-15045?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Pavel Pereslegin updated IGNITE-15045:
--------------------------------------
    Summary: .NET: Continuous query with enabled security produces NullPointerException  (was: .NET Continuous query with enabled security produces NullPointerException)

> .NET: Continuous query with enabled security produces NullPointerException
> --------------------------------------------------------------------------
>
>                 Key: IGNITE-15045
>                 URL: https://issues.apache.org/jira/browse/IGNITE-15045
>             Project: Ignite
>          Issue Type: Bug
>    Affects Versions: 2.11
>            Reporter: Alexandr
>            Assignee: Pavel Pereslegin
>            Priority: Major
>              Labels: .NET
>         Attachments: ListenerService.cs, st1.txt, st2.txt
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> 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#
> {code:java}
> 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)
> {code}
> 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:
> {code:c#}
> 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);
>     }
> }
> {code}
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)