in squangle/mysql_client/AsyncConnectionPool.cpp [559:614]
void AsyncConnectionPool::tryRequestNewConnection(
const PoolKey& pool_key,
std::shared_ptr<db::ConnectionContextBase> context) {
// Only called internally, this doesn't need to check if it's shutting
// down
DCHECK_EQ(std::this_thread::get_id(), mysql_client_->threadId());
{
std::unique_lock<std::mutex> lock(shutdown_mutex_);
if (shutting_down_) {
return;
}
}
// Checking if limits allow creating more connections
if (canCreateMoreConnections(pool_key)) {
VLOG(11) << "Requesting new Connection";
// get a shared pointer for operation
auto connOp = mysql_client_->beginConnection(pool_key.connKey);
connOp->setConnectionOptions(pool_key.connOptions);
if (!context) {
context = std::make_shared<db::ConnectionContextBase>();
}
connOp->setConnectionContext(std::move(context));
auto pool_ptr = getSelfWeakPointer();
// ADRIANA The attribute part we can do later :D time to do it
connOp->setCallback([pool_key, pool_ptr](ConnectOperation& connOp) {
auto locked_pool = pool_ptr.lock();
if (!locked_pool) {
return;
}
if (!connOp.ok()) {
VLOG(2) << "Failed to create new connection";
locked_pool->removeOpeningConn(pool_key);
locked_pool->failedToConnect(pool_key, connOp);
return;
}
auto conn = connOp.releaseConnection();
auto mysql_conn = conn->stealMysqlConnectionHolder();
// Now we got a connection from the client, it will become a pooled
// connection
auto pooled_conn = std::make_unique<MysqlPooledHolder>(
std::move(mysql_conn), pool_ptr, pool_key);
locked_pool->removeOpeningConn(pool_key);
locked_pool->addConnection(std::move(pooled_conn), true);
});
try {
addOpeningConn(pool_key);
connOp->run();
} catch (db::OperationStateException& e) {
LOG(ERROR) << "Client is drain or dying, cannot ask for more connections";
}
}
}