Hi,

MiNiFi C++ copied the behavior of the NiFi Python API to be compatible
with the NiFi python processors (although some minor differences may
apply [1]), so it works the same way in this case.
I think this behavior is understandable and can be accepted, but I
think Ferenc has a point that this at least should be documented in
the developer guide. The interface of the FlowFileTransformResult
suggests that the content can be specified for any relationship, but
it is discarded in this case without any notice. I suppose it would be
an overkill and not backwards compatible to change the API for adding
a failure specific transfer, but I think besides documenting this
behavior we could add a warning in the logs (or an exception?) if
someone specifies any content for this relationship.

Regards,
Gábor

[1] 
https://github.com/apache/nifi-minifi-cpp/blob/main/extensions/python/PYTHON.md#using-nifi-python-processors

On Wed, 31 Jul 2024 at 18:24, Mark Payne <marka...@hotmail.com> wrote:
>
> Hi Ferenc,
>
> I’m not overly familiar with MiNiFi C++ but this is how it works in 
> traditional NiFi as well.
> This is intended. While Processors are generally free to treat relationships 
> as they wish,
> the convention is always to route the original incoming FlowFile to 
> ‘failure’, never a modified version of it.
> At least with respect to content. Some attributes might be added, for example 
> to explain why there was a failure,
> but the content should not be changed.
>
> In the Python API we’ve generally moved toward being more prescriptive about 
> some of these things.
> So while it’s possible to do so in Java, it should not be done. In Python, we 
> don’t even allow it.
>
> Thanks
> -Mark
>
>
> > On Jul 31, 2024, at 10:46 AM, Ferenc Gerlits <fgerl...@apache.org> wrote:
> >
> > Hello NiFi community,
> >
> > We have implemented NiFi's FlowFileTransform API for Python processors
> > in MiNiFi C++, and we have written a few processors using it. We have
> > noticed that the "failure" relationship works like this: if the
> > transform() method returns
> > FlowFileTransformResult(relationship="failure",
> > contents=some_contents, attributes=some_attributes), then
> > - some_contents are discarded,
> > - some_attributes are merged with the attributes of the original flow file,
> > - and then the original flow file with the merged attributes is
> > routed to the failure relationship. [1]
> >
> > The fact that the contents are discarded was unexpected to me, and it
> > is not documented in the developer guide [2]. We could add this to the
> > developer guide, but I think it would make more sense if the failure
> > result worked in the same way as the success result: if contents is
> > None, then we use the original contents, but if contents is not None,
> > then it becomes the new contents of the flow file which is routed to
> > the failure relationship.
> >
> > What do you think?
> > Ferenc
> >
> > [1] 
> > https://github.com/apache/nifi/blob/main/nifi-extension-bundles/nifi-py4j-bundle/nifi-py4j-bridge/src/main/java/org/apache/nifi/python/processor/FlowFileTransformProxy.java
> > [2] 
> > https://github.com/apache/nifi/blob/main/nifi-docs/src/main/asciidoc/python-developer-guide.adoc
>

Reply via email to