From issues-return-98487-archive-asf-public=cust-asf.ponee.io@nifi.apache.org Tue Jun 9 13:18:02 2020 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [207.244.88.153]) by mx-eu-01.ponee.io (Postfix) with SMTP id 44AC218062B for ; Tue, 9 Jun 2020 15:18:02 +0200 (CEST) Received: (qmail 11436 invoked by uid 500); 9 Jun 2020 13:18:01 -0000 Mailing-List: contact issues-help@nifi.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@nifi.apache.org Delivered-To: mailing list issues@nifi.apache.org Received: (qmail 11427 invoked by uid 99); 9 Jun 2020 13:18:01 -0000 Received: from mailrelay1-us-west.apache.org (HELO mailrelay1-us-west.apache.org) (209.188.14.139) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 09 Jun 2020 13:18:01 +0000 Received: from jira-he-de.apache.org (static.172.67.40.188.clients.your-server.de [188.40.67.172]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id 8F66D40676 for ; Tue, 9 Jun 2020 13:18:00 +0000 (UTC) Received: from jira-he-de.apache.org (localhost.localdomain [127.0.0.1]) by jira-he-de.apache.org (ASF Mail Server at jira-he-de.apache.org) with ESMTP id 0771D7801DD for ; Tue, 9 Jun 2020 13:18:00 +0000 (UTC) Date: Tue, 9 Jun 2020 13:18:00 +0000 (UTC) From: "Adam Hunyadi (Jira)" To: issues@nifi.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Updated] (MINIFICPP-1251) Implement RetryFlowFile Processor MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/MINIFICPP-1251?page=3Dcom.atla= ssian.jira.plugin.system.issuetabpanels:all-tabpanel ] Adam Hunyadi updated MINIFICPP-1251: ------------------------------------ Description:=20 *Acceptance criteria (edit in progress):* Planned flow to use: *GetFile(s)* =3D> *PutFile* (with *Conflict Resolution Strategy* set to *Fa= il*) =3D> *RetryFlowFile* Using this conflict resolution strategy on PutFile to fail means that we ca= n make it fail by making it try writing a file that already exists |{color:#00875a}{color:#000000}*Expected Retry Property Name*{color}{color}= |{color:#00875a}{color:#000000}*Expected Retry Property Value*{color}{color= }|{color:#00875a}{color:#000000}*Expected Outbound Relationship*{color}{col= or}|{color:#00875a}{color:#000000}*Expect Penalty on Flowfile*{color}{color= }|{color:#000000}*Retry Attribute Value on FlowFile*{color}|{color:#000000}= *Retry Attribute Value Before Processing*{color}|{color:#000000}*Maximum Re= tries*{color}|{color:#000000}*Penalize Retries*{color}|{color:#000000}*Fail= on Non-numerical Overwrite*{color}|{color:#000000}*Reuse Mode*{color}|{col= or:#000000}*Processor UUID matches FlowFile UUID*{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}(not set){color}|{color:#000000}(not set){color}|{color:#000000}(not s= et){color}|{color:#000000}(not set){color}|{color:#000000}(not set){color}|= {color:#000000}(not set){color}|{color:#000000}n/a{color}| |{color:#00875a}{color:#000000}*flowfile.retryCount*{color}{color}|{color:#= 00875a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retr= y*{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{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:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retries{color}|{color:#000000}1{color}|{color:#000000}(not se= t){color}|{color:#000000}(not set){color}|{color:#000000}(not set){color}|{= color:#000000}(not set){color}|{color:#000000}TRUE{color}| |{color:#00875a}{color:#000000}*(property cleared)*{color}{color}|{color:#0= 0875a}{color:#000000}*(property cleared)*{color}{color}|{color:#00875a}{col= or:#000000}*retries_exceeded*{color}{color}|{color:#00875a}{color:#000000}*= FALSE*{color}{color}|{color:#000000}flowfile.retries{color}|{color:#000000}= 3{color}|{color:#000000}(not set){color}|{color:#000000}(not set){color}|{c= olor:#000000}(not set){color}|{color:#000000}(not set){color}|{color:#00000= 0}TRUE{color}| |{color:#00875a}{color:#000000}*(property cleared)*{color}{color}|{color:#0= 0875a}{color:#000000}*(property cleared)*{color}{color}|{color:#00875a}{col= or:#000000}*retries_exceeded*{color}{color}|{color:#00875a}{color:#000000}*= FALSE*{color}{color}|{color:#000000}flowfile.retries{color}|{color:#000000}= 4{color}|{color:#000000}(not set){color}|{color:#000000}(not set){color}|{c= olor:#000000}(not set){color}|{color:#000000}(not set){color}|{color:#00000= 0}TRUE{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*6*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retries{color}|{color:#000000}5{color}|{color:#000000}6{color= }|{color:#000000}(not set){color}|{color:#000000}(not set){color}|{color:#0= 00000}(not set){color}|{color:#000000}TRUE{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retries{color}|{color:#000000}2{color}|{color:#000000}(not se= t){color}|{color:#000000}TRUE{color}|{color:#000000}(not set){color}|{color= :#000000}(not set){color}|{color:#000000}TRUE{color}| |{color:#00875a}{color:#000000}*(property cleared)*{color}{color}|{color:#0= 0875a}{color:#000000}*(property cleared)*{color}{color}|{color:#00875a}{col= or:#000000}*retries_exceeded*{color}{color}|{color:#00875a}{color:#000000}*= FALSE*{color}{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}TRU= E{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*FALSE*{color}{color}|{color:#0= 00000}flowfile.retries{color}|{color:#000000}2{color}|{color:#000000}(not s= et){color}|{color:#000000}FALSE{color}|{color:#000000}(not set){color}|{col= or:#000000}(not set){color}|{color:#000000}TRUE{color}| |{color:#00875a}{color:#000000}*(property cleared)*{color}{color}|{color:#0= 0875a}{color:#000000}*(property cleared)*{color}{color}|{color:#00875a}{col= or:#000000}*retries_exceeded*{color}{color}|{color:#00875a}{color:#000000}*= FALSE*{color}{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}TR= UE{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retries{color}|{color:#000000}1{color}|{color:#000000}(not se= t){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|{color= :#000000}(not set){color}|{color:#000000}TRUE{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retries{color}|{color:#000000}1{color}|{color:#000000}6{color= }|{color:#000000}(not set){color}|{color:#000000}FALSE{color}|{color:#00000= 0}(not set){color}|{color:#000000}TRUE{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retries{color}|{color:#000000}=E2=80=9Cincorrect=E2=80=9D{col= or}|{color:#000000}(not set){color}|{color:#000000}(not set){color}|{color:= #000000}(not set){color}|{color:#000000}(not set){color}|{color:#000000}TRU= E{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*(property cleared)*{color}{color}|{color:#00875a}{color= :#000000}*failure*{color}{color}|{color:#00875a}{color:#000000}*FALSE*{colo= r}{color}|{color:#000000}flowfile.retries{color}|{color:#000000}=E2=80=9Cin= correct=E2=80=9D{color}|{color:#000000}(not set){color}|{color:#000000}(not= set){color}|{color:#000000}TRUE{color}|{color:#000000}(not set){color}|{co= lor:#000000}TRUE{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retries{color}|{color:#000000}=E2=80=9Cincorrect=E2=80=9D{col= or}|{color:#000000}6{color}|{color:#000000}(not set){color}|{color:#000000}= FALSE{color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not= set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){color= }|{color:#000000}=E2=80=9CFail On Reuse=E2=80=9D{color}|{color:#000000}TRUE= {color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not= set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){color= }|{color:#000000}=E2=80=9CWarn on Reuse=E2=80=9D{color}|{color:#000000}TRUE= {color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not= set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){color= }|{color:#000000}=E2=80=9CReset Reuse=E2=80=9D{color}|{color:#000000}TRUE{c= olor}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*failure= *{color}{color}|{color:#00875a}{color:#000000}*FALSE*{color}{color}|{color:= #000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(= not set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){co= lor}|{color:#000000}(not set){color}|{color:#000000}FALSE{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*failure= *{color}{color}|{color:#00875a}{color:#000000}*FALSE*{color}{color}|{color:= #000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(= not set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){co= lor}|{color:#000000}=E2=80=9CFail On Reuse=E2=80=9D{color}|{color:#000000}F= ALSE{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not= set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){color= }|{color:#000000}=E2=80=9CWarn on Reuse=E2=80=9D{color}|{color:#000000}FALS= E{color}| |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#008= 75a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry*{= color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#00= 0000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not= set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){color= }|{color:#000000}=E2=80=9CReset Reuse=E2=80=9D{color}|{color:#000000}FALSE{= color}| Other: # GIVEN the reuse mode is set to *{color:#000000}=E2=80=9CWarn on Reuse=E2= =80=9D{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.pr= ocessors.standard.RetryFlowFile/index.html] =C2=A0 *Proposal:* As this is an important logic for creating flows, we should port this funct= ionality to MiNiFi as well. was: *Acceptance criteria (edit in progress):* Planned flow to use: *GetFile(s)* =3D> *PutFile* (with *Conflict Resolution Strategy* set to *Fa= il*) =3D> *RetryFlowFile* Using this conflict resolution strategy on PutFile to fail means that we ca= n make it fail by making it try writing a file that already exists |{color:#000000}*Expected Retry Property Name*{color}|{color:#000000}*Expec= ted Retry Property Value*{color}|{color:#000000}*Expected Outbound Relation= ship*{color}|{color:#000000}*Expect Penalty on Flowfile*{color}|{color:#000= 000}*Retry Attribute Value on FlowFile*{color}|{color:#000000}*Retry Attrib= ute Value Before Processing*{color}|{color:#000000}*Maximum Retries*{color}= |{color:#000000}*Penalize Retries*{color}|{color:#000000}*Fail on Non-numer= ical Overwrite*{color}|{color:#000000}*Reuse Mode*{color}|{color:#000000}*P= rocessor 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}|{c= olor:#000000}(not set){color}|{color:#000000}(not set){color}|{color:#00000= 0}(not set){color}|{color:#000000}n/a{color}| |{color:#000000}*flowfile.retryCount*{color}|{color:#000000}*1*{color}|{col= or:#000000}*retry*{color}|{color:#000000}*TRUE*{color}|{color:#000000}flowf= ile.retryCount{color}|{color:#000000}(not set){color}|{color:#000000}(not s= et){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}|{co= lor:#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 clear= ed)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*= {color}|{color:#000000}flowfile.retries{color}|{color:#000000}3{color}|{col= or:#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 clear= ed)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*= {color}|{color:#000000}flowfile.retries{color}|{color:#000000}4{color}|{col= or:#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:#000= 000}(not set){color}|{color:#000000}(not set){color}|{color:#000000}(not se= t){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}|{co= lor:#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 clear= ed)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*= {color}|{color:#000000}flowfile.retries{color}|{color:#000000}3{color}|{col= or:#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}flowfil= e.retries{color}|{color:#000000}2{color}|{color:#000000}(not set){color}|{c= olor:#000000}FALSE{color}|{color:#000000}(not set){color}|{color:#000000}(n= ot set){color}|{color:#000000}TRUE{color}| |{color:#000000}*(property cleared)*{color}|{color:#000000}*(property clear= ed)*{color}|{color:#000000}*retries_exceeded*{color}|{color:#000000}*FALSE*= {color}|{color:#000000}flowfile.retries{color}|{color:#000000}3{color}|{col= or:#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}|{co= lor:#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:#000= 000}(not set){color}|{color:#000000}FALSE{color}|{color:#000000}(not set){c= olor}|{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}=E2=80=9Cincorrect=E2=80=9D{color}|{color:#0= 00000}(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}|{co= lor:#000000}flowfile.retries{color}|{color:#000000}=E2=80=9Cincorrect=E2=80= =9D{color}|{color:#000000}(not set){color}|{color:#000000}(not set){color}|= {color:#000000}TRUE{color}|{color:#000000}(not set){color}|{color:#000000}T= RUE{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}=E2=80=9Cincorrect=E2=80=9D{color}|{color:#0= 00000}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:#000= 000}=E2=80=9CFail On Reuse=E2=80=9D{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:#000= 000}=E2=80=9CWarn on Reuse=E2=80=9D{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:#000= 000}=E2=80=9CReset Reuse=E2=80=9D{color}|{color:#000000}TRUE{color}| |{color:#000000}*flowfile.retries*{color}|{color:#000000}*1*{color}|{color:= #000000}*failure*{color}|{color:#000000}*FALSE*{color}|{color:#000000}flowf= ile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not set){colo= r}|{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}flowf= ile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(not set){colo= r}|{color:#000000}(not set){color}|{color:#000000}(not set){color}|{color:#= 000000}=E2=80=9CFail On Reuse=E2=80=9D{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:#000= 000}=E2=80=9CWarn on Reuse=E2=80=9D{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:#000= 000}=E2=80=9CReset Reuse=E2=80=9D{color}|{color:#000000}FALSE{color}| Other: # GIVEN the reuse mode is set to *{color:#000000}=E2=80=9CWarn on Reuse=E2= =80=9D{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.pr= ocessors.standard.RetryFlowFile/index.html] =C2=A0 *Proposal:* As this is an important logic for creating flows, we should port this funct= ionality 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)* =3D> *PutFile* (with *Conflict Resolution Strategy* set to *= Fail*) =3D> *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:#00875a}{color:#000000}*Expected Retry Property Name*{color}{colo= r}|{color:#00875a}{color:#000000}*Expected Retry Property Value*{color}{col= or}|{color:#00875a}{color:#000000}*Expected Outbound Relationship*{color}{c= olor}|{color:#00875a}{color:#000000}*Expect Penalty on Flowfile*{color}{col= or}|{color:#000000}*Retry Attribute Value on FlowFile*{color}|{color:#00000= 0}*Retry Attribute Value Before Processing*{color}|{color:#000000}*Maximum = Retries*{color}|{color:#000000}*Penalize Retries*{color}|{color:#000000}*Fa= il on Non-numerical Overwrite*{color}|{color:#000000}*Reuse Mode*{color}|{c= olor:#000000}*Processor UUID matches FlowFile UUID*{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{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:#00875a}{color:#000000}*flowfile.retryCount*{color}{color}|{color= :#00875a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*re= try*{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{colo= r:#000000}flowfile.retryCount{color}|{color:#000000}(not set){color}|{color= :#000000}(not set){color}|{color:#000000}(not set){color}|{color:#000000}(n= ot set){color}|{color:#000000}(not set){color}|{color:#000000}n/a{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{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:#00875a}{color:#000000}*(property cleared)*{color}{color}|{color:= #00875a}{color:#000000}*(property cleared)*{color}{color}|{color:#00875a}{c= olor:#000000}*retries_exceeded*{color}{color}|{color:#00875a}{color:#000000= }*FALSE*{color}{color}|{color:#000000}flowfile.retries{color}|{color:#00000= 0}3{color}|{color:#000000}(not set){color}|{color:#000000}(not set){color}|= {color:#000000}(not set){color}|{color:#000000}(not set){color}|{color:#000= 000}TRUE{color}| > |{color:#00875a}{color:#000000}*(property cleared)*{color}{color}|{color:= #00875a}{color:#000000}*(property cleared)*{color}{color}|{color:#00875a}{c= olor:#000000}*retries_exceeded*{color}{color}|{color:#00875a}{color:#000000= }*FALSE*{color}{color}|{color:#000000}flowfile.retries{color}|{color:#00000= 0}4{color}|{color:#000000}(not set){color}|{color:#000000}(not set){color}|= {color:#000000}(not set){color}|{color:#000000}(not set){color}|{color:#000= 000}TRUE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*6*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#= 000000}flowfile.retries{color}|{color:#000000}5{color}|{color:#000000}6{col= or}|{color:#000000}(not set){color}|{color:#000000}(not set){color}|{color:= #000000}(not set){color}|{color:#000000}TRUE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#= 000000}flowfile.retries{color}|{color:#000000}2{color}|{color:#000000}(not = set){color}|{color:#000000}TRUE{color}|{color:#000000}(not set){color}|{col= or:#000000}(not set){color}|{color:#000000}TRUE{color}| > |{color:#00875a}{color:#000000}*(property cleared)*{color}{color}|{color:= #00875a}{color:#000000}*(property cleared)*{color}{color}|{color:#00875a}{c= olor:#000000}*retries_exceeded*{color}{color}|{color:#00875a}{color:#000000= }*FALSE*{color}{color}|{color:#000000}flowfile.retries{color}|{color:#00000= 0}3{color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|{colo= r:#000000}(not set){color}|{color:#000000}(not set){color}|{color:#000000}T= RUE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*FALSE*{color}{color}|{color:= #000000}flowfile.retries{color}|{color:#000000}2{color}|{color:#000000}(not= set){color}|{color:#000000}FALSE{color}|{color:#000000}(not set){color}|{c= olor:#000000}(not set){color}|{color:#000000}TRUE{color}| > |{color:#00875a}{color:#000000}*(property cleared)*{color}{color}|{color:= #00875a}{color:#000000}*(property cleared)*{color}{color}|{color:#00875a}{c= olor:#000000}*retries_exceeded*{color}{color}|{color:#00875a}{color:#000000= }*FALSE*{color}{color}|{color:#000000}flowfile.retries{color}|{color:#00000= 0}3{color}|{color:#000000}(not set){color}|{color:#000000}FALSE{color}|{col= or:#000000}(not set){color}|{color:#000000}(not set){color}|{color:#000000}= TRUE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#= 000000}flowfile.retries{color}|{color:#000000}1{color}|{color:#000000}(not = set){color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}|{col= or:#000000}(not set){color}|{color:#000000}TRUE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#= 000000}flowfile.retries{color}|{color:#000000}1{color}|{color:#000000}6{col= or}|{color:#000000}(not set){color}|{color:#000000}FALSE{color}|{color:#000= 000}(not set){color}|{color:#000000}TRUE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#= 000000}flowfile.retries{color}|{color:#000000}=E2=80=9Cincorrect=E2=80=9D{c= olor}|{color:#000000}(not set){color}|{color:#000000}(not set){color}|{colo= r:#000000}(not set){color}|{color:#000000}(not set){color}|{color:#000000}T= RUE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*(property cleared)*{color}{color}|{color:#00875a}{col= or:#000000}*failure*{color}{color}|{color:#00875a}{color:#000000}*FALSE*{co= lor}{color}|{color:#000000}flowfile.retries{color}|{color:#000000}=E2=80=9C= incorrect=E2=80=9D{color}|{color:#000000}(not set){color}|{color:#000000}(n= ot set){color}|{color:#000000}TRUE{color}|{color:#000000}(not set){color}|{= color:#000000}TRUE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#= 000000}flowfile.retries{color}|{color:#000000}=E2=80=9Cincorrect=E2=80=9D{c= olor}|{color:#000000}6{color}|{color:#000000}(not set){color}|{color:#00000= 0}FALSE{color}|{color:#000000}(not set){color}|{color:#000000}TRUE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#= 000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(n= ot set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){col= or}|{color:#000000}=E2=80=9CFail On Reuse=E2=80=9D{color}|{color:#000000}TR= UE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#= 000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(n= ot set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){col= or}|{color:#000000}=E2=80=9CWarn on Reuse=E2=80=9D{color}|{color:#000000}TR= UE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*2*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#= 000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(n= ot set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){col= or}|{color:#000000}=E2=80=9CReset Reuse=E2=80=9D{color}|{color:#000000}TRUE= {color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*failu= re*{color}{color}|{color:#00875a}{color:#000000}*FALSE*{color}{color}|{colo= r:#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:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*failu= re*{color}{color}|{color:#00875a}{color:#000000}*FALSE*{color}{color}|{colo= r:#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}=E2=80=9CFail On Reuse=E2=80=9D{color}|{color:#000000= }FALSE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#= 000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(n= ot set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){col= or}|{color:#000000}=E2=80=9CWarn on Reuse=E2=80=9D{color}|{color:#000000}FA= LSE{color}| > |{color:#00875a}{color:#000000}*flowfile.retries*{color}{color}|{color:#0= 0875a}{color:#000000}*1*{color}{color}|{color:#00875a}{color:#000000}*retry= *{color}{color}|{color:#00875a}{color:#000000}*TRUE*{color}{color}|{color:#= 000000}flowfile.retryCount{color}|{color:#000000}1{color}|{color:#000000}(n= ot set){color}|{color:#000000}(not set){color}|{color:#000000}(not set){col= or}|{color:#000000}=E2=80=9CReset Reuse=E2=80=9D{color}|{color:#000000}FALS= E{color}| > Other: > # GIVEN the reuse mode is set to *{color:#000000}=E2=80=9CWarn on Reuse= =E2=80=9D{color}* > WHEN the flowfile already has a retries attribute generated by a differe= nt 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/nif= i-docs/components/org.apache.nifi/nifi-standard-nar/1.11.4/org.apache.nifi.= processors.standard.RetryFlowFile/index.html] > =C2=A0 > *Proposal:* > As this is an important logic for creating flows, we should port this fun= ctionality to MiNiFi as well. -- This message was sent by Atlassian Jira (v8.3.4#803005)