Thin client: compute support

2019-11-20 Thread Alex Plehanov
Hello, Igniters!

I have plans to start implementation of Compute interface for Ignite thin
client and want to discuss features that should be implemented.

We already have Compute implementation for binary-rest clients
(GridClientCompute), which have the following functionality:
- Filtering cluster nodes (projection) for compute
- Executing task by the name

I think we can implement this functionality in a thin client as well.

First of all, we need some operation types to request a list of all
available nodes and probably node attributes (by a list of nodes). Node
attributes will be helpful if we will decide to implement analog of
ClusterGroup#forAttribute or ClusterGroup#forePredicate methods in the thin
client. Perhaps they can be requested lazily.

>From the protocol point of view there will be two new operations:

OP_CLUSTER_GET_NODES
Request: empty
Response: long topologyVersion, int minorTopologyVersion, int nodesCount,
for each node set of node fields (UUID nodeId, Object or String
consistentId, long order, etc)

OP_CLUSTER_GET_NODE_ATTRIBUTES
Request: int nodesCount, for each node: UUID nodeId
Response: int nodesCount, for each node: int attributesCount, for each node
attribute: String name, Object value

To execute tasks we need something like these methods in the client API:
Object execute(String task, Object arg)
Future executeAsync(String task, Object arg)
Object affinityExecute(String task, String cache, Object key, Object arg)
Future affinityExecuteAsync(String task, String cache, Object key,
Object arg)

Which can be mapped to protocol operations:

OP_COMPUTE_EXECUTE_TASK
Request: UUID nodeId, String taskName, Object arg
Response: Object result

OP_COMPUTE_EXECUTE_TASK_AFFINITY
Request: String cacheName, Object key, String taskName, Object arg
Response: Object result

The second operation is needed because we sometimes can't calculate and
connect to affinity node on the client-side (affinity awareness can be
disabled, custom affinity function can be used or there can be no
connection between client and affinity node), but we can make best effort
to send request to target node if affinity awareness is enabled.

Currently, on the server-side requests always processed synchronously and
responses are sent right after request was processed. To execute long tasks
async we should whether change this logic or introduce some kind two-way
communication between client and server (now only one-way requests from
client to server are allowed).

Two-way communication can also be useful in the future if we will send some
server-side generated events to clients.

In case of two-way communication there can be new operations introduced:

OP_COMPUTE_EXECUTE_TASK (from client to server)
Request: UUID nodeId, String taskName, Object arg
Response: long taskId

OP_COMPUTE_TASK_FINISHED (from server to client)
Request: taskId, Object result
Response: empty

The same for affinity requests.

Also, we can implement not only execute task operation, but some other
operations from IgniteCompute (broadcast, run, call), but it will be useful
only for java thin client. And even with java thin client we should whether
implement peer-class-loading for thin clients (this also requires two-way
client-server communication) or put classes with executed closures to the
server locally.

What do you think about proposed protocol changes?
Do we need two-way requests between client and server?
Do we need support of compute methods other than "execute task"?
What do you think about peer-class-loading for thin clients?


Re: Joining node validation failure event.

2019-11-20 Thread Andrey Gura
Hi, Mikhail!

Could you please describe the case for this new event?

On Wed, Nov 20, 2019 at 12:45 PM Mikhail Petrov  wrote:
>
> Hello, Igniters.
>
> There is a case which requires to handle joining node validation failure
> in Ignite components and obtain information of the node that tried to
> join and the reason for the failure. Now, as I see, there is no way to
> do it. I propose to implement a new event -- NodeValidationFailedEvent
> -- and record it in case the validation fails. I have created Tiket [1]
> and PR [2], which shows an example of implementation. Could anyone take
> a look at it, please?
>
> [1] https://issues.apache.org/jira/browse/IGNITE-12380
>
> [2] https://github.com/apache/ignite/pull/7057
>


Contribution to Apache Ignite

2019-11-20 Thread Sergey Chugunov
Hello Lev,

My name is Sergey, I'm from Apache Ignite community. As I can see you
successfully completed your first ticket but there are some review comments
on your second one [1].

Do you need any assistance with resolving them?

Also if you're interested in more challenging tasks, there are plenty of
them and we could figure out what to pick up next.

Anyway, thank you for your interest to our project and community!

[1] https://issues.apache.org/jira/browse/IGNITE-11312

--
Best regards,
Sergey Chugunov.


Joining node validation failure event.

2019-11-20 Thread Mikhail Petrov

Hello, Igniters.

There is a case which requires to handle joining node validation failure 
in Ignite components and obtain information of the node that tried to 
join and the reason for the failure. Now, as I see, there is no way to 
do it. I propose to implement a new event -- NodeValidationFailedEvent 
-- and record it in case the validation fails. I have created Tiket [1] 
and PR [2], which shows an example of implementation. Could anyone take 
a look at it, please?


[1] https://issues.apache.org/jira/browse/IGNITE-12380

[2] https://github.com/apache/ignite/pull/7057