IGNITE-15045 .NET: Fix NullPointerException in ContinuousQuery with security enabled
Add null check to `SecurityAwareFilter`, because `PlatformContinuousQueryImpl` always sets itself as a remote filter, but serializes as null when the actual filter is not present.
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareFilter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareFilter.java
index 481e1bf..1f15faa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareFilter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/SecurityAwareFilter.java
@@ -53,6 +53,11 @@
/** {@inheritDoc} */
@Override public boolean evaluate(CacheEntryEvent<? extends K, ? extends V> evt) throws CacheEntryListenerException {
+ // Even if there is no custom filter, the platform filter is always present (for proper resource release),
+ // but only the custom filter is serialized.
+ if (original == null)
+ return true;
+
IgniteSecurity security = ignite.context().security();
try (OperationSecurityContext c = security.withContext(subjectId)) {
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryTest.cs
index d49469f..b645233 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/Continuous/ContinuousQueryTest.cs
@@ -21,17 +21,50 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
+ using Apache.Ignite.Core.Binary;
using Apache.Ignite.Core.Cache;
using Apache.Ignite.Core.Cache.Event;
using Apache.Ignite.Core.Cache.Query.Continuous;
+ using Apache.Ignite.Core.Configuration;
+ using Apache.Ignite.Core.Log;
+ using Apache.Ignite.Core.Tests.Client.Cache;
using NUnit.Framework;
/// <summary>
- /// Tests continuous queries.
+ /// Tests continuous queries with security enabled and disabled.
/// </summary>
+ [TestFixture(false)]
+ [TestFixture(true)]
[Category(TestUtils.CategoryIntensive)]
public class ContinuousQueryTest
{
+ /** Flag to enable Ignite security. */
+ private readonly bool _enableSecurity;
+
+ /** Logger for tracking errors. */
+ private readonly ListLogger _logger = new ListLogger(new ConsoleLogger())
+ {
+ EnabledLevels = new[] {LogLevel.Error}
+ };
+
+ /// <summary>
+ /// Initializes a new instance of <see cref="ContinuousQueryTest"/>.
+ /// </summary>
+ public ContinuousQueryTest(bool enableSecurity)
+ {
+ _enableSecurity = enableSecurity;
+ }
+
+ /// <summary>
+ /// Clears persistence directory before and after the test.
+ /// </summary>
+ [TestFixtureSetUp]
+ [TestFixtureTearDown]
+ public void FixtureTearDown()
+ {
+ TestUtils.ClearWorkDir();
+ }
+
/// <summary>
/// Tests same query on multiple nodes.
/// This tests verifies that there are no exception on Java side during event delivery.
@@ -42,6 +75,8 @@
{
using (var ignite = StartIgnite())
{
+ ignite.GetCluster().SetActive(true);
+
var cache = ignite.GetOrCreateCache<Guid, Data>("data");
cache.QueryContinuous(new ContinuousQuery<Guid, Data>(new Listener()));
@@ -57,6 +92,9 @@
}
}
}
+
+ Assert.AreEqual(0,
+ _logger.Entries.FindAll(e => e.Message.Contains("CacheEntryEventFilter failed")).Count);
}
/// <summary>
@@ -84,13 +122,28 @@
/// <summary>
/// Starts the ignite.
/// </summary>
- private static IIgnite StartIgnite()
+ private IIgnite StartIgnite()
{
- return Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
+ var ignite = Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
{
- BinaryConfiguration = new Core.Binary.BinaryConfiguration(typeof(Data)),
- AutoGenerateIgniteInstanceName = true
+ BinaryConfiguration = new BinaryConfiguration(typeof(Data)),
+ AutoGenerateIgniteInstanceName = true,
+ DataStorageConfiguration = new DataStorageConfiguration
+ {
+ DefaultDataRegionConfiguration = new DataRegionConfiguration
+ {
+ PersistenceEnabled = _enableSecurity,
+ Name = DataStorageConfiguration.DefaultDataRegionName,
+ }
+ },
+ AuthenticationEnabled = _enableSecurity,
+ Logger = _logger,
+ IsActiveOnStart = false
});
+
+ ignite.GetCluster().SetBaselineAutoAdjustEnabledFlag(true);
+
+ return ignite;
}
private class Data