Alex, thanks for preparing the outline.

I'd like us to discuss an approach for compute tasks update with no
downtimes on the servers' end. For instance, let's assume that a
Python/C++/Node.JS developer requested to update a compute task he called
from the app. Should we introduce some system level API to the binary
protocol that can take a jar file (or class) and redeploy it automatically
with the usage of peer-class-loading?

-
Denis


On Wed, Mar 25, 2020 at 5:47 AM Alex Plehanov <plehanov.a...@gmail.com>
wrote:

> Hello guys.
>
> I've implemented PoC and created IEP [1] for thin client compute grid
> functionality. Please have a look.
>
> [1]:
>
> https://cwiki.apache.org/confluence/display/IGNITE/IEP-42+Thin+client%3A+compute+support
>
> пт, 24 янв. 2020 г. в 16:56, Alex Plehanov <plehanov.a...@gmail.com>:
>
> > We've discussed thin client compute protocol with Pavel Tupitsyn and Igor
> > Sapego and come to the conclusion that approach with two-way requests
> > should be used: client generates taskId and send a request to the server
> to
> > execute a task. The server responds that the request has been accepted.
> > After task has finished the server notifies the client (send a request
> > without waiting for a response). The client can cancel the task by
> sending
> > a corresponding request to the server.
> >
> > Also, a node list should be passed (optionally) with a request to limit
> > nodes to execute the task.
> >
> > I will create IEP and file detailed protocol changes shortly.
> >
> > вт, 21 янв. 2020 г. в 18:46, Alex Plehanov <plehanov.a...@gmail.com>:
> >
> >> Igor, thanks for the reply.
> >>
> >> > Approach with taskId will require a lot of changes in protocol and
> thus
> >> more "heavy" for implementation
> >> Do you mean approach with server notifications mechanism? Yes, it will
> >> require a lot of changes. But in most recent messages we've discussed
> with
> >> Pavel approach without server notifications mechanism. This approach
> have
> >> the same complexity and performance as an approach with requestId.
> >>
> >> > But such clients as Python, Node.js, PHP, Go most probably won't have
> >> support for this API, at least for now.
> >> Without a server notifications mechanism, there will be no breaking
> >> changes in the protocol, so client implementation can just skip this
> >> feature and protocol version and implement the next one.
> >>
> >> > Or never.
> >> I think it still useful to execute java compute tasks from non-java thin
> >> clients. Also, we can provide some out-of-the-box java tasks, for
> example
> >> ExecutePythonScriptTask with python compute implementation, which can
> run
> >> python script on server node.
> >>
> >> > So, maybe it's a good time for us to change our backward compatibility
> >> mechanism from protocol versioning to feature masks?
> >> I like the idea with feature masks, but it will force us to support both
> >> backward compatibility mechanisms, protocol versioning and feature
> masks.
> >>
> >> пн, 20 янв. 2020 г. в 20:34, Pavel Tupitsyn <ptupit...@apache.org>:
> >>
> >>> Huge +1 from me for Feature Masks.
> >>> I think this should be our top priority for thin client protocol, since
> >>> it
> >>> simplifies change management a lot.
> >>>
> >>> On Mon, Jan 20, 2020 at 8:21 PM Igor Sapego <isap...@apache.org>
> wrote:
> >>>
> >>> > Sorry for the late reply.
> >>> >
> >>> > Approach with taskId will require a lot of changes in protocol and
> thus
> >>> > more "heavy" for implementation, but it definitely looks to me less
> >>> hacky
> >>> > than reqId-approach. Moreover, as was mentioned, server notifications
> >>> > mechanism will be required in a future anyway with high probability.
> So
> >>> > from this point of view I like taskId-approach.
> >>> >
> >>> > On the other hand, what we should also consider here is performance.
> >>> > Speaking of latency, it looks like reqId will have better results in
> >>> case
> >>> > of
> >>> > small and fast tasks. The only question here, if we want to optimize
> >>> thin
> >>> > clients for this case.
> >>> >
> >>> > Also, what are you talking about mostly involves clients on platforms
> >>> > that already have Compute API for thick clients. Let me mention one
> >>> > more point of view here and another concern here.
> >>> >
> >>> > The changes you propose are going to change protocol version for
> sure.
> >>> > In case with taskId approach and server notifications - even more so.
> >>> >
> >>> > But such clients as Python, Node.js, PHP, Go most probably won't have
> >>> > support for this API, at least for now. Or never. But current
> >>> > backward-compatibility mechanism implies protocol versions where we
> >>> > imply that client that supports version 1.5 also supports all the
> >>> features
> >>> > introduced in all the previous versions of the protocol.
> >>> >
> >>> > Thus implementing Compute API in any of the proposed ways *may*
> >>> > force mentioned clients to support changes in protocol which they not
> >>> > necessarily need in order to introduce new features in the future.
> >>> >
> >>> > So, maybe it's a good time for us to change our backward
> compatibility
> >>> > mechanism from protocol versioning to feature masks?
> >>> >
> >>> > WDYT?
> >>> >
> >>> > Best Regards,
> >>> > Igor
> >>> >
> >>> >
> >>> > On Fri, Jan 17, 2020 at 9:37 AM Alex Plehanov <
> plehanov.a...@gmail.com
> >>> >
> >>> > wrote:
> >>> >
> >>> > > Looks like we didn't rich consensus here.
> >>> > >
> >>> > > Igor, as thin client maintainer, can you please share your opinion?
> >>> > >
> >>> > > Everyone else also welcome, please share your thoughts about
> options
> >>> to
> >>> > > implement operations for compute.
> >>> > >
> >>> > >
> >>> > > чт, 28 нояб. 2019 г. в 10:02, Alex Plehanov <
> plehanov.a...@gmail.com
> >>> >:
> >>> > >
> >>> > > > > Since all thin client operations are inherently async, we
> should
> >>> be
> >>> > > able
> >>> > > > to cancel any of them
> >>> > > > It's illogical to have such ability. What should do cancel
> >>> operation of
> >>> > > > cancel operation? Moreover, sometimes it's dangerous, for
> example,
> >>> > create
> >>> > > > cache operation should never be canceled. There should be an
> >>> explicit
> >>> > set
> >>> > > > of processes that we can cancel: queries, transactions, tasks,
> >>> > services.
> >>> > > > The lifecycle of services is more complex than the lifecycle of
> >>> tasks.
> >>> > > With
> >>> > > > services, I suppose, we can't use request cancelation, so tasks
> >>> will be
> >>> > > the
> >>> > > > only process with an exceptional pattern.
> >>> > > >
> >>> > > > > The request would be "execute task with specified node filter"
> -
> >>> > simple
> >>> > > > and efficient.
> >>> > > > It's not simple: every compute or service request should contain
> >>> > complex
> >>> > > > node filtering logic, which duplicates the same logic for cluster
> >>> API.
> >>> > > > It's not efficient: for example, we can't implement
> forPredicate()
> >>> > > > filtering in this case.
> >>> > > >
> >>> > > >
> >>> > > > ср, 27 нояб. 2019 г. в 19:25, Pavel Tupitsyn <
> ptupit...@apache.org
> >>> >:
> >>> > > >
> >>> > > >> >  The request is already processed (task is started), we can't
> >>> cancel
> >>> > > the
> >>> > > >> request
> >>> > > >> The request is not "start a task". It is "execute task" (and get
> >>> > > result).
> >>> > > >> Same as "cache get" - you get a result in the end, we don't
> "start
> >>> > cache
> >>> > > >> get" then "end cache get".
> >>> > > >>
> >>> > > >> Since all thin client operations are inherently async, we should
> >>> be
> >>> > able
> >>> > > >> to
> >>> > > >> cancel any of them
> >>> > > >> by sending another request with an id of prior request to be
> >>> > cancelled.
> >>> > > >> That's why I'm advocating for this approach - it will work for
> >>> > anything,
> >>> > > >> no
> >>> > > >> special cases.
> >>> > > >> And it keeps "happy path" as simple as it is right now.
> >>> > > >>
> >>> > > >> Queries are different because we retrieve results in pages, we
> >>> can't
> >>> > do
> >>> > > >> them as one request.
> >>> > > >> Transactions are also different because client controls when
> they
> >>> > should
> >>> > > >> end.
> >>> > > >> There is no reason for task execution to be a special case like
> >>> > queries
> >>> > > or
> >>> > > >> transactions.
> >>> > > >>
> >>> > > >> >  we always need to send 2 requests to server to execute the
> task
> >>> > > >> Nope. We don't need to get nodes on client at all.
> >>> > > >> The request would be "execute task with specified node filter" -
> >>> > simple
> >>> > > >> and
> >>> > > >> efficient.
> >>> > > >>
> >>> > > >>
> >>> > > >> On Wed, Nov 27, 2019 at 4:31 PM Alex Plehanov <
> >>> > plehanov.a...@gmail.com>
> >>> > > >> wrote:
> >>> > > >>
> >>> > > >> > >  We do cancel a request to perform a task. We may and should
> >>> use
> >>> > > this
> >>> > > >> to
> >>> > > >> > cancel any other request in future.
> >>> > > >> > The request is already processed (task is started), we can't
> >>> cancel
> >>> > > the
> >>> > > >> > request. As you mentioned before, we already do almost the
> same
> >>> for
> >>> > > >> queries
> >>> > > >> > (close the cursor, but not cancel the request to run a query),
> >>> it's
> >>> > > >> better
> >>> > > >> > to do such things in a common way. We have a pattern: start
> some
> >>> > > process
> >>> > > >> > (query, transaction), get id of this process, end process by
> >>> this
> >>> > id.
> >>> > > >> The
> >>> > > >> > "Execute task" process should match the same pattern. In my
> >>> opinion,
> >>> > > >> > implementation with two-way requests is the best option to
> match
> >>> > this
> >>> > > >> > pattern (we can even reuse OP_RESOURCE_CLOSE operation type in
> >>> this
> >>> > > >> case).
> >>> > > >> > Sometime in the future, we will need two-way requests for some
> >>> other
> >>> > > >> > functionality (continuous queries, event listening, etc). But
> >>> even
> >>> > > >> without
> >>> > > >> > two-way requests introducing some process id (task id in our
> >>> case)
> >>> > > will
> >>> > > >> be
> >>> > > >> > closer to existing pattern than canceling tasks by request id.
> >>> > > >> >
> >>> > > >> > > So every new request will apply those filters on server
> side,
> >>> > using
> >>> > > >> the
> >>> > > >> > most recent set of nodes.
> >>> > > >> > In this case, we always need to send 2 requests to server to
> >>> execute
> >>> > > the
> >>> > > >> > task. First - to get nodes by the filter, second - to actually
> >>> > execute
> >>> > > >> the
> >>> > > >> > task. It seems like overhead. The same will be for services.
> >>> Cluster
> >>> > > >> group
> >>> > > >> > remains the same if the topology hasn't changed. We can use
> this
> >>> > fact
> >>> > > >> and
> >>> > > >> > bind "execute task" request to topology. If topology has
> >>> changed -
> >>> > get
> >>> > > >> > nodes for new topology and retry request.
> >>> > > >> >
> >>> > > >> > вт, 26 нояб. 2019 г. в 17:44, Pavel Tupitsyn <
> >>> ptupit...@apache.org
> >>> > >:
> >>> > > >> >
> >>> > > >> > > >  After all, we don't cancel request
> >>> > > >> > > We do cancel a request to perform a task. We may and should
> >>> use
> >>> > this
> >>> > > >> to
> >>> > > >> > > cancel any other request in future.
> >>> > > >> > >
> >>> > > >> > > > Client uses some cluster group filtration (for example
> >>> > > forServers()
> >>> > > >> > > cluster group)
> >>> > > >> > > Please see above - Aleksandr Shapkin described how we store
> >>> > > >> > > filtered cluster groups on client.
> >>> > > >> > > We don't store node IDs, we store actual filters. So every
> new
> >>> > > request
> >>> > > >> > will
> >>> > > >> > > apply those filters on server side,
> >>> > > >> > > using the most recent set of nodes.
> >>> > > >> > >
> >>> > > >> > > var myGrp = cluster.forServers().forAttribute("foo"); //
> This
> >>> does
> >>> > > not
> >>> > > >> > > issue any server requests, just builds an object with
> filters
> >>> on
> >>> > > >> client
> >>> > > >> > > while (true) myGrp.compute().executeTask("bar"); // Every
> >>> request
> >>> > > >> > includes
> >>> > > >> > > filters, and filters are applied on the server side
> >>> > > >> > >
> >>> > > >> > > On Tue, Nov 26, 2019 at 1:42 PM Alex Plehanov <
> >>> > > >> plehanov.a...@gmail.com>
> >>> > > >> > > wrote:
> >>> > > >> > >
> >>> > > >> > > > > Anyway, my point stands.
> >>> > > >> > > > I can't agree. Why you don't want to use task id for this?
> >>> After
> >>> > > >> all,
> >>> > > >> > we
> >>> > > >> > > > don't cancel request (request is already processed), we
> >>> cancel
> >>> > the
> >>> > > >> > task.
> >>> > > >> > > So
> >>> > > >> > > > it's more convenient to use task id here.
> >>> > > >> > > >
> >>> > > >> > > > > Can you please provide equivalent use case with existing
> >>> > "thick"
> >>> > > >> > > client?
> >>> > > >> > > > For example:
> >>> > > >> > > > Cluster consists of one server node.
> >>> > > >> > > > Client uses some cluster group filtration (for example
> >>> > > forServers()
> >>> > > >> > > cluster
> >>> > > >> > > > group).
> >>> > > >> > > > Client starts to send periodically (for example 1 per
> >>> minute)
> >>> > > >> long-term
> >>> > > >> > > > (for example 1 hour long) tasks to the cluster.
> >>> > > >> > > > Meanwhile, several server nodes joined the cluster.
> >>> > > >> > > >
> >>> > > >> > > > In case of thick client: All server nodes will be used,
> >>> tasks
> >>> > will
> >>> > > >> be
> >>> > > >> > > load
> >>> > > >> > > > balanced.
> >>> > > >> > > > In case of thin client: Only one server node will be used,
> >>> > client
> >>> > > >> will
> >>> > > >> > > > detect topology change after an hour.
> >>> > > >> > > >
> >>> > > >> > > >
> >>> > > >> > > > вт, 26 нояб. 2019 г. в 11:50, Pavel Tupitsyn <
> >>> > > ptupit...@apache.org
> >>> > > >> >:
> >>> > > >> > > >
> >>> > > >> > > > > >  I can't see any usage of request id in query cursors
> >>> > > >> > > > > You are right, cursor id is a separate thing.
> >>> > > >> > > > > Anyway, my point stands.
> >>> > > >> > > > >
> >>> > > >> > > > > > client sends long term tasks to nodes and wants to do
> it
> >>> > with
> >>> > > >> load
> >>> > > >> > > > > balancing
> >>> > > >> > > > > I still don't get it. Can you please provide equivalent
> >>> use
> >>> > case
> >>> > > >> with
> >>> > > >> > > > > existing "thick" client?
> >>> > > >> > > > >
> >>> > > >> > > > >
> >>> > > >> > > > > On Mon, Nov 25, 2019 at 11:59 PM Alex Plehanov <
> >>> > > >> > > plehanov.a...@gmail.com>
> >>> > > >> > > > > wrote:
> >>> > > >> > > > >
> >>> > > >> > > > > > > And it is fine to use request ID to identify compute
> >>> tasks
> >>> > > >> (as we
> >>> > > >> > > do
> >>> > > >> > > > > with
> >>> > > >> > > > > > query cursors).
> >>> > > >> > > > > > I can't see any usage of request id in query cursors.
> We
> >>> > send
> >>> > > >> query
> >>> > > >> > > > > request
> >>> > > >> > > > > > and get cursor id in response. After that, we only use
> >>> > cursor
> >>> > > id
> >>> > > >> > (to
> >>> > > >> > > > get
> >>> > > >> > > > > > next pages and to close the resource). Did I miss
> >>> something?
> >>> > > >> > > > > >
> >>> > > >> > > > > > > Looks like I'm missing something - how is topology
> >>> change
> >>> > > >> > relevant
> >>> > > >> > > to
> >>> > > >> > > > > > executing compute tasks from client?
> >>> > > >> > > > > > It's not relevant directly. But there are some cases
> >>> where
> >>> > it
> >>> > > >> will
> >>> > > >> > be
> >>> > > >> > > > > > helpful. For example, if client sends long term tasks
> to
> >>> > nodes
> >>> > > >> and
> >>> > > >> > > > wants
> >>> > > >> > > > > to
> >>> > > >> > > > > > do it with load balancing it will detect topology
> change
> >>> > only
> >>> > > >> after
> >>> > > >> > > > some
> >>> > > >> > > > > > time in the future with the first response, so load
> >>> > balancing
> >>> > > >> will
> >>> > > >> > no
> >>> > > >> > > > > work.
> >>> > > >> > > > > > Perhaps we can add optional "topology version" field
> to
> >>> the
> >>> > > >> > > > > > OP_COMPUTE_EXECUTE_TASK request to solve this problem.
> >>> > > >> > > > > >
> >>> > > >> > > > > >
> >>> > > >> > > > > > пн, 25 нояб. 2019 г. в 22:42, Pavel Tupitsyn <
> >>> > > >> ptupit...@apache.org
> >>> > > >> > >:
> >>> > > >> > > > > >
> >>> > > >> > > > > > > Alex,
> >>> > > >> > > > > > >
> >>> > > >> > > > > > > > we will mix entities from different layers
> >>> (transport
> >>> > > layer
> >>> > > >> and
> >>> > > >> > > > > request
> >>> > > >> > > > > > > body)
> >>> > > >> > > > > > > I would not call our message header (which includes
> >>> the
> >>> > id)
> >>> > > >> > > > "transport
> >>> > > >> > > > > > > layer".
> >>> > > >> > > > > > > TCP is our transport layer. And it is fine to use
> >>> request
> >>> > ID
> >>> > > >> to
> >>> > > >> > > > > identify
> >>> > > >> > > > > > > compute tasks (as we do with query cursors).
> >>> > > >> > > > > > >
> >>> > > >> > > > > > > > we still can't be sure that the task is
> successfully
> >>> > > started
> >>> > > >> > on a
> >>> > > >> > > > > > server
> >>> > > >> > > > > > > The request to start the task will fail and we'll
> get
> >>> a
> >>> > > >> response
> >>> > > >> > > > > > indicating
> >>> > > >> > > > > > > that right away
> >>> > > >> > > > > > >
> >>> > > >> > > > > > > > we won't ever know about topology change
> >>> > > >> > > > > > > Looks like I'm missing something - how is topology
> >>> change
> >>> > > >> > relevant
> >>> > > >> > > to
> >>> > > >> > > > > > > executing compute tasks from client?
> >>> > > >> > > > > > >
> >>> > > >> > > > > > > On Mon, Nov 25, 2019 at 10:17 PM Alex Plehanov <
> >>> > > >> > > > > plehanov.a...@gmail.com>
> >>> > > >> > > > > > > wrote:
> >>> > > >> > > > > > >
> >>> > > >> > > > > > > > Pavel, in this case, we will mix entities from
> >>> different
> >>> > > >> layers
> >>> > > >> > > > > > > (transport
> >>> > > >> > > > > > > > layer and request body), it's not very good. The
> >>> same
> >>> > > >> behavior
> >>> > > >> > we
> >>> > > >> > > > can
> >>> > > >> > > > > > > > achieve with generated on client-side task id, but
> >>> there
> >>> > > >> will
> >>> > > >> > be
> >>> > > >> > > no
> >>> > > >> > > > > > > > inter-layer data intersection and I think it will
> be
> >>> > > easier
> >>> > > >> to
> >>> > > >> > > > > > implement
> >>> > > >> > > > > > > on
> >>> > > >> > > > > > > > both client and server-side. But we still can't be
> >>> sure
> >>> > > that
> >>> > > >> > the
> >>> > > >> > > > task
> >>> > > >> > > > > > is
> >>> > > >> > > > > > > > successfully started on a server. We won't ever
> know
> >>> > about
> >>> > > >> > > topology
> >>> > > >> > > > > > > change,
> >>> > > >> > > > > > > > because topology changed flag will be sent from
> >>> server
> >>> > to
> >>> > > >> > client
> >>> > > >> > > > only
> >>> > > >> > > > > > > with
> >>> > > >> > > > > > > > a response when the task will be completed. Are we
> >>> > accept
> >>> > > >> that?
> >>> > > >> > > > > > > >
> >>> > > >> > > > > > > > пн, 25 нояб. 2019 г. в 19:07, Pavel Tupitsyn <
> >>> > > >> > > ptupit...@apache.org
> >>> > > >> > > > >:
> >>> > > >> > > > > > > >
> >>> > > >> > > > > > > > > Alex,
> >>> > > >> > > > > > > > >
> >>> > > >> > > > > > > > > I have a simpler idea. We already do request id
> >>> > handling
> >>> > > >> in
> >>> > > >> > the
> >>> > > >> > > > > > > protocol,
> >>> > > >> > > > > > > > > so:
> >>> > > >> > > > > > > > > - Client sends a normal request to execute
> compute
> >>> > task.
> >>> > > >> > > Request
> >>> > > >> > > > ID
> >>> > > >> > > > > > is
> >>> > > >> > > > > > > > > generated as usual.
> >>> > > >> > > > > > > > > - As soon as task is completed, a response is
> >>> > received.
> >>> > > >> > > > > > > > >
> >>> > > >> > > > > > > > > As for cancellation - client can send a new
> >>> request
> >>> > > (with
> >>> > > >> new
> >>> > > >> > > > > request
> >>> > > >> > > > > > > ID)
> >>> > > >> > > > > > > > > and (in the body) pass the request ID from above
> >>> > > >> > > > > > > > > as a task identifier. As a result, there are two
> >>> > > >> responses:
> >>> > > >> > > > > > > > > - Cancellation response
> >>> > > >> > > > > > > > > - Task response (with proper cancelled status)
> >>> > > >> > > > > > > > >
> >>> > > >> > > > > > > > > That's it, no need to modify the core of the
> >>> protocol.
> >>> > > One
> >>> > > >> > > > request
> >>> > > >> > > > > -
> >>> > > >> > > > > > > one
> >>> > > >> > > > > > > > > response.
> >>> > > >> > > > > > > > >
> >>> > > >> > > > > > > > > On Mon, Nov 25, 2019 at 6:20 PM Alex Plehanov <
> >>> > > >> > > > > > plehanov.a...@gmail.com
> >>> > > >> > > > > > > >
> >>> > > >> > > > > > > > > wrote:
> >>> > > >> > > > > > > > >
> >>> > > >> > > > > > > > > > Pavel, we need to inform the client when the
> >>> task is
> >>> > > >> > > completed,
> >>> > > >> > > > > we
> >>> > > >> > > > > > > need
> >>> > > >> > > > > > > > > the
> >>> > > >> > > > > > > > > > ability to cancel the task. I see several ways
> >>> to
> >>> > > >> implement
> >>> > > >> > > > this:
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > > > 1. Сlient sends a request to the server to
> >>> start a
> >>> > > task,
> >>> > > >> > > server
> >>> > > >> > > > > > > return
> >>> > > >> > > > > > > > > task
> >>> > > >> > > > > > > > > > id in response. Server notifies client when
> >>> task is
> >>> > > >> > completed
> >>> > > >> > > > > with
> >>> > > >> > > > > > a
> >>> > > >> > > > > > > > new
> >>> > > >> > > > > > > > > > request (from server to client). Client can
> >>> cancel
> >>> > the
> >>> > > >> task
> >>> > > >> > > by
> >>> > > >> > > > > > > sending
> >>> > > >> > > > > > > > a
> >>> > > >> > > > > > > > > > new request with operation type "cancel" and
> >>> task
> >>> > id.
> >>> > > In
> >>> > > >> > this
> >>> > > >> > > > > case,
> >>> > > >> > > > > > > we
> >>> > > >> > > > > > > > > > should implement 2-ways requests.
> >>> > > >> > > > > > > > > > 2. Client generates unique task id and sends a
> >>> > request
> >>> > > >> to
> >>> > > >> > the
> >>> > > >> > > > > > server
> >>> > > >> > > > > > > to
> >>> > > >> > > > > > > > > > start a task, server don't reply immediately
> but
> >>> > wait
> >>> > > >> until
> >>> > > >> > > > task
> >>> > > >> > > > > is
> >>> > > >> > > > > > > > > > completed. Client can cancel task by sending
> new
> >>> > > request
> >>> > > >> > with
> >>> > > >> > > > > > > operation
> >>> > > >> > > > > > > > > > type "cancel" and task id. In this case, we
> >>> should
> >>> > > >> decouple
> >>> > > >> > > > > request
> >>> > > >> > > > > > > and
> >>> > > >> > > > > > > > > > response on the server-side (currently
> response
> >>> is
> >>> > > sent
> >>> > > >> > right
> >>> > > >> > > > > after
> >>> > > >> > > > > > > > > request
> >>> > > >> > > > > > > > > > was processed). Also, we can't be sure that
> >>> task is
> >>> > > >> > > > successfully
> >>> > > >> > > > > > > > started
> >>> > > >> > > > > > > > > on
> >>> > > >> > > > > > > > > > a server.
> >>> > > >> > > > > > > > > > 3. Client sends a request to the server to
> >>> start a
> >>> > > task,
> >>> > > >> > > server
> >>> > > >> > > > > > > return
> >>> > > >> > > > > > > > id
> >>> > > >> > > > > > > > > > in response. Client periodically asks the
> server
> >>> > about
> >>> > > >> task
> >>> > > >> > > > > status.
> >>> > > >> > > > > > > > > Client
> >>> > > >> > > > > > > > > > can cancel the task by sending new request
> with
> >>> > > >> operation
> >>> > > >> > > type
> >>> > > >> > > > > > > "cancel"
> >>> > > >> > > > > > > > > and
> >>> > > >> > > > > > > > > > task id. This case brings some overhead to the
> >>> > > >> > communication
> >>> > > >> > > > > > channel.
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > > > Personally, I think that the case with 2-ways
> >>> > requests
> >>> > > >> is
> >>> > > >> > > > better,
> >>> > > >> > > > > > but
> >>> > > >> > > > > > > > I'm
> >>> > > >> > > > > > > > > > open to any other ideas.
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > > > Aleksandr,
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > > > Filtering logic for
> >>> OP_CLUSTER_GROUP_GET_NODE_IDS
> >>> > > looks
> >>> > > >> > > > > > > > overcomplicated.
> >>> > > >> > > > > > > > > Do
> >>> > > >> > > > > > > > > > we need server-side filtering at all? Wouldn't
> >>> it be
> >>> > > >> better
> >>> > > >> > > to
> >>> > > >> > > > > send
> >>> > > >> > > > > > > > basic
> >>> > > >> > > > > > > > > > info (ids, order, flags) for all nodes (there
> is
> >>> > > >> relatively
> >>> > > >> > > > small
> >>> > > >> > > > > > > > amount
> >>> > > >> > > > > > > > > of
> >>> > > >> > > > > > > > > > data) and extended info (attributes) for
> >>> selected
> >>> > list
> >>> > > >> of
> >>> > > >> > > > nodes?
> >>> > > >> > > > > In
> >>> > > >> > > > > > > > this
> >>> > > >> > > > > > > > > > case, we can do basic node filtration on
> >>> client-side
> >>> > > >> > > > > (forClients(),
> >>> > > >> > > > > > > > > > forServers(), forNodeIds(), forOthers(), etc).
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > > > Do you use standard ClusterNode serialization?
> >>> There
> >>> > > are
> >>> > > >> > also
> >>> > > >> > > > > > metrics
> >>> > > >> > > > > > > > > > serialized with ClusterNode, do we need it on
> >>> thin
> >>> > > >> client?
> >>> > > >> > > > There
> >>> > > >> > > > > > are
> >>> > > >> > > > > > > > > other
> >>> > > >> > > > > > > > > > interfaces exist to show metrics, I think it's
> >>> > > >> redundant to
> >>> > > >> > > > > export
> >>> > > >> > > > > > > > > metrics
> >>> > > >> > > > > > > > > > to thin clients too.
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > > > What do you think?
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > > > пт, 22 нояб. 2019 г. в 20:15, Aleksandr
> Shapkin
> >>> <
> >>> > > >> > > > > lexw...@gmail.com
> >>> > > >> > > > > > >:
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > > > > Alex,
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > I think you can create a new IEP page and I
> >>> will
> >>> > > fill
> >>> > > >> it
> >>> > > >> > > with
> >>> > > >> > > > > the
> >>> > > >> > > > > > > > > Cluster
> >>> > > >> > > > > > > > > > > API details.
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > In short, I’ve introduced several new codes:
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > Cluster API is pretty straightforward:
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > OP_CLUSTER_IS_ACTIVE = 5000
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > OP_CLUSTER_CHANGE_STATE = 5001
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > OP_CLUSTER_CHANGE_WAL_STATE = 5002
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > OP_CLUSTER_GET_WAL_STATE = 5003
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > Cluster group codes:
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > OP_CLUSTER_GROUP_GET_NODE_IDS = 5100
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > OP_CLUSTER_GROUP_GET_NODE_INFO = 5101
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > The underlying implementation is based on
> the
> >>> > thick
> >>> > > >> > client
> >>> > > >> > > > > logic.
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > For every request, we provide a known
> topology
> >>> > > version
> >>> > > >> > and
> >>> > > >> > > if
> >>> > > >> > > > > it
> >>> > > >> > > > > > > has
> >>> > > >> > > > > > > > > > > changed,
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > a client updates it firstly and then
> re-sends
> >>> the
> >>> > > >> > filtering
> >>> > > >> > > > > > > request.
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > Alongside the topVer a client sends a
> >>> serialized
> >>> > > nodes
> >>> > > >> > > > > projection
> >>> > > >> > > > > > > > > object
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > that could be considered as a code to value
> >>> > mapping.
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > Consider: [{Code = 1, Value= [“DotNet”,
> >>> > > >> “MyAttribute”},
> >>> > > >> > > > > {Code=2,
> >>> > > >> > > > > > > > > > Value=1}]
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > Where “1” stands for Attribute filtering and
> >>> “2” –
> >>> > > >> > > > > > serverNodesOnly
> >>> > > >> > > > > > > > > flag.
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > As a result of request processing, a server
> >>> sends
> >>> > > >> nodeId
> >>> > > >> > > > UUIDs
> >>> > > >> > > > > > and
> >>> > > >> > > > > > > a
> >>> > > >> > > > > > > > > > > current topVer.
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > When a client obtains nodeIds, it can
> perform
> >>> a
> >>> > > >> NODE_INFO
> >>> > > >> > > > call
> >>> > > >> > > > > to
> >>> > > >> > > > > > > > get a
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > serialized ClusterNode object. In addition
> >>> there
> >>> > > >> should
> >>> > > >> > be
> >>> > > >> > > a
> >>> > > >> > > > > > > > different
> >>> > > >> > > > > > > > > > API
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > method for accessing/updating node metrics.
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > чт, 21 нояб. 2019 г. в 12:32, Sergey Kozlov
> <
> >>> > > >> > > > > > skoz...@gridgain.com
> >>> > > >> > > > > > > >:
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > Hi Pavel
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > On Thu, Nov 21, 2019 at 11:30 AM Pavel
> >>> Tupitsyn
> >>> > <
> >>> > > >> > > > > > > > > ptupit...@apache.org>
> >>> > > >> > > > > > > > > > > > wrote:
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > 1. I believe that Cluster operations for
> >>> Thin
> >>> > > >> Client
> >>> > > >> > > > > protocol
> >>> > > >> > > > > > > are
> >>> > > >> > > > > > > > > > > already
> >>> > > >> > > > > > > > > > > > > in the works
> >>> > > >> > > > > > > > > > > > > by Alexandr Shapkin. Can't find the
> ticket
> >>> > > though.
> >>> > > >> > > > > > > > > > > > > Alexandr, can you please confirm and
> >>> attach
> >>> > the
> >>> > > >> > ticket
> >>> > > >> > > > > > number?
> >>> > > >> > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > 2. Proposed changes will work only for
> >>> Java
> >>> > > tasks
> >>> > > >> > that
> >>> > > >> > > > are
> >>> > > >> > > > > > > > already
> >>> > > >> > > > > > > > > > > > deployed
> >>> > > >> > > > > > > > > > > > > on server nodes.
> >>> > > >> > > > > > > > > > > > > This is mostly useless for other thin
> >>> clients
> >>> > we
> >>> > > >> have
> >>> > > >> > > > > > (Python,
> >>> > > >> > > > > > > > PHP,
> >>> > > >> > > > > > > > > > > .NET,
> >>> > > >> > > > > > > > > > > > > C++).
> >>> > > >> > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > I don't guess so. The task (execution) is
> a
> >>> way
> >>> > to
> >>> > > >> > > > implement
> >>> > > >> > > > > > own
> >>> > > >> > > > > > > > > layer
> >>> > > >> > > > > > > > > > > for
> >>> > > >> > > > > > > > > > > > the thin client application.
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > We should think of a way to make this
> >>> useful
> >>> > for
> >>> > > >> all
> >>> > > >> > > > > clients.
> >>> > > >> > > > > > > > > > > > > For example, we may allow sending tasks
> in
> >>> > some
> >>> > > >> > > scripting
> >>> > > >> > > > > > > > language
> >>> > > >> > > > > > > > > > like
> >>> > > >> > > > > > > > > > > > > Javascript.
> >>> > > >> > > > > > > > > > > > > Thoughts?
> >>> > > >> > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > The arbitrary code execution from a remote
> >>> > client
> >>> > > >> must
> >>> > > >> > be
> >>> > > >> > > > > > > protected
> >>> > > >> > > > > > > > > > > > from malicious code.
> >>> > > >> > > > > > > > > > > > I don't know how it could be designed but
> >>> > without
> >>> > > >> that
> >>> > > >> > we
> >>> > > >> > > > > open
> >>> > > >> > > > > > > the
> >>> > > >> > > > > > > > > hole
> >>> > > >> > > > > > > > > > > to
> >>> > > >> > > > > > > > > > > > kill cluster.
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > On Thu, Nov 21, 2019 at 11:21 AM Sergey
> >>> > Kozlov <
> >>> > > >> > > > > > > > > skoz...@gridgain.com
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > wrote:
> >>> > > >> > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > > Hi Alex
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > > The idea is great. But I have some
> >>> concerns
> >>> > > that
> >>> > > >> > > > probably
> >>> > > >> > > > > > > > should
> >>> > > >> > > > > > > > > be
> >>> > > >> > > > > > > > > > > > taken
> >>> > > >> > > > > > > > > > > > > > into account for design:
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > >    1. We need to have the ability to
> >>> stop a
> >>> > > task
> >>> > > >> > > > > execution,
> >>> > > >> > > > > > > > smth
> >>> > > >> > > > > > > > > > like
> >>> > > >> > > > > > > > > > > > > >    OP_COMPUTE_CANCEL_TASK  operation
> >>> (client
> >>> > > to
> >>> > > >> > > server)
> >>> > > >> > > > > > > > > > > > > >    2. What's about task execution
> >>> timeout?
> >>> > It
> >>> > > >> may
> >>> > > >> > > help
> >>> > > >> > > > to
> >>> > > >> > > > > > the
> >>> > > >> > > > > > > > > > cluster
> >>> > > >> > > > > > > > > > > > > >    survival for buggy tasks
> >>> > > >> > > > > > > > > > > > > >    3. Ignite doesn't have
> >>> > roles/authorization
> >>> > > >> > > > > functionality
> >>> > > >> > > > > > > for
> >>> > > >> > > > > > > > > > now.
> >>> > > >> > > > > > > > > > > > But
> >>> > > >> > > > > > > > > > > > > a
> >>> > > >> > > > > > > > > > > > > >    task is the risky operation for
> >>> cluster
> >>> > > (for
> >>> > > >> > > > security
> >>> > > >> > > > > > > > > reasons).
> >>> > > >> > > > > > > > > > > > Could
> >>> > > >> > > > > > > > > > > > > we
> >>> > > >> > > > > > > > > > > > > >    add for Ignite configuration new
> >>> options:
> >>> > > >> > > > > > > > > > > > > >       - Explicit turning on for
> compute
> >>> task
> >>> > > >> > support
> >>> > > >> > > > for
> >>> > > >> > > > > > thin
> >>> > > >> > > > > > > > > > > protocol
> >>> > > >> > > > > > > > > > > > > >       (disabled by default) for whole
> >>> > cluster
> >>> > > >> > > > > > > > > > > > > >       - Explicit turning on for
> compute
> >>> task
> >>> > > >> > support
> >>> > > >> > > > for
> >>> > > >> > > > > a
> >>> > > >> > > > > > > node
> >>> > > >> > > > > > > > > > > > > >       - The list of task names
> (classes)
> >>> > > >> allowed to
> >>> > > >> > > > > execute
> >>> > > >> > > > > > > by
> >>> > > >> > > > > > > > > thin
> >>> > > >> > > > > > > > > > > > > client.
> >>> > > >> > > > > > > > > > > > > >    4. Support the labeling for task
> >>> that may
> >>> > > >> help
> >>> > > >> > to
> >>> > > >> > > > > > > > investigate
> >>> > > >> > > > > > > > > > > issues
> >>> > > >> > > > > > > > > > > > > on
> >>> > > >> > > > > > > > > > > > > >    cluster (the idea from IEP-34 [1])
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > > 1.
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > >
> >>> > > >> > > > > > > >
> >>> > > >> > > > > > >
> >>> > > >> > > > > >
> >>> > > >> > > > >
> >>> > > >> > > >
> >>> > > >> > >
> >>> > > >> >
> >>> > > >>
> >>> > >
> >>> >
> >>>
> https://cwiki.apache.org/confluence/display/IGNITE/IEP-34+Thin+client%3A+transactions+support
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > > On Thu, Nov 21, 2019 at 10:58 AM Alex
> >>> > > Plehanov <
> >>> > > >> > > > > > > > > > > > plehanov.a...@gmail.com>
> >>> > > >> > > > > > > > > > > > > > wrote:
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > > > 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<Object> executeAsync(String
> >>> task,
> >>> > > >> Object
> >>> > > >> > > arg)
> >>> > > >> > > > > > > > > > > > > > > Object affinityExecute(String task,
> >>> String
> >>> > > >> cache,
> >>> > > >> > > > > Object
> >>> > > >> > > > > > > key,
> >>> > > >> > > > > > > > > > > Object
> >>> > > >> > > > > > > > > > > > > arg)
> >>> > > >> > > > > > > > > > > > > > > Future<Object>
> >>> 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?
> >>> > > >> > > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > > > --
> >>> > > >> > > > > > > > > > > > > > Sergey Kozlov
> >>> > > >> > > > > > > > > > > > > > GridGain Systems
> >>> > > >> > > > > > > > > > > > > > www.gridgain.com
> >>> > > >> > > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > > > --
> >>> > > >> > > > > > > > > > > > Sergey Kozlov
> >>> > > >> > > > > > > > > > > > GridGain Systems
> >>> > > >> > > > > > > > > > > > www.gridgain.com
> >>> > > >> > > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > > > --
> >>> > > >> > > > > > > > > > > Alex.
> >>> > > >> > > > > > > > > > >
> >>> > > >> > > > > > > > > >
> >>> > > >> > > > > > > > >
> >>> > > >> > > > > > > >
> >>> > > >> > > > > > >
> >>> > > >> > > > > >
> >>> > > >> > > > >
> >>> > > >> > > >
> >>> > > >> > >
> >>> > > >> >
> >>> > > >>
> >>> > > >
> >>> > >
> >>> >
> >>>
> >>
>

Reply via email to