Not all functions are registered. I can invoke a function with Execution.execute(Function) from the client, the Function is serialized and executed on the server, the class need only exist on the server for deserialization. Must a function be registered now to get metrics?
> On Sep 17, 2019, at 8:44 AM, Aaron Lindsey <alind...@pivotal.io> wrote: > > Jake — We're not constructing a new object each time a function is invoked > because the "decorated" functions are only created when a function is > registered, but we'll keep your concern in mind. > > Thanks for all of the feedback from everyone. I think we have the > information we need to move forward. In summary, we'll have to change our > implementation such that the methods in FunctionService still return the > same objects they did before our changes. > > - Aaron > > > On Mon, Sep 16, 2019 at 7:54 PM Jacob Barrett <jbarr...@pivotal.io> wrote: > >> Sorry I am entering this late in the game but why do we need to decorate >> the function at all for metrics. The current implementation has statistics >> without decoration. All the concerns raised in this thread concern me as >> well as the cost of constructing yet another object every time a function >> is invoked by serialized function, Execution.execute(Function). Each >> allocation puts more pressure on the GC, decreases our throughput and >> increases our latency. >> >> -Jake >> >> >>> On Sep 11, 2019, at 2:29 PM, Dale Emery <dem...@pivotal.io> wrote: >>> >>> The stats use the ID of the function, and each TimingFunction reports >> the same ID as the function it wraps. So I think the stats would look like >> they always did. >>> >>> Dale >>> >>> — >>> Dale Emery >>> dem...@pivotal.io >>> >>> >>> >>>> On Sep 11, 2019, at 12:14 PM, Anthony Baker <aba...@pivotal.io> wrote: >>>> >>>> I think the Decorator approach you outlined could have other impacts as >> well. Would I still be able to see specific function executions in >> statistics or would they all become “TImingFunction”? >>>> >>>> Anthony >>>> >>>> >>>>> On Sep 11, 2019, at 12:00 PM, Aaron Lindsey <alind...@pivotal.io> >> wrote: >>>>> >>>>> Thanks for your response, Dan. >>>>> >>>>> The second scenario you mentioned (i.e. users calling >>>>> FunctionService.getFunction(String)) worries me because our PR changes >> the >>>>> FunctionService so they would now get back an instance of the decorator >>>>> function instead of the specific instance they registered by calling >>>>> FunctionService.registerFunction(Function). Therefore, any explicit >> casts >>>>> to a Function implementation like (MyFunction) >>>>> FunctionService.getFunction("MyFunction") would fail. Does that mean >> this >>>>> be a breaking change? The FunctionService class does not specify that >>>>> getFunction must return the same type function as the one passed to >>>>> registerFunction, but I could see how users might be relying on that >>>>> behavior since there is no other way to get a specific function type >> out of >>>>> the FunctionService without doing a cast. >>>>> >>>>> - Aaron >>>>> >>>>> >>>>> On Wed, Sep 11, 2019 at 10:52 AM Dan Smith <dsm...@pivotal.io> wrote: >>>>> >>>>>> Functions are serialized when you call Execution.execute(Function) >> instead >>>>>> of Execution.execute(String). Invoking execute on a function object >>>>>> serializes the function and executes it on the remote side. Functions >>>>>> executed this way don't have be registered. >>>>>> >>>>>> Users can also get registered function objects directly from the >> function >>>>>> service using FunctionService.getFunction(String) and do whatever >> they want >>>>>> with them, which I guess could include serializing them. >>>>>> >>>>>> Hope that helps! >>>>>> -Dan >>>>>> >>>>>> On Wed, Sep 11, 2019 at 10:27 AM Aaron Lindsey <alind...@pivotal.io> >>>>>> wrote: >>>>>> >>>>>>> As part of a PR to add Micrometer timers for function executions >>>>>>> <https://github.com/apache/geode/pull/4038>, we implemented a >> decorator >>>>>>> Function that wraps all registered non-internal functions and adds >>>>>>> instrumentation. This PR is >>>>>>> failing AnalyzeSerializablesJUnitTest.testSerializables because the >>>>>>> decorator class is a new Serializable. >>>>>>> >>>>>>> I'm not sure if it would be OK to add this class to >> excludedClasses.txt >>>>>>> because I don't know whether this function will ever be serialized. >> If it >>>>>>> will be serialized, then I'm concerned that this might break >> backwards >>>>>>> compatibility because we're changing the serialized form of >> registered >>>>>>> functions. If this is the case, then we could implement custom logic >> for >>>>>>> serializing the decorator class which would replace its serialized >> form >>>>>>> with the serialized form of the inner class. Again, I'm not sure if >> that >>>>>>> would be necessary because I don't know the conditions under which a >>>>>>> function would be serialized. >>>>>>> >>>>>>> Could someone help me understand when functions would be persisted or >>>>>> sent >>>>>>> over the wire so I can determine if this change would break >>>>>> compatibility? >>>>>>> >>>>>>> Thanks, >>>>>>> Aaron >>>>>>> >>>>>> >>>> >>> >> >>