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

Reply via email to