in src/afs.cc [1138:1179]
arrow::Result<uint64_t> connect(const std::string& databaseName,
const std::string& userName,
const std::string& password,
const std::string& clientAddress)
{
auto session = create_session(databaseName, userName, password, clientAddress);
auto id = session->id;
dshash_release_lock(sessions_, session);
kill(sharedData_->mainPID, SIGUSR1);
{
std::unique_lock<std::mutex> lock(mutex_);
conditionVariable_.wait(lock, [&] {
if (INTERRUPTS_PENDING_CONDITION())
{
return true;
}
session = static_cast<SessionData*>(dshash_find(sessions_, &id, false));
if (!session)
{
return true;
}
const auto initialized = session->initialized;
dshash_release_lock(sessions_, session);
return initialized;
});
}
session = static_cast<SessionData*>(dshash_find(sessions_, &id, false));
if (!session)
{
return arrow::Status::Invalid("session is stale: ", id);
}
SessionReleaser sessionReleaser(sessions_, session);
if (DsaPointerIsValid(session->errorMessage))
{
return report_session_error(session);
}
if (INTERRUPTS_PENDING_CONDITION())
{
return arrow::Status::Invalid("interrupted");
}
return id;
}