McrouterRouteHandlePtr makeFailoverWithExptimeRoute( RouteHandleFactory<McrouterRouteHandleIf>& factory, const folly::dynamic& json) { checkLogic(json.isObject(), "FailoverWithExptimeRoute is not an object"); McrouterRouteHandlePtr normal; if (auto jnormal = json.get_ptr("normal")) { normal = factory.create(*jnormal); } std::vector<McrouterRouteHandlePtr> failoverTargets; if (auto jfailover = json.get_ptr("failover")) { failoverTargets = factory.createList(*jfailover); } int32_t failoverExptime = 60; if (auto jexptime = json.get_ptr("failover_exptime")) { checkLogic(jexptime->isInt(), "FailoverWithExptimeRoute: " "failover_exptime is not an integer"); failoverExptime = jexptime->getInt(); } // Check if only one format is being used checkLogic(!(json.count("settings") && // old (json.count("failover_errors") || json.count("failover_tag"))), // new "Use either 'settings' (old format) or 'failover_errors' / 'failover_tag'" ); // new format FailoverErrorsSettings failoverErrors; bool failoverTagging = false; if (auto jfailoverTag = json.get_ptr("failover_tag")) { checkLogic(jfailoverTag->isBool(), "FailoverWithExptime: failover_tag is not bool"); failoverTagging = jfailoverTag->getBool(); } if (auto jfailoverErrors = json.get_ptr("failover_errors")) { failoverErrors = FailoverErrorsSettings(*jfailoverErrors); } // old format if (auto jsettings = json.get_ptr("settings")) { VLOG(1) << "FailoverWithExptime: This config format is deprecated. " "Use 'failover_errors' instead of 'settings'."; auto oldSettings = FailoverWithExptimeSettings(*jsettings); failoverTagging = oldSettings.failoverTagging; failoverErrors = oldSettings.getFailoverErrors(); } return makeFailoverWithExptimeRoute( std::move(normal), std::move(failoverTargets), failoverExptime, std::move(failoverErrors), failoverTagging); }
McrouterRouteHandlePtr makeLatestRoute( const folly::dynamic& json, std::vector<McrouterRouteHandlePtr> targets) { size_t failoverCount = 5; FailoverErrorsSettings failoverErrors; if (json.isObject()) { if (auto jfailoverCount = json.get_ptr("failover_count")) { checkLogic(jfailoverCount->isInt(), "LatestRoute: failover_count is not an integer"); failoverCount = jfailoverCount->getInt(); } if (auto jFailoverErrors = json.get_ptr("failover_errors")) { failoverErrors = FailoverErrorsSettings(*jFailoverErrors); } } return makeLatestRoute(std::move(targets), failoverCount, std::move(failoverErrors)); }
McrouterRouteHandlePtr makeFailoverRoute( const folly::dynamic& json, std::vector<McrouterRouteHandlePtr> children) { FailoverErrorsSettings failoverErrors; std::unique_ptr<FailoverRateLimiter> rateLimiter; bool failoverTagging = false; if (json.isObject()) { if (auto jFailoverErrors = json.get_ptr("failover_errors")) { failoverErrors = FailoverErrorsSettings(*jFailoverErrors); } if (auto jFailoverTag = json.get_ptr("failover_tag")) { checkLogic(jFailoverTag->isBool(), "Failover: failover_tag is not bool"); failoverTagging = jFailoverTag->getBool(); } if (auto jFailoverLimit = json.get_ptr("failover_limit")) { rateLimiter = folly::make_unique<FailoverRateLimiter>(*jFailoverLimit); } } return makeFailoverRoute(std::move(children), std::move(failoverErrors), std::move(rateLimiter), failoverTagging); }