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