You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@rocketmq.apache.org by James <ya...@gmail.com> on 2018/06/12 06:23:40 UTC

MQAdminExt.deleteTopicInBroker delete topic not really

version:
rocketmq version 3.2.6


we distribute topic A on broker-a and broker-b,
then call MQAdminExt.deleteTopicInBroker delete topic A on broker-a

But find the namesrv topicRoute not update,
restart namersrv, topicRoute update
do we have any other method? but restart namesrv

i view the namesrv code,advise add removeDeletedTopicQueueData code


RouteInfoMansger.registerBroker()

if (tcTable != null) {
    for (String topic : tcTable.keySet()) {
TopicConfig topicConfig = tcTable.get(topic);
this.createAndUpdateQueueData(brokerName, topicConfig);
    }
}

//add code
removeDeletedTopicQueueData(brokerName, tcTable);

// add code
private void removeDeletedTopicQueueData(String brokerName,
ConcurrentHashMap<String, TopicConfig> tcTable) {
        Iterator<Entry<String, List<QueueData>>> itMap =
this.topicQueueTable.entrySet().iterator();
        while (itMap.hasNext()) {
            Entry<String, List<QueueData>> entry = itMap.next();

            String topic = entry.getKey();
            List<QueueData> queueDataList = entry.getValue();
            Iterator<QueueData> it = queueDataList.iterator();
            while (it.hasNext()) {
                QueueData qd = it.next();
                if (qd.getBrokerName().equals(brokerName)) {
                    if (!tcTable.contains(topic)) {
                        log.info("removeDeletedTopic, remove one broker's
topic {} {}", topic, qd);
                        it.remove();
                    }
                }
            }
        }
    }