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

Reply via email to