in mqtt-common/src/main/java/org/apache/rocketmq/mqtt/common/model/Trie.java [95:124]
public synchronized boolean deleteTrieNode(String key, K valueKey) {
try {
if (!nodePath.contains(key)) {
return false;
}
String[] keyArray = key.split(Constants.MQTT_TOPIC_DELIMITER);
TrieNode<K, V> currentNode = rootNode;
int level = 0;
while (level < keyArray.length) {
TrieNode trieNode = currentNode.children.get(keyArray[level]);
if (trieNode == null) {
break;
}
level++;
currentNode = trieNode;
}
V oldValue = currentNode.valueSet.remove(valueKey);
currentNode.end = false;
//clean the empty node
while (currentNode.children.isEmpty() && currentNode.valueSet.isEmpty() && currentNode.parentNode != null) {
currentNode.parentNode.children.remove(keyArray[--level]);
currentNode = currentNode.parentNode;
}
this.nodePath.remove(key);
return true;
} catch (Throwable e) {
throw new TrieException(e);
}
}