[
https://issues.apache.org/jira/browse/MINIFICPP-1251?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Adam Hunyadi updated MINIFICPP-1251:
------------------------------------
Description:
*Acceptance criteria (edit in progress):*
Planned flow to use:
*GetFile(s)* => *PutFile* (with *Conflict Resolution Strategy* set to *Fail*)
=> *RetryFlowFile*
Using this conflict resolution strategy on PutFile to fail means that we can
make it fail by making it try writing a file that already exists
|{color:#000000}*Expected Retry Property Name*{color}|{color:#000000}*Expected
Retry Property Value*{color}|{color:#000000}*Expected Outbound
Relationship*{color}|{color:#000000}*Expect Penalty on
Flowfile*{color}|{color:#000000}*Retry Attribute Value on
FlowFile*{color}|{color:#000000}*Retry Attribute Value Before
Processing*{color}|{color:#000000}*Maximum
Retries*{color}|{color:#000000}*Penalize Retries*{color}|{color:#000000}*Fail
on Non-numerical Overwrite*{color}|{color:#000000}*Reuse
Mode*{color}|{color:#000000}*Processor UUID matches FlowFile UUID*{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}n/a{color}|
|{color:#000000}*flowfile.retryCount*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}n/a{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}1{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*(property cleared)*{color}|{color:#000000}*(property
cleared)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}3{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*(property cleared)*{color}|{color:#000000}*(property
cleared)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}4{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*6*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}5{color}|{color:#000000}6{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}2{color}|{color:#000000}(not
set){color}|{color:#000000}TRUE{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*(property cleared)*{color}|{color:#000000}*(property
cleared)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}3{color}|{color:#000000}(not
set){color}|{color:#000000}TRUE{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}2{color}|{color:#000000}(not
set){color}|{color:#000000}FALSE{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*(property cleared)*{color}|{color:#000000}*(property
cleared)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}3{color}|{color:#000000}(not
set){color}|{color:#000000}FALSE{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}1{color}|{color:#000000}(not
set){color}|{color:#000000}(not
set){color}|{color:#000000}TRUE{color}|{color:#000000}(not
set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}1{color}|{color:#000000}6{color}|{color:#000000}(not
set){color}|{color:#000000}FALSE{color}|{color:#000000}(not
set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}“incorrect”{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*(property
cleared)*{color}|{color:#000000}*failure*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}“incorrect”{color}|{color:#000000}(not
set){color}|{color:#000000}(not
set){color}|{color:#000000}TRUE{color}|{color:#000000}(not
set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}“incorrect”{color}|{color:#000000}6{color}|{color:#000000}(not
set){color}|{color:#000000}FALSE{color}|{color:#000000}(not
set){color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}“Fail On Reuse”{color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}“Warn on Reuse”{color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}“Reset Reuse”{color}|{color:#000000}TRUE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*failure*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}FALSE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*failure*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}“Fail On Reuse”{color}|{color:#000000}FALSE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}“Warn on Reuse”{color}|{color:#000000}FALSE{color}|
|{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
set){color}|{color:#000000}(not set){color}|{color:#000000}(not
set){color}|{color:#000000}“Reset Reuse”{color}|{color:#000000}FALSE{color}|
Other:
# GIVEN the reuse mode is set to *{color:#000000}“Warn on Reuse”{color}*
WHEN the flowfile already has a retries attribute generated by a different
processor
THEN a log line should mention this on *warning* level
*Background:*
NiFi already has a RetryFlowFile processor, as documented here:
[[Apache documentation for
RetryFlowFile]|http://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.11.4/org.apache.nifi.processors.standard.RetryFlowFile/index.html]
*Proposal:*
As this is an important logic for creating flows, we should port this
functionality to MiNiFi as well.
was:
*Acceptance criteria (edit in progress):*
Planned flow to use:
*GetFile(s)* => *PutFile* (with *Conflict Resolution Strategy* set to *Fail*)
=> *RetryFlowFile*
Using this conflict resolution strategy on PutFile to fail means that we can
make it file by trying to make it write a file
# GIVEN **
WHEN
THEN
# GIVEN **
WHEN
THEN
# GIVEN **
WHEN
THEN
# GIVEN **
WHEN
THEN
*Background:*
NiFi already has a RetryFlowFile processor, as documented here:
[[Apache documentation for
RetryFlowFile]|http://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.11.4/org.apache.nifi.processors.standard.RetryFlowFile/index.html]
*Proposal:*
As this is an important logic for creating flows, we should port this
functionality to MiNiFi as well.
> Implement RetryFlowFile Processor
> ---------------------------------
>
> Key: MINIFICPP-1251
> URL: https://issues.apache.org/jira/browse/MINIFICPP-1251
> Project: Apache NiFi MiNiFi C++
> Issue Type: New Feature
> Reporter: Adam Hunyadi
> Assignee: Adam Hunyadi
> Priority: Minor
>
> *Acceptance criteria (edit in progress):*
> Planned flow to use:
> *GetFile(s)* => *PutFile* (with *Conflict Resolution Strategy* set to *Fail*)
> => *RetryFlowFile*
> Using this conflict resolution strategy on PutFile to fail means that we can
> make it fail by making it try writing a file that already exists
> |{color:#000000}*Expected Retry Property
> Name*{color}|{color:#000000}*Expected Retry Property
> Value*{color}|{color:#000000}*Expected Outbound
> Relationship*{color}|{color:#000000}*Expect Penalty on
> Flowfile*{color}|{color:#000000}*Retry Attribute Value on
> FlowFile*{color}|{color:#000000}*Retry Attribute Value Before
> Processing*{color}|{color:#000000}*Maximum
> Retries*{color}|{color:#000000}*Penalize Retries*{color}|{color:#000000}*Fail
> on Non-numerical Overwrite*{color}|{color:#000000}*Reuse
> Mode*{color}|{color:#000000}*Processor UUID matches FlowFile UUID*{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}n/a{color}|
> |{color:#000000}*flowfile.retryCount*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}n/a{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}1{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*(property cleared)*{color}|{color:#000000}*(property
> cleared)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}3{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*(property cleared)*{color}|{color:#000000}*(property
> cleared)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}4{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*6*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}5{color}|{color:#000000}6{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}2{color}|{color:#000000}(not
> set){color}|{color:#000000}TRUE{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*(property cleared)*{color}|{color:#000000}*(property
> cleared)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}3{color}|{color:#000000}(not
> set){color}|{color:#000000}TRUE{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}2{color}|{color:#000000}(not
> set){color}|{color:#000000}FALSE{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*(property cleared)*{color}|{color:#000000}*(property
> cleared)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}3{color}|{color:#000000}(not
> set){color}|{color:#000000}FALSE{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}1{color}|{color:#000000}(not
> set){color}|{color:#000000}(not
> set){color}|{color:#000000}TRUE{color}|{color:#000000}(not
> set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}1{color}|{color:#000000}6{color}|{color:#000000}(not
> set){color}|{color:#000000}FALSE{color}|{color:#000000}(not
> set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}“incorrect”{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*(property
> cleared)*{color}|{color:#000000}*failure*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}“incorrect”{color}|{color:#000000}(not
> set){color}|{color:#000000}(not
> set){color}|{color:#000000}TRUE{color}|{color:#000000}(not
> set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retries{color}|{color:#000000}“incorrect”{color}|{color:#000000}6{color}|{color:#000000}(not
> set){color}|{color:#000000}FALSE{color}|{color:#000000}(not
> set){color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}“Fail On Reuse”{color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}“Warn on Reuse”{color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*2*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}“Reset Reuse”{color}|{color:#000000}TRUE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*failure*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}FALSE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*failure*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}“Fail On Reuse”{color}|{color:#000000}FALSE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}“Warn on Reuse”{color}|{color:#000000}FALSE{color}|
> |{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not
> set){color}|{color:#000000}(not set){color}|{color:#000000}(not
> set){color}|{color:#000000}“Reset Reuse”{color}|{color:#000000}FALSE{color}|
> Other:
> # GIVEN the reuse mode is set to *{color:#000000}“Warn on Reuse”{color}*
> WHEN the flowfile already has a retries attribute generated by a different
> processor
> THEN a log line should mention this on *warning* level
> *Background:*
> NiFi already has a RetryFlowFile processor, as documented here:
> [[Apache documentation for
> RetryFlowFile]|http://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.11.4/org.apache.nifi.processors.standard.RetryFlowFile/index.html]
>
> *Proposal:*
> As this is an important logic for creating flows, we should port this
> functionality to MiNiFi as well.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)