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