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