Brandon DeVries created NIFI-2979:
-------------------------------------
Summary: PriorityAttributePrioritizer violates Comparator contract
Key: NIFI-2979
URL: https://issues.apache.org/jira/browse/NIFI-2979
Project: Apache NiFi
Issue Type: Bug
Reporter: Brandon DeVries
The documentation for the compare() method of the Comparator interface\[1]
states:
{quote}
The implementor must ensure that sgn(compare(x, y)) == -sgn(compare(y, x)) for
all x and y.
{quote}
However, in the PriorityAttributePrioritizer\[2], we have the following snippet:
{code}
String o1Priority = o1.getAttribute(CoreAttributes.PRIORITY.key());
String o2Priority = o2.getAttribute(CoreAttributes.PRIORITY.key());
if (o1Priority == null && o2Priority == null) {
return -1; // this is not 0 to match FirstInFirstOut
} else if (o2Priority == null) {
return -1;
} else if (o1Priority == null) {
return 1;
}
{code}
This implies that for two non-null FlowFiles f1 and f2, both with null
"priority" attributes, we would have:
{code}
compare(f1, f2) == -1
compare(f2, f1) == -1
{code}
This would appear to violate the contract of the Comparator interface. The
comment suggests this was done to preserve FIFO ordering, however a return of 0
should do the same, and satisfy the contract.
\[1]
https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html#compare%28T,%20T%29
\[2]
https://github.com/apache/nifi/blob/d838f61291d2582592754a37314911b701c6891b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-prioritizers/src/main/java/org/apache/nifi/prioritizer/PriorityAttributePrioritizer.java#L49-L57
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)