Pavel, thanks for the review. I've fixed your comments.

вт, 31 мар. 2020 г. в 13:47, Pavel Tupitsyn <ptupit...@apache.org>:

> Alex, I did a partial review - mostly server-side code. Please see my
> comments on GitHub.
> We will need more eyes on this, especially on Java client side.
>
> Feature masks are a great addition!
>
> On Tue, Mar 31, 2020 at 1:05 PM Alex Plehanov <plehanov.a...@gmail.com>
> wrote:
>
> > Also, I've updated IEP regarding features masks (new backward
> compatibility
> > mechanism for thin clients) which was discussed earlier in this thread.
> >
> > вт, 31 мар. 2020 г. в 02:42, Alex Plehanov <plehanov.a...@gmail.com>:
> >
> > > Guys,
> > >
> > > I've finished IEP implementation for server-side and java thin client
> > side
> > > (ticket: [1], PR: [2]). Can you please review the patch?
> > >
> > > [1]: https://issues.apache.org/jira/browse/IGNITE-12835
> > > [2]: https://github.com/apache/ignite/pull/7572
> > >
> > > пт, 27 мар. 2020 г. в 19:11, Pavel Tupitsyn <ptupit...@apache.org>:
> > >
> > >> Agree with Igor, let's set deployment aside for now, it is out of
> scope
> > of
> > >> this IEP.
> > >>
> > >>
> > >>
> > >> On Fri, Mar 27, 2020 at 6:52 PM Igor Sapego <isap...@apache.org>
> wrote:
> > >>
> > >> > Hi guys,
> > >> >
> > >> > I like the proposal in general.
> > >> >
> > >> > Now for the task deployment - I think we should have separate API
> > >> > for it (and separate IEP I believe). Also, I'm not sure that this
> API
> > >> > should be a part of the API of any thin client as it seems weird to
> me
> > >> > to use Python client to deploy Java tasks. Control.sh or visor
> > proposal
> > >> > sounds much better.
> > >> >
> > >> > Best Regards,
> > >> > Igor
> > >> >
> > >> >
> > >> > On Thu, Mar 26, 2020 at 10:56 PM Denis Magda <dma...@apache.org>
> > wrote:
> > >> >
> > >> > > >
> > >> > > > Deployment API definitely needed as one of the next steps.
> > >> Currently,
> > >> > we
> > >> > > > are talking only about the first step (execution of already
> > deployed
> > >> > > > tasks).
> > >> > > > Also, I'm not sure about automatic redeploy and
> peer-class-loading
> > >> for
> > >> > > thin
> > >> > > > clients, I think it's better to have more control here and
> provide
> > >> API
> > >> > to
> > >> > > > explicitly deploy classes or jar files. WDYT?
> > >> > >
> > >> > >
> > >> > > Alex, agree that automatic redeployment is better suited for the
> > >> > management
> > >> > > APIs. How about adding this capability to our command-line tool
> > >> > > (control.sh, or visor cmd, or one new holistic tool).
> > >> > >
> > >> > > -
> > >> > > Denis
> > >> > >
> > >> > >
> > >> > > On Wed, Mar 25, 2020 at 1:04 PM Alex Plehanov <
> > >> plehanov.a...@gmail.com>
> > >> > > wrote:
> > >> > >
> > >> > > > Pavel,
> > >> > > >
> > >> > > > 1. Actually it can be solved on the client-side (and already
> > solved
> > >> in
> > >> > > PoC
> > >> > > > implementation). But I agreed it brings extra complexity for
> > >> > client-side
> > >> > > > implementation, will try to provide such guarantees on the
> > >> server-side.
> > >> > > > 2. ComputeTask has also "reduce" step which is executed on the
> > >> > initiator
> > >> > > > node. Binary-rest client implementation, for example, has such
> > >> affinity
> > >> > > > methods (to execute the task by name). I'm ok with removing it.
> At
> > >> > least
> > >> > > if
> > >> > > > someone will need it we can implement it again at any time in
> the
> > >> > future
> > >> > > > without protocol change.
> > >> > > > I've fixed IEP.
> > >> > > >
> > >> > > > Denis,
> > >> > > >
> > >> > > > Deployment API definitely needed as one of the next steps.
> > >> Currently,
> > >> > we
> > >> > > > are talking only about the first step (execution of already
> > deployed
> > >> > > > tasks).
> > >> > > > Also, I'm not sure about automatic redeploy and
> peer-class-loading
> > >> for
> > >> > > thin
> > >> > > > clients, I think it's better to have more control here and
> provide
> > >> API
> > >> > to
> > >> > > > explicitly deploy classes or jar files. WDYT?
> > >> > > >
> > >> > > > ср, 25 мар. 2020 г. в 21:17, Denis Magda <dma...@apache.org>:
> > >> > > >
> > >> > > > > 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