You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Andrey Aleksandrov (JIRA)" <ji...@apache.org> on 2018/05/28 15:07:00 UTC

[jira] [Updated] (IGNITE-8630) Node filter IgnitePredicate executes twice during deploing on one single node cluster

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

Andrey Aleksandrov updated IGNITE-8630:
---------------------------------------
    Description: 
Next code:
{code:java}
        Ignite ignite = IgnitionEx.start("examples/config/example-ignite.xml", "ignite-1");

        // Deploy services only on server nodes.
        ignite.services().deploy(new ServiceConfiguration()
            .setMaxPerNodeCount(1)
            .setNodeFilter(new IgnitePredicate<ClusterNode>() {
                Ignite filterIgnite;

                @Override public boolean apply(ClusterNode node) {
                    System.out.println("Is local node: " + node.isLocal());
                    System.out.println("ignite: " + (isNull(filterIgnite) ? null : filterIgnite.name()));
                    return true;
                }

                @IgniteInstanceResource
                void setFilterIgnite(Ignite filterIgnite) {
                    this.filterIgnite = filterIgnite;
                }
            })
            .setName("my-service")
            .setService(new SimpleMapServiceImpl<>())
        );

{code}
Produces next output:
{code:java}
Is local node: true
ignite: ignite-1
Service was initialized: my-service
Executing distributed service: my-service
Is local node: true
ignite: ignite-1{code}
In case if we will increase the cluster size to 2 then we will have:
{code:java}
Ignite ignite = IgnitionEx.start("examples/config/example-ignite.xml", "ignite-1");
Ignite ignite2 = IgnitionEx.start("examples/config/example-ignite.xml", "ignite-2");

// Deploy services only on server nodes.
ignite.services().deploy(new ServiceConfiguration()
    .setMaxPerNodeCount(1)
    .setNodeFilter(new IgnitePredicate<ClusterNode>() {
        Ignite filterIgnite;

        @Override public boolean apply(ClusterNode node) {
            System.out.println("Is local node: " + node.isLocal());
            System.out.println("ignite: " + (isNull(filterIgnite) ? null : filterIgnite.name()));
            return true;
        }

        @IgniteInstanceResource
        void setFilterIgnite(Ignite filterIgnite) {
            this.filterIgnite = filterIgnite;
        }
    })
    .setName("my-service")
    .setService(new SimpleMapServiceImpl<>())
);

{code}
We will get:
{code:java}
Is local node: true
ignite: ignite-1 
Is local node: false
ignite: ignite-1 
Service was initialized: my-service
Executing distributed service: my-service
Service was initialized: my-service
Is local node: true
ignite: ignite-1 
Is local node: false
ignite: ignite-1 
Executing distributed service: my-service
Is local node: true
ignite: ignite-1
Is local node: false
ignite: ignite-1
{code}
So we have additional execution:
{code:java}
Is local node: true
ignite: ignite-1
Is local node: false
ignite: ignite-1{code}
So Ignite executes apply method several times (2 times for 1 server, 6 times for 2 servers). This behavior should be documented or fixed because at the moment it's could be unexpected for the user.

You can see the same behiviour during deploying of the caches with nodeFilter 

  was:
Next code:


{code:java}
        Ignite ignite = IgnitionEx.start("examples/config/example-ignite.xml", "ignite-1");

        // Deploy services only on server nodes.
        ignite.services().deploy(new ServiceConfiguration()
            .setMaxPerNodeCount(1)
            .setNodeFilter(new IgnitePredicate<ClusterNode>() {
                Ignite filterIgnite;

                @Override public boolean apply(ClusterNode node) {
                    System.out.println("Is local node: " + node.isLocal());
                    System.out.println("ignite: " + (isNull(filterIgnite) ? null : filterIgnite.name()));
                    return true;
                }

                @IgniteInstanceResource
                void setFilterIgnite(Ignite filterIgnite) {
                    this.filterIgnite = filterIgnite;
                }
            })
            .setName("my-service")
            .setService(new SimpleMapServiceImpl<>())
        );

{code}
Produces next output:
{code:java}
Is local node: true
ignite: ignite-1
Service was initialized: my-service
Executing distributed service: my-service
Is local node: true
ignite: ignite-1{code}

In case if we will increase the cluster size to 2 then we will have:
{code:java}
Ignite ignite = IgnitionEx.start("examples/config/example-ignite.xml", "ignite-1");
Ignite ignite2 = IgnitionEx.start("examples/config/example-ignite.xml", "ignite-2");

// Deploy services only on server nodes.
ignite.services().deploy(new ServiceConfiguration()
    .setMaxPerNodeCount(1)
    .setNodeFilter(new IgnitePredicate<ClusterNode>() {
        Ignite filterIgnite;

        @Override public boolean apply(ClusterNode node) {
            System.out.println("Is local node: " + node.isLocal());
            System.out.println("ignite: " + (isNull(filterIgnite) ? null : filterIgnite.name()));
            return true;
        }

        @IgniteInstanceResource
        void setFilterIgnite(Ignite filterIgnite) {
            this.filterIgnite = filterIgnite;
        }
    })
    .setName("my-service")
    .setService(new SimpleMapServiceImpl<>())
);

{code}
We will get:
{code:java}
Is local node: true
ignite: ignite-1 
Is local node: false
ignite: ignite-1 
Service was initialized: my-service
Executing distributed service: my-service
Service was initialized: my-service
Is local node: true
ignite: ignite-1 
Is local node: false
ignite: ignite-1 
Executing distributed service: my-service
Is local node: true
ignite: ignite-1
Is local node: false
ignite: ignite-1
{code}
So we have additional execution:
{code:java}
Is local node: true
ignite: ignite-1
Is local node: false
ignite: ignite-1{code}
So Ignite executes apply method several times (2 times for 1 server, 6 times for 2 servers). This behavior should be documented or fixed because at the moment it's could be unexpected for the user.


> Node filter IgnitePredicate executes twice during deploing on one single node cluster
> -------------------------------------------------------------------------------------
>
>                 Key: IGNITE-8630
>                 URL: https://issues.apache.org/jira/browse/IGNITE-8630
>             Project: Ignite
>          Issue Type: Bug
>          Components: managed services
>    Affects Versions: 2.4
>            Reporter: Andrey Aleksandrov
>            Priority: Major
>             Fix For: 2.6
>
>
> Next code:
> {code:java}
>         Ignite ignite = IgnitionEx.start("examples/config/example-ignite.xml", "ignite-1");
>         // Deploy services only on server nodes.
>         ignite.services().deploy(new ServiceConfiguration()
>             .setMaxPerNodeCount(1)
>             .setNodeFilter(new IgnitePredicate<ClusterNode>() {
>                 Ignite filterIgnite;
>                 @Override public boolean apply(ClusterNode node) {
>                     System.out.println("Is local node: " + node.isLocal());
>                     System.out.println("ignite: " + (isNull(filterIgnite) ? null : filterIgnite.name()));
>                     return true;
>                 }
>                 @IgniteInstanceResource
>                 void setFilterIgnite(Ignite filterIgnite) {
>                     this.filterIgnite = filterIgnite;
>                 }
>             })
>             .setName("my-service")
>             .setService(new SimpleMapServiceImpl<>())
>         );
> {code}
> Produces next output:
> {code:java}
> Is local node: true
> ignite: ignite-1
> Service was initialized: my-service
> Executing distributed service: my-service
> Is local node: true
> ignite: ignite-1{code}
> In case if we will increase the cluster size to 2 then we will have:
> {code:java}
> Ignite ignite = IgnitionEx.start("examples/config/example-ignite.xml", "ignite-1");
> Ignite ignite2 = IgnitionEx.start("examples/config/example-ignite.xml", "ignite-2");
> // Deploy services only on server nodes.
> ignite.services().deploy(new ServiceConfiguration()
>     .setMaxPerNodeCount(1)
>     .setNodeFilter(new IgnitePredicate<ClusterNode>() {
>         Ignite filterIgnite;
>         @Override public boolean apply(ClusterNode node) {
>             System.out.println("Is local node: " + node.isLocal());
>             System.out.println("ignite: " + (isNull(filterIgnite) ? null : filterIgnite.name()));
>             return true;
>         }
>         @IgniteInstanceResource
>         void setFilterIgnite(Ignite filterIgnite) {
>             this.filterIgnite = filterIgnite;
>         }
>     })
>     .setName("my-service")
>     .setService(new SimpleMapServiceImpl<>())
> );
> {code}
> We will get:
> {code:java}
> Is local node: true
> ignite: ignite-1 
> Is local node: false
> ignite: ignite-1 
> Service was initialized: my-service
> Executing distributed service: my-service
> Service was initialized: my-service
> Is local node: true
> ignite: ignite-1 
> Is local node: false
> ignite: ignite-1 
> Executing distributed service: my-service
> Is local node: true
> ignite: ignite-1
> Is local node: false
> ignite: ignite-1
> {code}
> So we have additional execution:
> {code:java}
> Is local node: true
> ignite: ignite-1
> Is local node: false
> ignite: ignite-1{code}
> So Ignite executes apply method several times (2 times for 1 server, 6 times for 2 servers). This behavior should be documented or fixed because at the moment it's could be unexpected for the user.
> You can see the same behiviour during deploying of the caches with nodeFilter 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)