in src/afs.cc [1421:1461]
void process_connect_requests()
{
dshash_seq_status sessionsStatus;
dshash_seq_init(&sessionsStatus, sessions_, false);
SessionData* session;
while ((session = static_cast<SessionData*>(dshash_seq_next(&sessionsStatus))))
{
if (session->initialized)
{
continue;
}
BackgroundWorker worker = {0};
snprintf(
worker.bgw_name, BGW_MAXLEN, "%s: executor: %" PRIu64, Tag, session->id);
snprintf(
worker.bgw_type, BGW_MAXLEN, "%s: executor: %" PRIu64, Tag, session->id);
worker.bgw_flags =
BGWORKER_SHMEM_ACCESS | BGWORKER_BACKEND_DATABASE_CONNECTION;
worker.bgw_start_time = BgWorkerStart_ConsistentState;
worker.bgw_restart_time = BGW_NEVER_RESTART;
snprintf(worker.bgw_library_name, BGW_MAXLEN, "%s", LibraryName);
snprintf(worker.bgw_function_name, BGW_MAXLEN, "afs_executor");
worker.bgw_main_arg = Int64GetDatum(session->id);
worker.bgw_notify_pid = MyProcPid;
BackgroundWorkerHandle* handle;
if (RegisterDynamicBackgroundWorker(&worker, &handle))
{
WaitForBackgroundWorkerStartup(handle, &(session->executorPID));
}
else
{
set_shared_string(
session->errorMessage,
std::string(Tag) + ": " + tag_ +
": failed to start executor: " + std::to_string(session->id));
}
}
dshash_seq_term(&sessionsStatus);
kill(sharedData_->serverPID, SIGUSR1);
}