// Must be called under the lock void CNSClientsRegistry::x_ClearClient(const string & node_name, CNSClient & client, TNSBitVector & jobs, bool & had_pref_affs, ECommandGroup cmd_group) { jobs = client.GetJobs(cmd_group); client.ClearJobs(cmd_group); // Deregister preferred affinities had_pref_affs = client.HasPreferredAffinities(cmd_group); if (had_pref_affs) { m_AffRegistry->RemoveClientFromAffinities( client.GetID(), client.GetPreferredAffinities(cmd_group), cmd_group); client.ClearPreferredAffinities(cmd_group); } CancelWaiting(client, cmd_group); if (had_pref_affs) x_BuildAffinities(cmd_group); // Client has gone. No need to remember it if it was // garbage collected previously. if (cmd_group == eGet) m_GCWNodeClients.erase(node_name); else m_GCReaderClients.erase(node_name); }
bool CNSClientsRegistry::CancelWaiting(const CNSClientId & client, ECommandGroup cmd_group) { // Check if it is an old-style client if (client.IsComplete()) return CancelWaiting(client.GetNode(), cmd_group); return false; }
bool CNSClientsRegistry::CancelWaiting(const string & node_name, ECommandGroup cmd_group, bool touch_notif_registry) { if (node_name.empty()) return false; CMutexGuard guard(m_Lock); map< string, CNSClient >::iterator cl = m_Clients.find(node_name); if (cl != m_Clients.end()) return CancelWaiting(cl->second, cmd_group, touch_notif_registry); return false; }
static DWORD TimerHandler(LPVOID lpParam) { __TIMER_HANDLER_PARAM* lpHandlerParam = NULL; if(NULL == lpParam) return 0L; lpHandlerParam = (__TIMER_HANDLER_PARAM*)lpParam; //if(lpHandlerParam->bCanceled) //The timer is canceled by the current kernel thread. // goto __TERMINAL; if(CancelWaiting((__COMMON_OBJECT*)lpHandlerParam->lpMailBox, (__COMMON_OBJECT*)lpHandlerParam->lpKernelThread)) { lpHandlerParam->dwWakenupReason = WAKEN_UP_REASON_TIMEOUT; } return 0L; }
// Must be called under a lock // When a client inactivity timeout is detected there is no need to touch the // running or reading jobs. The only things to be done are: // - cancel waiting // - reset pref affinities // - set reset affinity flag // - log the event void CNSClientsRegistry::ClearOnTimeout(CNSClient & client, const string & client_node, bool is_log, ECommandGroup cmd_group) { // Deregister preferred affinities bool had_pref_affs = client.HasPreferredAffinities(cmd_group); if (had_pref_affs) { m_AffRegistry->RemoveClientFromAffinities( client.GetID(), client.GetPreferredAffinities(cmd_group), cmd_group); client.ClearPreferredAffinities(cmd_group); if (is_log) { string aff_part = "get"; if (cmd_group == eRead) aff_part = "read"; CRef<CRequestContext> ctx; ctx.Reset(new CRequestContext()); ctx->SetRequestID(); GetDiagContext().SetRequestContext(ctx); GetDiagContext().PrintRequestStart() .Print("_type", "client_watch") .Print("client_node", client_node) .Print("client_session", client.GetSession()) .Print(aff_part + "_preferred_affinities_reset", "yes"); ctx->SetRequestStatus(CNetScheduleHandler::eStatus_OK); GetDiagContext().PrintRequestStop(); } client.SetAffinityReset(true, cmd_group); } CancelWaiting(client, cmd_group); if (had_pref_affs) x_BuildAffinities(cmd_group); }