Thanks! I created a JIRA: [FLINK-26375] Fix Statefun Golang SDK to return nil from Context.Caller when there is no caller - ASF JIRA (apache.org) <https://issues.apache.org/jira/browse/FLINK-26375>
... and will update soon with the PR. On Fri, Feb 25, 2022 at 3:01 AM Igal Shilman <i...@apache.org> wrote: > Hi Galen, > > I think that you are right this does seem like a bug, looking at the Java > SDK, we replace an empty address with a null value.[1] > We should do the same here. > I've also checked the Python SDK[2], and the JS SDK[3] and they have the > same problem. > > Looking forward to your contribution! > > Thanks, > Igal. > > > [1] > > https://github.com/apache/flink-statefun/blob/725202cd69b78442d1287deec000ae2d52da4bda/statefun-sdk-java/src/main/java/org/apache/flink/statefun/sdk/java/handler/ProtoUtils.java#L49,L51 > [2] > > https://github.com/apache/flink-statefun/blob/725202cd69b78442d1287deec000ae2d52da4bda/statefun-sdk-python/statefun/request_reply_v3.py#L115,L122 > [3] > > https://github.com/apache/flink-statefun/blob/725202cd69b78442d1287deec000ae2d52da4bda/statefun-sdk-js/src/handler.ts#L240,L244 > > On Thu, Feb 24, 2022 at 10:58 PM Galen Warren <ga...@cvillewarrens.com> > wrote: > > > On the Context interface, Caller is defined like this: > > > > // Caller is the caller function instance's Address, if applicable. This > is > > nil > > // if the message was sent to this function via an ingress. > > Caller() *Address > > > > ... so, in the event a function is invoked from an ingress, as opposed to > > from another function, the returned value should be nil. > > > > However, it seems that the statefunContext.caller property -- the value > of > > which is returned by Caller() -- is always set to a non-nil value when > the > > context is constructed. From handler.go: > > > > sContext := statefunContext{ > > Mutex: new(sync.Mutex), > > self: self, > > storage: storage, > > response: response, > > } > > > > var cancel context.CancelFunc > > sContext.Context, cancel = context.WithCancel(ctx) > > > > * var caller Address* > > * if invocation.Caller != nil {* > > * caller = addressFromInternal(invocation.Caller)* > > * }* > > * sContext.caller = &caller* > > > > So, even when there is no caller associated with the invocation, the > caller > > field is set to a non-nil pointer, and the referenced Address has > > FunctionType=nil and Id="", which is then returned by Context.Caller(). > > > > Should the bolded code instead be the following, to only assign > > sContext.caller when the invocation has an associated caller? > > > > if invocation.Caller != nil { > > caller := addressFromInternal(invocation.Caller) > > sContext.caller = &caller > > } > > > > I'd be happy to submit a fix if needed ... thanks. > > >