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. > >> > > > > > >>> > > >> > > > > > > > > > > > >> > > > > > >>> > > >> > > > > > > > > > > >> > > > > > >>> > > >> > > > > > > > > > >> > > > > > >>> > > >> > > > > > > > > >> > > > > > >>> > > >> > > > > > > > >> > > > > > >>> > > >> > > > > > > >> > > > > > >>> > > >> > > > > > >> > > > > > >>> > > >> > > > > >> > > > > > >>> > > >> > > > >> > > > > > >>> > > >> > > >> > > > > > >>> > > >> > >> > > > > > >>> > > > > >> > > > > > >>> > > > >> > > > > > >>> > > >> > > > > > >>> > >> > > > > > >> > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > > >