[
https://issues.apache.org/jira/browse/IGNITE-23346?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Evgeny Stanilovsky updated IGNITE-23346:
----------------------------------------
Fix Version/s: 2.19
(was: 2.18)
> .NET: AttributeNodeFilter does not work with Services
> -----------------------------------------------------
>
> Key: IGNITE-23346
> URL: https://issues.apache.org/jira/browse/IGNITE-23346
> Project: Ignite
> Issue Type: Bug
> Components: managed services, platforms
> Affects Versions: 2.16
> Reporter: Pavel Tupitsyn
> Assignee: Pavel Tupitsyn
> Priority: Major
> Labels: .NET
> Fix For: 2.19
>
>
> Add the following to ServicesClientTest.cs
> {code:C#}
> [Test]
> public void TestNodeFilter()
> {
> ServerServices.Deploy(new ServiceConfiguration
> {
> Name = "s",
> Service = new TestService(),
> TotalCount = 2,
> MaxPerNodeCount = 2,
> NodeFilter = new AttributeNodeFilter("x", "y")
> });
> var services = Client.GetServices();
> var proxy = services.GetServiceProxy<ITestService>("s");
> proxy.PersonMethod(new Person(1));
> }
> {code}
> Result:
> {code}
> Apache.Ignite.Core.Services.ServiceDeploymentException : Service deployment
> failed with an exception. Examine InnerException for details.
> ----> Apache.Ignite.Core.Services.ServiceDeploymentException : Failed to
> deploy some services.
> ----> Apache.Ignite.Core.Common.JavaException : class
> org.apache.ignite.services.ServiceDeploymentException: Failed to deploy some
> services.
> at
> org.apache.ignite.internal.processors.service.GridServiceDeploymentCompoundFuture.processFailure(GridServiceDeploymentCompoundFuture.java:52)
> at
> org.apache.ignite.internal.util.future.GridCompoundFuture.apply(GridCompoundFuture.java:126)
> at
> org.apache.ignite.internal.util.future.GridCompoundFuture.apply(GridCompoundFuture.java:46)
> at
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:474)
> at
> org.apache.ignite.internal.util.future.GridFutureAdapter.unblock(GridFutureAdapter.java:350)
> at
> org.apache.ignite.internal.util.future.GridFutureAdapter.unblockAll(GridFutureAdapter.java:338)
> at
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:585)
> at
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:565)
> at
> org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:553)
> at
> org.apache.ignite.internal.processors.service.IgniteServiceProcessor.completeInitiatingFuture(IgniteServiceProcessor.java:1518)
> at
> org.apache.ignite.internal.processors.service.ServiceDeploymentTask.lambda$completeInitiatingFuture$10(ServiceDeploymentTask.java:546)
> at java.base/java.util.HashMap.forEach(HashMap.java:1337)
> at
> java.base/java.util.Collections$UnmodifiableMap.forEach(Collections.java:1505)
> at
> org.apache.ignite.internal.processors.service.ServiceDeploymentTask.completeInitiatingFuture(ServiceDeploymentTask.java:515)
> at
> org.apache.ignite.internal.processors.service.ServiceDeploymentTask.completeSuccess(ServiceDeploymentTask.java:773)
> at
> org.apache.ignite.internal.processors.service.ServiceDeploymentTask.lambda$onReceiveFullDeploymentsMessage$9(ServiceDeploymentTask.java:495)
> at
> org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:7530)
> at
> org.apache.ignite.internal.processors.closure.GridClosureProcessor$1.body(GridClosureProcessor.java:649)
> at
> org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:125)
> at
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
> at
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
> at java.base/java.lang.Thread.run(Thread.java:829)
> Suppressed: class org.apache.ignite.IgniteCheckedException: Failed to
> calculate assignments for service, cfg=LazyServiceConfiguration
> [srvcClsName=org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetServiceImpl,
> svcCls=, nodeFilterCls=PlatformClusterNodeFilterImpl]
> at
> org.apache.ignite.internal.processors.service.ServiceDeploymentTask.reassign(ServiceDeploymentTask.java:593)
> at
> org.apache.ignite.internal.processors.service.ServiceDeploymentTask.lambda$processDeploymentActions$5(ServiceDeploymentTask.java:307)
> at java.base/java.util.HashMap.forEach(HashMap.java:1337)
> at
> java.base/java.util.Collections$UnmodifiableMap.forEach(Collections.java:1505)
> at
> org.apache.ignite.internal.processors.service.ServiceDeploymentTask.processDeploymentActions(ServiceDeploymentTask.java:301)
> at
> org.apache.ignite.internal.processors.service.ServiceDeploymentTask.init(ServiceDeploymentTask.java:261)
> at
> org.apache.ignite.internal.processors.service.ServiceDeploymentManager$ServicesDeploymentWorker.body(ServiceDeploymentManager.java:475)
> at
> org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:125)
> ... 1 more
> Suppressed: class org.apache.ignite.IgniteCheckedException:
> Failed to calculate assignments for service, cfg=LazyServiceConfiguration
> [srvcClsName=org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetServiceImpl,
> svcCls=PlatformDotNetServiceImpl,
> nodeFilterCls=PlatformClusterNodeFilterImpl]
> ... 9 more
> Caused by: class org.apache.ignite.IgniteException: Should not
> be called from .NET side.
> at
> org.apache.ignite.internal.processors.platform.callback.PlatformCallbackUtils.inLongOutLong(Native
> Method)
> at
> org.apache.ignite.internal.processors.platform.callback.PlatformCallbackGateway.clusterNodeFilterApply(PlatformCallbackGateway.java:963)
> at
> org.apache.ignite.internal.processors.platform.cluster.PlatformClusterNodeFilterImpl.apply(PlatformClusterNodeFilterImpl.java:66)
> at
> org.apache.ignite.internal.processors.platform.cluster.PlatformClusterNodeFilterImpl.apply(PlatformClusterNodeFilterImpl.java:33)
> at
> org.apache.ignite.internal.processors.service.IgniteServiceProcessor.reassign(IgniteServiceProcessor.java:1165)
> at
> org.apache.ignite.internal.processors.service.ServiceDeploymentTask.reassign(ServiceDeploymentTask.java:582)
> ... 8 more
> Caused by: class org.apache.ignite.IgniteException: Should not be
> called from .NET side.
> at
> org.apache.ignite.internal.processors.platform.callback.PlatformCallbackUtils.inLongOutLong(Native
> Method)
> at
> org.apache.ignite.internal.processors.platform.callback.PlatformCallbackGateway.clusterNodeFilterApply(PlatformCallbackGateway.java:963)
> at
> org.apache.ignite.internal.processors.platform.cluster.PlatformClusterNodeFilterImpl.apply(PlatformClusterNodeFilterImpl.java:66)
> at
> org.apache.ignite.internal.processors.platform.cluster.PlatformClusterNodeFilterImpl.apply(PlatformClusterNodeFilterImpl.java:33)
> at
> org.apache.ignite.internal.processors.service.IgniteServiceProcessor.reassign(IgniteServiceProcessor.java:1165)
> at
> org.apache.ignite.internal.processors.service.ServiceDeploymentTask.reassign(ServiceDeploymentTask.java:582)
> ... 8 more
> {code}
> h2. Workaround
> Implement your own AttributeNodeFilter
> {code:c#}
> public class MyAttributeNodeFilter : IClusterNodeFilter
> {
> private readonly IDictionary<string, object> _attributes;
> public MyAttributeNodeFilter(IDictionary<string, object> attributes)
> {
> _attributes = attributes;
> }
> public bool Invoke(IClusterNode node)
> {
> foreach (var attr in _attributes)
> {
> if (!node.Attributes.TryGetValue(attr.Key, out var nodeAttr)
> ||
> !nodeAttr.Equals(attr.Value))
> {
> return false;
> }
> }
> return true;
> }
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)