Hi guys, > If we already agreed to deprecate the service() method, then I'm ok with the change
As I can see in the previous discussion that Vladimir mentioned [1], there was a proposal for deprecating by Vladimir and Denis Mekhanikov, but there wasn't a final decision. So I tried to see the `#service()` from a different angle and tried to be a user's advocate. But I found only a few weak arguments for remaining this functionality, and also nobody supported them :) So, if there are no objections let's finally deprecate it. > But I think we should do both fixes together and also clearly document that using service() can lead to incorrect metrics Did I correctly understand that: we need to revert the previous patch, update it with the deprecation, and submit it again to master? On Sun, Jan 23, 2022 at 3:51 AM Valentin Kulichenko < valentin.kuliche...@gmail.com> wrote: > If we already agreed to deprecate the service() method, then I'm ok with > the change. But I think we should do both fixes together and also clearly > document that using service() can lead to incorrect metrics. > > -Val > > On Fri, Jan 21, 2022 at 1:13 AM Vladimir Steshin <vlads...@gmail.com> > wrote: > > > Valentin, there are 2 notable issues: > > > > 1) Variate behavior of `/serviceProxy()/` depending on user setting. It > > can return both proxy and reference. > > > > 2) Service metrics are corrupted by invocations through `/service()/`. > > > > > > How we can fix: > > > > 1) Just return proxy every time. > > > > 2) Deprecate `/service()/`. We've already discussed that here: [1]. > > Please see my previous message in the thread. > > > > > > > > [1] https://www.mail-archive.com/dev@ignite.apache.org/msg44062.html > > > > > > On 20.01.2022 22:48, Valentin Kulichenko wrote: > > > So the proposed change will not actually fix the issue with metrics, > > > because it's still possible to get a local instance via the service() > > > method. At the same time, the change removes an existing performance > > > optimization. > > > > > > Let's figure out how to fix the actual problem. If the *only* way to > have > > > metrics is to have a proxy, then this should be the only way to > interact > > > with a service. In that case, we need to do something with the > service() > > > method (deprecate it?). Or probably there are other ways to fix > metrics? > > > > > > -Val > > > > > > On Thu, Jan 20, 2022 at 3:32 AM Vladimir Steshin<vlads...@gmail.com> > > wrote: > > > > > >> Yes. Invocations from direct reference are not measured. This > method > > >> in the javadoc: > > >> > > >> > > >> /* <b>NOTE:</b> Statistics are collected only with service proxies > > >> obtaining by methods like/ > > >> > > >> /* {@link IgniteServices#serviceProxy(String, Class, boolean)} and > won't > > >> work for direct reference of local/ > > >> > > >> /* services which you can get by, for example, {@link > > >> IgniteServices#service(String)}./ > > >> > > >> > > >> On 20.01.2022 00:20, Valentin Kulichenko wrote: > > >>> BTW, there is also the service() method that can only return an > > instance > > >>> and never returns a proxy. Does it corrupt the metrics as well? > > >>> > > >>> -Val > > >>> > > >>> On Wed, Jan 19, 2022 at 1:09 PM Valentin Kulichenko < > > >>> valentin.kuliche...@gmail.com> wrote: > > >>> > > >>>> Maxim, > > >>>> > > >>>> The reason I'm asking is that I don't really understand how client > > side > > >>>> mechanics affect server side metrics (number of executions and their > > >>>> durations). I feel that we might be fixing a wrong problem. > > >>>> > > >>>> Could you elaborate on why we count metrics incorrectly when > > >>>> the serviceProxy() returns an instance of a local service instead of > > an > > >>>> actual proxy? > > >>>> > > >>>> -Val > > >>>> > > >>>> On Tue, Jan 18, 2022 at 11:32 PM Maksim Timonin< > > timoninma...@apache.org > > >>>> wrote: > > >>>> > > >>>>> Hi, guys! > > >>>>> > > >>>>>> this is not a good idea to change the behavior of serviceProxy() > > >>>>> depending on statistics > > >>>>> > > >>>>> I think that the patch doesn't change the behavior of > > `serviceProxy()`. > > >>>>> This method promises a proxy and it actually returns it. The fact > > that > > >>>>> `serviceProxy()` can return non-proxy objects is an internal Ignite > > >>>>> optimization, and users should not rely on this, there is a > separate > > >>>>> method > > >>>>> `service()` for that. > > >>>>> > > >>>>>> What are the metrics that are being affected by this? > > >>>>> Only service metrics, that calculates duration of service > execution. > > >> Check > > >>>>> this ticket [1] > > >>>>> > > >>>>> [1]https://issues.apache.org/jira/browse/IGNITE-12464 > > >>>>> > > >>>>> > > >>>>> On Wed, Jan 19, 2022 at 1:22 AM Valentin Kulichenko < > > >>>>> valentin.kuliche...@gmail.com> wrote: > > >>>>> > > >>>>>> What are the metrics that are being affected by this? > > >>>>>> > > >>>>>> -Val > > >>>>>> > > >>>>>> On Tue, Jan 18, 2022 at 3:31 AM Вячеслав Коптилин < > > >>>>>> slava.kopti...@gmail.com> > > >>>>>> wrote: > > >>>>>> > > >>>>>>> Hello Igniters, > > >>>>>>> > > >>>>>>> IMHO, this is not a good idea to change the behavior of > > >> serviceProxy() > > >>>>>>> depending on statistics (enabled/disabled). It seems > > counterintuitive > > >>>>> to > > >>>>>>> me. > > >>>>>>> Perhaps, we need to introduce a new method that should always > > return > > >> a > > >>>>>>> proxy to the user service. > > >>>>>>> > > >>>>>>> Thanks, > > >>>>>>> Slava. > > >>>>>>> > > >>>>>>> > > >>>>>>> вт, 28 дек. 2021 г. в 13:57, Pavel Pereslegin<xxt...@gmail.com>: > > >>>>>>> > > >>>>>>>> Hi! > > >>>>>>>> > > >>>>>>>> Agree with Maxim. > > >>>>>>>> > > >>>>>>>> It seems to me quite normal to return a proxy for a local > instance > > >>>>> in > > >>>>>>>> the case when the user has explicitly enabled statistics > > collection > > >>>>> in > > >>>>>>>> the service settings. Those. by default, we do not change the > > >>>>> behavior > > >>>>>>>> and if the collection of metrics is not needed, a local instance > > >>>>> will > > >>>>>>>> be returned. And I also think the javadoc should be changed to > > >>>>> reflect > > >>>>>>>> the new behavior. > > >>>>>>>> > > >>>>>>>> So, I'm for 1 + 3. > > >>>>>>>> > > >>>>>>>> вт, 28 дек. 2021 г. в 10:51, Maksim Timonin < > > >>>>> timoninma...@apache.org>: > > >>>>>>>>> Hi! > > >>>>>>>>> > > >>>>>>>>> I agree that users shouldn't expect a non-proxy when invoking > the > > >>>>>>>>> `IgniteServices#serviceProxy()` method. I think it's up to > Ignite > > >>>>> to > > >>>>>>>> return > > >>>>>>>>> a non-proxy instance here as possible optimisation. But users > > >>>>> have to > > >>>>>>> use > > >>>>>>>>> interfaces in any case. There is the `IgniteServices#service()` > > >>>>>> method > > >>>>>>>> for > > >>>>>>>>> explicit return of local instances. > > >>>>>>>>> > > >>>>>>>>> With enabling of metrics we can break users that explicitly > > >>>>>>>>> use `#serviceProxy` (proxy!), and then explicitly cast it to an > > >>>>>>>>> implementation class. In this case such users will get a > runtime > > >>>>>>>> exception. > > >>>>>>>>> I think we can write a good javadoc for > > >>>>>>>>> `ServiceConfiguration#setEnableMetrics()`, it should mention > that > > >>>>> it > > >>>>>>>> works > > >>>>>>>>> only with proxy, and it doesn't collect metrics with non-proxy > > >>>>> usages > > >>>>>>>> with > > >>>>>>>>> `IgniteService#service()`. > > >>>>>>>>> > > >>>>>>>>> So, I propose to proceed with two solutions - 1 and 3: fix docs > > >>>>> for > > >>>>>>>>> `#serviceProxy()` and provide detailed javadocs > > >>>>>>>>> for `ServiceConfiguration#setEnableMetrics()`. > > >>>>>>>>> > > >>>>>>>>> If some users will enable metrics (even with such docs!) and > will > > >>>>> be > > >>>>>>>> using > > >>>>>>>>> casting proxy(!) to an implementation, then they will get a > > >>>>> runtime > > >>>>>>>>> exception. But I believe that it is an obvious failure, and it > > >>>>> should > > >>>>>>> be > > >>>>>>>>> fixed on the user side. > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> On Mon, Dec 27, 2021 at 10:26 PM Vladimir Steshin < > > >>>>>> vlads...@gmail.com> > > >>>>>>>>> wrote: > > >>>>>>>>> > > >>>>>>>>>> Hi, Igniters. > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> I'd like to suggest modifying > > >>>>> `/IgniteServices.serviceProxy(String > > >>>>>>>> name, > > >>>>>>>>>> Class<? super T> svcItf, boolean sticky)/` so that it may > return > > >>>>>>> proxy > > >>>>>>>>>> even for local service. Motivation: service metrics [1]. To > > >>>>> measure > > >>>>>>>>>> method call we need to wrap service somehow. Also, the method > > >>>>> name > > >>>>>>> says > > >>>>>>>>>> `proxy`. For local one we return direct instance. Misleading. > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> Solutions: > > >>>>>>>>>> > > >>>>>>>>>> 1) Let’s return a proxy (`/GridServiceProxy/`) once we need. > > >>>>> Let’s > > >>>>>>>>>> change the javadoc to say `@return Proxy over service’. Simply > > >>>>>> works. > > >>>>>>>>>> Pros: invocation like `/MyServiceImpl svc = > > >>>>>> serviceProxy(«myservice», > > >>>>>>>>>> MyService.class)`/ would fail. Wierd usage to me. But > possible. > > >>>>>>>>>> > > >>>>>>>>>> 2) Introduce a new method with forced-proxy flag > > >>>>>>>>>> like`IgniteSerives.serviceProxy(…, boolead focedProxy)`. And > > >>>>> add a > > >>>>>>>>>> warning to other service-obtain methods like: «`/You enabled > > >>>>>> service > > >>>>>>>>>> metrics but it doesn’t work for local service instanse. Use > > >>>>>>>> forced-proxy > > >>>>>>>>>> serviceProxy(…, boolean forcedProxy)/` Pros: we’ve already > have > > >>>>>> about > > >>>>>>>>>> 5-6 methods to get services in `/IgniteServices/`. I doubt we > > >>>>> need > > >>>>>>> one > > >>>>>>>>>> more. > > >>>>>>>>>> > > >>>>>>>>>> 3) Fix the documentation so that it tells the service metrics > > >>>>> would > > >>>>>>>> work > > >>>>>>>>>> only with proxy. Pros: service metrics just won’t work for > local > > >>>>>>>>>> services. Suddenly. > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> My vote is for #1: let's use a proxy. WDYT? > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> [1]https://issues.apache.org/jira/browse/IGNITE-12464 > > >>>>>>>>>> > > >>>>>>>>>> >