Пример #1
0
// 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);
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
// 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);
}