NIFI-3768: This closes #1727. Avoid wrapping FlowFile Attributes Map in an UnmodifiableMap in the StandardFlowFileBuilder

Signed-off-by: joewitt <joewitt@apache.org>
This commit is contained in:
Mark Payne 2017-05-01 22:48:48 -04:00 committed by joewitt
parent 07989b8460
commit b96e402e78
1 changed files with 6 additions and 1 deletions

View File

@ -319,7 +319,12 @@ public final class StandardFlowFileRecord implements FlowFile, FlowFileRecord {
bLineageIdentifiers.clear(); bLineageIdentifiers.clear();
bPenaltyExpirationMs = specFlowFile.getPenaltyExpirationMillis(); bPenaltyExpirationMs = specFlowFile.getPenaltyExpirationMillis();
bSize = specFlowFile.getSize(); bSize = specFlowFile.getSize();
bAttributes = specFlowFile.getAttributes(); // If this is a StandardFlowFileRecord, access the attributes map directly. Do not use the
// getAttributes() method, because that will wrap the original in an UnmodifiableMap. As a result,
// a Processor that continually calls session.append() for instance will have a FlowFile whose attributes
// Map is wrapped thousands of times until it hits a StackOverflowError. We want the getter to return
// UnmodifiableMap, though, so that Processors cannot directly modify that Map.
bAttributes = specFlowFile instanceof StandardFlowFileRecord ? ((StandardFlowFileRecord) specFlowFile).attributes : specFlowFile.getAttributes();
bAttributesCopied = false; bAttributesCopied = false;
bClaim = specFlowFile.getContentClaim(); bClaim = specFlowFile.getContentClaim();
bClaimOffset = specFlowFile.getContentClaimOffset(); bClaimOffset = specFlowFile.getContentClaimOffset();