Github user hmcl commented on a diff in the pull request: https://github.com/apache/storm/pull/2380#discussion_r147015173 --- Diff: external/storm-kafka-client/src/main/java/org/apache/storm/kafka/spout/KafkaSpout.java --- @@ -438,55 +440,53 @@ private void commitOffsetsForAckedTuples() { // ======== Ack ======= @Override public void ack(Object messageId) { - if (!isAtLeastOnce()) { - // Only need to keep track of acked tuples if commits are done based on acks - return; - } - + // Only need to keep track of acked tuples if commits to Kafka are done after a tuple ack is received final KafkaSpoutMessageId msgId = (KafkaSpoutMessageId) messageId; - if (!emitted.contains(msgId)) { - if (msgId.isEmitted()) { - LOG.debug("Received ack for message [{}], associated with tuple emitted for a ConsumerRecord that " - + "came from a topic-partition that this consumer group instance is no longer tracking " - + "due to rebalance/partition reassignment. No action taken.", msgId); + if (isAtLeastOnceProcessing()) { --- End diff -- I disagree. Any method that has only one if condition and nothing else, should be ```java if (condition == true) do_action; ``` imho it is counter natural to have code like ```java if (condition = false) do_nothing; else do_action; ``` which is what basically the early return is doing. There are also lengthier reasons related to the semantics of OOP, but I just think that in general wherever possible one should have code like if (condtion==true) do action.
---