in mcrouter/lib/carbon/example/ThreadAffinityMC.cpp [105:201]
int main(int argc, char** argv) {
folly::init(&argc, &argv);
// Create CarbonRouterInstance
XLOG(INFO, "Creating CarbonRouterInstance");
std::unordered_map<std::string, std::string> flavorOverrides;
flavorOverrides.emplace("num_proxies", std::to_string(FLAGS_num_proxies));
flavorOverrides.emplace("asynclog_disable", "true");
if (FLAGS_thread_affinity) {
flavorOverrides.emplace("thread_affinity", "true");
} else {
flavorOverrides.emplace("thread_affinity", "false");
}
// Service identity
flavorOverrides.emplace("ssl_service_identity", FLAGS_ssl_service_identity);
if (FLAGS_ssl_service_identity_authorization_log) {
flavorOverrides.emplace("ssl_service_identity_authorization_log", "true");
} else {
flavorOverrides.emplace("ssl_service_identity_authorization_log", "false");
}
if (FLAGS_ssl_service_identity_authorization_enforce) {
flavorOverrides.emplace(
"ssl_service_identity_authorization_enforce", "true");
} else {
flavorOverrides.emplace(
"ssl_service_identity_authorization_enforce", "false");
}
if (!FLAGS_routing_config_override.empty()) {
flavorOverrides.emplace("config", "file:" + FLAGS_routing_config_override);
}
std::shared_ptr<CarbonRouterInstance<MemcacheRouterInfo>> router;
try {
router = createRouterFromFlavor<MemcacheRouterInfo>(
FLAGS_flavor, flavorOverrides);
} catch (std::exception& ex) {
XLOGF(
ERR,
"Error creating router for threadAffinity for flavor {}. Exception: {}",
FLAGS_flavor,
ex.what());
return 1;
}
SCOPE_EXIT {
// Release all router resources on exit
router->shutdown();
freeAllRouters();
};
XLOGF(INFO, "Creating {} CarbonRouterClient", FLAGS_num_clients);
std::vector<std::thread> threads;
for (int t = 0; t < FLAGS_num_client_threads; ++t) {
threads.push_back(std::thread([&]() {
std::vector<Pointer> clients;
for (int i = 0; i < FLAGS_num_clients; ++i) {
clients.push_back(
router->createClient(0 /* max_outstanding_requests */, false));
}
for (int i = 0; i < FLAGS_num_clients; ++i) {
XLOGF(
INFO,
"Sending {} requests to CarbonRouterClient {}",
FLAGS_num_req_per_client,
i);
for (int j = 0; j < FLAGS_num_req_per_client; ++j) {
sendGetRequest(clients[i].get(), folly::sformat("key:{}{}", i, j));
}
}
}));
}
for (auto& thread : threads) {
thread.join();
}
for (int i = 0; i < FLAGS_num_proxies; ++i) {
XLOGF(
INFO,
"Total Connections proxy_{}: {}",
i,
router->getProxyBase(i)->stats().getValue(num_servers_up_stat));
XLOGF(
INFO,
"Authorization Successes proxy_{}: {}",
i,
router->getProxyBase(i)->stats().getValue(
num_authorization_successes_stat));
XLOGF(
INFO,
"Authorization Failures proxy_{}: {}",
i,
router->getProxyBase(i)->stats().getValue(
num_authorization_failures_stat));
}
return 0;
}