const std::vector<McrouterRouteHandlePtr>* RouteHandleMap::getTargetsForKeyFast(folly::StringPiece prefix, folly::StringPiece key) const { // empty prefix => route to default route if (prefix.empty()) { return &getBySingleRoute(defaultRoute_, key); } // route to all routes if (prefix == "/*/*/") { return &allRoutes_->getTargetsForKey(key); } auto starPos = prefix.find("*"); if (starPos == std::string::npos) { // no stars at all return &getBySingleRoute(prefix, key); } if (prefix.endsWith("/*/") && starPos == prefix.size() - 2) { // route to all clusters of some region (/region/*/) auto region = prefix.subpiece(1, prefix.size() - 4); auto it = byRegion_.find(region); if (it == byRegion_.end()) { return &emptyV_; } return &it->second->getTargetsForKey(key); } // no other types supported return nullptr; }
const std::vector<McrouterRouteHandlePtr>* RouteHandleMap::getTargetsForKeyFast(folly::StringPiece prefix, folly::StringPiece key) const { const std::vector<McrouterRouteHandlePtr>* result = nullptr; if (prefix.empty()) { // empty prefix => route to default route result = &defaultRouteMap_->getTargetsForKey(key); } else if (prefix == "/*/*/") { // route to all routes result = &allRoutes_->getTargetsForKey(key); } else { auto starPos = prefix.find("*"); if (starPos == std::string::npos) { // no stars at all auto it = byRoute_.find(prefix); result = it == byRoute_.end() ? &emptyV_ : &it->second->getTargetsForKey(key); } else if (prefix.endsWith("/*/") && starPos == prefix.size() - 2) { // route to all clusters of some region (/region/*/) auto region = prefix.subpiece(1, prefix.size() - 4); auto it = byRegion_.find(region); result = it == byRegion_.end() ? &emptyV_ : &it->second->getTargetsForKey(key); } } if (sendInvalidRouteToDefault_ && result != nullptr && result->empty()) { return &defaultRouteMap_->getTargetsForKey(key); } return result; }