Skip to content

[ROCKETMQ-101]Fix possible NullPointerException when retry in send Async way#63

Closed
Jaskey wants to merge 1 commit into
apache:masterfrom
Jaskey:ROCKETMQ-101-NPE-when-retry
Closed

[ROCKETMQ-101]Fix possible NullPointerException when retry in send Async way#63
Jaskey wants to merge 1 commit into
apache:masterfrom
Jaskey:ROCKETMQ-101-NPE-when-retry

Conversation

@Jaskey

@Jaskey Jaskey commented Feb 15, 2017

Copy link
Copy Markdown
Contributor

@coveralls

coveralls commented Feb 16, 2017

Copy link
Copy Markdown

Coverage Status

Coverage increased (+0.03%) to 31.549% when pulling a8802d0 on Jaskey:ROCKETMQ-101-NPE-when-retry into 573b22c on apache:master.

@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage increased (+0.09%) to 31.614% when pulling a8802d0 on Jaskey:ROCKETMQ-101-NPE-when-retry into 573b22c on apache:master.

2 similar comments
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage increased (+0.09%) to 31.614% when pulling a8802d0 on Jaskey:ROCKETMQ-101-NPE-when-retry into 573b22c on apache:master.

@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage increased (+0.09%) to 31.614% when pulling a8802d0 on Jaskey:ROCKETMQ-101-NPE-when-retry into 573b22c on apache:master.

@lizhanhui

Copy link
Copy Markdown
Contributor

This issue is valid and the bug will be triggered under the following conditions:

  1. A target message queue is specified, which will pass null for TopicPublishInfo parameter;
  2. Async sending;
  3. Retry happens;
  4. sendLatencyFaultEnable is enabled(On default, it's not enabled)

The PR, IMO, is not good as it simply disabled promised retry attempts without notice. Instead of logging retry failure, retry sending should be done against the original chosen broker.

@Jaskey

Jaskey commented Feb 16, 2017

Copy link
Copy Markdown
Contributor Author

@lizhanhui , # 4 is not the nessary conditions, since even it is not enble, the tpInfo's method is still used.

    if (this.sendLatencyFaultEnable) {
        try {
            int index = tpInfo.getSendWhichQueue().getAndIncrement();
            for (int i = 0; i < tpInfo.getMessageQueueList().size(); i++) {
                int pos = Math.abs(index++) % tpInfo.getMessageQueueList().size();
                if (pos < 0)
                    pos = 0;
                MessageQueue mq = tpInfo.getMessageQueueList().get(pos);
                if (latencyFaultTolerance.isAvailable(mq.getBrokerName())) {
                    if (null == lastBrokerName || mq.getBrokerName().equals(lastBrokerName))
                        return mq;
                }
            }

            final String notBestBroker = latencyFaultTolerance.pickOneAtLeast();
            int writeQueueNums = tpInfo.getQueueIdByBroker(notBestBroker);
            if (writeQueueNums > 0) {
                final MessageQueue mq = tpInfo.selectOneMessageQueue();
                if (notBestBroker != null) {
                    mq.setBrokerName(notBestBroker);
                    mq.setQueueId(tpInfo.getSendWhichQueue().getAndIncrement() % writeQueueNums);
                }
                return mq;
            } else {
                latencyFaultTolerance.remove(notBestBroker);
            }
        } catch (Exception e) {
            log.error("Error occurred when selecting message queue", e);
        }

        return tpInfo.selectOneMessageQueue();
    }

    return tpInfo.selectOneMessageQueue(lastBrokerName);//thrown from here

Besides, if topic route info is null which propably means user is send through my seletor method, resend should still respect user's seletor, so the same chosen broker is not enough, the same chosen queue is needed too, which may be another issue.

I guess it is not a very minal effort, since the existing interface does not record any chosen queue info.

@lizhanhui

Copy link
Copy Markdown
Contributor

Yes, #4 is not required as MQFaultStrategy#92 may also generate NPE.
Queue ID info is contained in the request header, minimal effort suffices.

@Jaskey

Jaskey commented Feb 16, 2017

Copy link
Copy Markdown
Contributor Author

@lizhanhui @zhouxinyu , please review the updated pr

@lizhanhui

Copy link
Copy Markdown
Contributor

Looks good.

@coveralls

coveralls commented Feb 16, 2017

Copy link
Copy Markdown

Coverage Status

Coverage increased (+0.02%) to 31.535% when pulling 18de299 on Jaskey:ROCKETMQ-101-NPE-when-retry into 573b22c on apache:master.

@zhouxinyu

Copy link
Copy Markdown
Member

Looks good, please @vongosling help review.

@Jaskey

Jaskey commented Mar 21, 2017

Copy link
Copy Markdown
Contributor Author

@vongosling @lizhanhui @zhouxinyu

This bug is crucial and easy to reproduce which makes sending message with seletor is not reliable at all.

When can this pr be merged and release the fix version?

@lizhanhui

Copy link
Copy Markdown
Contributor

@Jaskey You are right, I'll follow up and merge this PR ASAP.

@vongosling

Copy link
Copy Markdown
Member

LGTM~

@lizhanhui

Copy link
Copy Markdown
Contributor

@Jaskey I'll merge this PR soon. Please close this issue.

@Jaskey

Jaskey commented Mar 27, 2017

Copy link
Copy Markdown
Contributor Author

Thank you @vongosling @lizhanhui @zhouxinyu

@Jaskey Jaskey closed this Mar 27, 2017
@vongosling

Copy link
Copy Markdown
Member

@lizhanhui @Jaskey we'd better close after merge :-)

@Jaskey Jaskey reopened this Mar 27, 2017
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage decreased (-0.5%) to 31.043% when pulling 18de299 on Jaskey:ROCKETMQ-101-NPE-when-retry into 573b22c on apache:master.

2 similar comments
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage decreased (-0.5%) to 31.043% when pulling 18de299 on Jaskey:ROCKETMQ-101-NPE-when-retry into 573b22c on apache:master.

@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage decreased (-0.5%) to 31.043% when pulling 18de299 on Jaskey:ROCKETMQ-101-NPE-when-retry into 573b22c on apache:master.

@lizhanhui

Copy link
Copy Markdown
Contributor

Merged

@Jaskey Jaskey closed this Mar 28, 2017
@Jaskey Jaskey deleted the ROCKETMQ-101-NPE-when-retry branch March 30, 2017 02:36
pingww pushed a commit that referenced this pull request Aug 26, 2022
…ler for #22 (#63)

Co-authored-by: AhaThinking <ahathinking@SK-20211027RHLU.mioffice.cn>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants