bool TraceSvcJrd::checkAliveAndFlags(ULONG sesId, int& flags) { ConfigStorage* storage = TraceManager::getStorage(); bool alive = (m_chg_number == storage->getChangeNumber()); if (!alive) { // look if our session still alive StorageGuard guard(storage); TraceSession readSession(*getDefaultMemoryPool()); storage->restart(); while (storage->getNextSession(readSession)) { if (readSession.ses_id == sesId) { alive = true; flags = readSession.ses_flags; break; } } m_chg_number = storage->getChangeNumber(); } return alive; }
void TraceSvcJrd::startSession(TraceSession& session, bool interactive) { if (!TraceManager::pluginsCount()) { m_svc.printf(false, "Can not start trace session. There are no trace plugins loaded\n"); return; } ConfigStorage* storage = TraceManager::getStorage(); { // scope StorageGuard guard(storage); session.ses_auth = m_authBlock; session.ses_user = m_user; MetaName role = m_role; UserId::makeRoleName(role, SQL_DIALECT_V6); session.ses_role = role.c_str(); session.ses_flags = trs_active; if (m_admin) { session.ses_flags |= trs_admin; } if (interactive) { Guid guid; GenerateGuid(&guid); char* buff = session.ses_logfile.getBuffer(GUID_BUFF_SIZE); GuidToString(buff, &guid); session.ses_logfile.insert(0, "fb_trace."); } storage->addSession(session); m_chg_number = storage->getChangeNumber(); } m_svc.started(); m_svc.printf(false, "Trace session ID %ld started\n", session.ses_id); if (interactive) { readSession(session); { StorageGuard guard(storage); storage->removeSession(session.ses_id); } } }
void TraceManager::update_sessions() { SortedArray<ULONG> liveSessions(*getDefaultMemoryPool()); { // scope ConfigStorage* storage = getStorage(); StorageGuard guard(storage); storage->restart(); TraceSession session(*getDefaultMemoryPool()); while (storage->getNextSession(session)) { if ((session.ses_flags & trs_active) && !(session.ses_flags & trs_log_full)) { update_session(session); liveSessions.add(session.ses_id); } } changeNumber = storage->getChangeNumber(); } // remove sessions not present in storage FB_SIZE_T i = 0; while (i < trace_sessions.getCount()) { FB_SIZE_T pos; if (liveSessions.find(trace_sessions[i].ses_id, pos)) { i++; } else { trace_sessions[i].plugin->release(); trace_sessions.remove(i); } } // nothing to trace, clear needs if (trace_sessions.getCount() == 0) { trace_needs = 0; } }