diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardProcessSession.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardProcessSession.java index bf9b174591..c6e79bfaf3 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardProcessSession.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardProcessSession.java @@ -2677,7 +2677,7 @@ public final class StandardProcessSession implements ProcessSession, ProvenanceE if (outStream == null) { claimCache.flush(oldClaim); - try (final InputStream oldClaimIn = context.getContentRepository().read(oldClaim)) { + try (final InputStream oldClaimIn = read(source)) { newClaim = context.getContentRepository().create(context.getConnectable().isLossTolerant()); claimLog.debug("Creating ContentClaim {} for 'append' for {}", newClaim, source); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestStandardProcessSession.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestStandardProcessSession.java index 53019b2957..f6089dc045 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestStandardProcessSession.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestStandardProcessSession.java @@ -38,6 +38,7 @@ import java.io.FilterOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -73,6 +74,7 @@ import org.apache.nifi.flowfile.attributes.CoreAttributes; import org.apache.nifi.groups.ProcessGroup; import org.apache.nifi.processor.FlowFileFilter; import org.apache.nifi.processor.FlowFileFilter.FlowFileFilterResult; +import org.apache.nifi.processor.ProcessSession; import org.apache.nifi.processor.Relationship; import org.apache.nifi.processor.exception.FlowFileAccessException; import org.apache.nifi.processor.exception.MissingFlowFileException; @@ -1176,6 +1178,36 @@ public class TestStandardProcessSession { assertEquals("Hello, World", new String(buff)); } + @Test + public void testAppendToFlowFileWhereResourceClaimHasMultipleContentClaims() throws IOException { + final Relationship relationship = new Relationship.Builder().name("A").build(); + + FlowFile ffa = session.create(); + ffa = session.write(ffa, (out) -> out.write('A')); + session.transfer(ffa, relationship); + + FlowFile ffb = session.create(); + ffb = session.write(ffb, (out) -> out.write('B')); + session.transfer(ffb, relationship); + session.commit(); + + final ProcessSession newSession = new StandardProcessSession(context, () -> false); + FlowFile toUpdate = newSession.get(); + newSession.append(toUpdate, out -> out.write('C')); + + // Read the content back and ensure that it is correct + final byte[] buff; + try (final ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + newSession.read(toUpdate, in -> StreamUtils.copy(in, baos)); + buff = baos.toByteArray(); + } + + final String output = new String(buff, StandardCharsets.UTF_8); + assertEquals("AC", output); + newSession.transfer(toUpdate); + newSession.commit(); + } + @Test public void testAppendDoesNotDecrementContentClaimIfNotNeeded() { FlowFile flowFile = session.create();