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