size_t Services_GetAlertCount (LPSERVICE lpService) { return Alert_GetCount (lpService->GetIdentifier()); }
BOOL SERVER::RefreshServices (BOOL fNotify, ULONG *pStatus) { BOOL rc = TRUE; DWORD status = 0; if (m_fServicesOutOfDate) { m_fServicesOutOfDate = FALSE; if (fIsMonitored()) { if (fNotify) NOTIFYCALLBACK::SendNotificationToAll (evtRefreshServicesBegin, GetIdentifier()); // First thing is to forget about what services we think we have now. // LPENUM pEnum; for (pEnum = m_lServices->FindLast(); pEnum; pEnum = pEnum->FindPrevious()) { LPSERVICE lpService = (LPSERVICE)(pEnum->GetObject()); lpService->SendDeleteNotifications(); m_lServices->Remove (lpService); Delete (lpService); } // Next, the harder part: look through the server to find a list // of services. // PVOID hCell; PVOID hBOS; if ((hBOS = OpenBosObject (&hCell, &status)) == NULL) rc = FALSE; else { WORKERPACKET wpBegin; wpBegin.wpBosProcessNameGetBegin.hServer = hBOS; if (!Worker_DoTask (wtaskBosProcessNameGetBegin, &wpBegin, &status)) rc = FALSE; else { LPSERVICE lpService = New2 (SERVICE,(this, TEXT("BOS"))); m_lServices->Add (lpService); NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpService->GetIdentifier()); for (;;) { TCHAR szServiceName[ cchNAME ]; WORKERPACKET wpNext; wpNext.wpBosProcessNameGetNext.hEnum = wpBegin.wpBosProcessNameGetBegin.hEnum; wpNext.wpBosProcessNameGetNext.pszService = szServiceName; if (!Worker_DoTask (wtaskBosProcessNameGetNext, &wpNext, &status)) { if (status == ADMITERATORDONE) status = 0; else rc = FALSE; break; } lpService = New2 (SERVICE,(this, wpNext.wpBosProcessNameGetNext.pszService)); m_lServices->Add (lpService); NOTIFYCALLBACK::SendNotificationToAll (evtCreate, lpService->GetIdentifier()); } WORKERPACKET wpDone; wpDone.wpBosProcessNameGetDone.hEnum = wpBegin.wpBosProcessNameGetBegin.hEnum; Worker_DoTask (wtaskBosProcessNameGetDone, &wpDone); } CloseBosObject(); } if (fNotify) NOTIFYCALLBACK::SendNotificationToAll (evtRefreshServicesEnd, GetIdentifier(), ((rc) ? 0 : status)); } } if (pStatus && !rc) *pStatus = status; return TRUE; }
BOOL Alert_Scout_CheckServer (LPSERVER lpServer) { BOOL rc = TRUE; LPSERVER_PREF lpsp; if ((lpsp = (LPSERVER_PREF)lpServer->GetUserParam()) != NULL) { LPOBJECTALERTS lpoa; if ((lpoa = Alert_GetObjectAlerts (lpServer->GetIdentifier())) != NULL) { PostNotification (evtScoutBegin, lpServer->GetIdentifier()); BOOL fChangedServerAlerts = FALSE; DWORD dwTickNextTestWhenStarted = lpoa->dwTickNextTest; // First look through the server's aggregates and filesets, to // find any which have usages over their warning threshholds. // HENUM heAggregate; for (LPAGGREGATE lpAggregate = lpServer->AggregateFindFirst (&heAggregate); lpAggregate; lpAggregate = lpServer->AggregateFindNext (&heAggregate)) { BOOL fChangedAggregateAlerts = FALSE; LPIDENT lpiAggregate = lpAggregate->GetIdentifier(); LPOBJECTALERTS lpoaAggregate; if ((lpoaAggregate = Alert_GetObjectAlerts (lpAggregate->GetIdentifier())) != NULL) { for (size_t iAlert = 0; iAlert < lpoaAggregate->nAlerts; ) { if ( (lpoaAggregate->aAlerts[ iAlert ].alert == alertFULL) || (lpoaAggregate->aAlerts[ iAlert ].alert == alertOVERALLOC) || (lpoaAggregate->aAlerts[ iAlert ].alert == alertNO_SVRENT) ) { fChangedAggregateAlerts = TRUE; fChangedServerAlerts = TRUE; Alert_Remove (lpAggregate->GetIdentifier(), iAlert); } else ++iAlert; } LPAGGREGATE_PREF lpap; if ((lpap = (LPAGGREGATE_PREF)lpAggregate->GetUserParam()) != NULL) { short wGhost = lpAggregate->GetGhostStatus(); if (lpsp->fWarnAggNoServ && !(wGhost & GHOST_HAS_SERVER_ENTRY)) { ALERTINFO ai; ai.alert = alertNO_SVRENT; Alert_AddPrimary (lpAggregate->GetIdentifier(), &ai); fChangedAggregateAlerts = TRUE; fChangedServerAlerts = TRUE; } if (lpsp->fWarnAggAlloc && lpap->fWarnAggAlloc) { AGGREGATESTATUS as; if (lpAggregate->GetStatus (&as, TRUE)) { if (as.ckStorageAllocated > as.ckStorageTotal) { ALERTINFO ai; ai.alert = alertOVERALLOC; ai.aiOVERALLOC.ckAllocated = as.ckStorageAllocated; ai.aiOVERALLOC.ckCapacity = as.ckStorageTotal; Alert_AddPrimary (lpAggregate->GetIdentifier(), &ai); fChangedAggregateAlerts = TRUE; fChangedServerAlerts = TRUE; } } } short perWarnAggFull = lpap->perWarnAggFull; if (perWarnAggFull == -1) perWarnAggFull = lpsp->perWarnAggFull; if (perWarnAggFull != 0) { AGGREGATESTATUS as; if (lpAggregate->GetStatus (&as, TRUE)) { if (as.ckStorageTotal != 0) { short perNow = (short)( (double)(as.ckStorageTotal - as.ckStorageFree) * 100.0 / (double)(as.ckStorageTotal) ); if (perNow > perWarnAggFull) { ALERTINFO ai; ai.alert = alertFULL; ai.aiFULL.perWarning = perWarnAggFull; ai.aiFULL.ckWarning = (ULONG)( (double)perWarnAggFull * (double)(as.ckStorageTotal) / 100.0 ); Alert_AddPrimary (lpAggregate->GetIdentifier(), &ai); fChangedAggregateAlerts = TRUE; fChangedServerAlerts = TRUE; } } } } } } HENUM heFileset; for (LPFILESET lpFileset = lpAggregate->FilesetFindFirst (&heFileset); lpFileset; lpFileset = lpAggregate->FilesetFindNext (&heFileset)) { BOOL fChangedFilesetAlerts = FALSE; LPIDENT lpiFileset = lpFileset->GetIdentifier(); LPOBJECTALERTS lpoaFileset; if ((lpoaFileset = Alert_GetObjectAlerts (lpFileset->GetIdentifier())) != NULL) { for (size_t iAlert = 0; iAlert < lpoaFileset->nAlerts; ) { if ( (lpoaFileset->aAlerts[ iAlert ].alert == alertFULL) || (lpoaFileset->aAlerts[ iAlert ].alert == alertSTATE_NO_VNODE) || (lpoaFileset->aAlerts[ iAlert ].alert == alertSTATE_NO_SERVICE) || (lpoaFileset->aAlerts[ iAlert ].alert == alertSTATE_OFFLINE) || (lpoaFileset->aAlerts[ iAlert ].alert == alertNO_VLDBENT) || (lpoaFileset->aAlerts[ iAlert ].alert == alertNO_SVRENT) ) { fChangedFilesetAlerts = TRUE; fChangedServerAlerts = TRUE; Alert_Remove (lpFileset->GetIdentifier(), iAlert); } else ++iAlert; } } LPFILESET_PREF lpfp; if ((lpfp = (LPFILESET_PREF)lpFileset->GetUserParam()) != NULL) { FILESETSTATUS fs; if (lpFileset->GetStatus (&fs, TRUE)) { if (fs.State & fsNO_VNODE) { ALERTINFO ai; ai.alert = alertSTATE_NO_VNODE; ai.aiSTATE.State = fs.State; Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); fChangedFilesetAlerts = TRUE; fChangedServerAlerts = TRUE; } else if (fs.State & fsNO_SERVICE) { ALERTINFO ai; ai.alert = alertSTATE_NO_SERVICE; ai.aiSTATE.State = fs.State; Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); fChangedFilesetAlerts = TRUE; fChangedServerAlerts = TRUE; } else if (fs.State & fsOFFLINE) { ALERTINFO ai; ai.alert = alertSTATE_OFFLINE; ai.aiSTATE.State = fs.State; Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); fChangedFilesetAlerts = TRUE; fChangedServerAlerts = TRUE; } short perWarnSetFull = lpfp->perWarnSetFull; if (perWarnSetFull == -1) perWarnSetFull = lpsp->perWarnSetFull; if (perWarnSetFull != 0) { if (fs.Type == ftREADWRITE) { if (fs.ckQuota != 0) { short perNow = (short)( (double)(fs.ckUsed) * 100.0 / (double)(fs.ckQuota) ); if (perNow > perWarnSetFull) { ALERTINFO ai; ai.alert = alertFULL; ai.aiFULL.perWarning = perWarnSetFull; ai.aiFULL.ckWarning = (ULONG)( (double)perWarnSetFull * (double)(fs.ckQuota) / 100.0 ); Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); fChangedFilesetAlerts = TRUE; fChangedServerAlerts = TRUE; } } } } } short wGhost = lpFileset->GetGhostStatus(); if (lpsp->fWarnSetNoVLDB && !(wGhost & GHOST_HAS_VLDB_ENTRY)) { ALERTINFO ai; ai.alert = alertNO_VLDBENT; Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); fChangedFilesetAlerts = TRUE; fChangedServerAlerts = TRUE; } if (lpsp->fWarnSetNoServ && !(wGhost & GHOST_HAS_SERVER_ENTRY) && !(fs.Type == ftREPLICA)) { ALERTINFO ai; ai.alert = alertNO_SVRENT; Alert_AddPrimary (lpFileset->GetIdentifier(), &ai); fChangedFilesetAlerts = TRUE; fChangedServerAlerts = TRUE; } } lpFileset->Close(); if (fChangedFilesetAlerts) { PostNotification (evtAlertsChanged, lpiFileset); } } lpAggregate->Close(); if (fChangedAggregateAlerts) { PostNotification (evtAlertsChanged, lpiAggregate); } } // Next look through the server's servces to find any // which have stopped. // HENUM heService; for (LPSERVICE lpService = lpServer->ServiceFindFirst (&heService); lpService; lpService = lpServer->ServiceFindNext (&heService)) { BOOL fChangedServiceAlerts = FALSE; LPIDENT lpiService = lpService->GetIdentifier(); LPOBJECTALERTS lpoaService; if ((lpoaService = Alert_GetObjectAlerts (lpService->GetIdentifier())) != NULL) { for (size_t iAlert = 0; iAlert < lpoaService->nAlerts; ) { if (lpoaService->aAlerts[ iAlert ].alert == alertSTOPPED) { fChangedServiceAlerts = TRUE; fChangedServerAlerts = TRUE; Alert_Remove (lpService->GetIdentifier(), iAlert); } else ++iAlert; } LPSERVICE_PREF lpcp; if ((lpcp = (LPSERVICE_PREF)lpService->GetUserParam()) != NULL) { if (lpcp->fWarnSvcStop && lpsp->fWarnSvcStop) { SERVICESTATUS ss; if (lpService->GetStatus (&ss, TRUE)) { if (ss.state != SERVICESTATE_RUNNING) { ALERTINFO ai; ai.alert = alertSTOPPED; memcpy (&ai.aiSTOPPED.stStopped, &ss.timeLastStop, sizeof(SYSTEMTIME)); memcpy (&ai.aiSTOPPED.stLastError, &ss.timeLastFail, sizeof(SYSTEMTIME)); ai.aiSTOPPED.errLastError = ss.dwErrLast; Alert_AddPrimary (lpService->GetIdentifier(), &ai); fChangedServiceAlerts = TRUE; fChangedServerAlerts = TRUE; } } } } } lpService->Close(); if (fChangedServiceAlerts) { PostNotification (evtAlertsChanged, lpiService); } } if (rc && (dwTickNextTestWhenStarted == lpoa->dwTickNextTest)) { Alert_Scout_SetUpToDate (lpoa); } if (fChangedServerAlerts) { PostNotification (evtAlertsChanged, lpServer->GetIdentifier()); } PostNotification (evtScoutEnd, lpServer->GetIdentifier()); } } return rc; }
BOOL SERVER::RefreshAll (ULONG *pStatus, double dInit, double dFactor) { BOOL rc = TRUE; ULONG status = 0; if (m_fAggregatesOutOfDate || m_fServicesOutOfDate) { if ((++cRefreshAllReq) == 1) { NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllBegin, GetIdentifier(), 0); } double perAGGREGATES = 65.0; // % of time spent finding aggs & sets double perSERVICES = 25.0; // % of time spent finding services double perVLDB = 10.0; // % of time spent finding VLDB info if (cRefreshAllReq >= 2) // being called as part of a cell-wide op? { perAGGREGATES = 80.0; // % of time spent finding aggs & sets perSERVICES = 20.0; // % of time spent finding services perVLDB = 0.0; // we won't query VLDB stuff ourself. } NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusBegin, GetIdentifier()); if (!CanTalkToServer (&status)) // Determines fCanGetAggregates, fCanGetServices { if (m_fMonitor) SetMonitor (FALSE); rc = FALSE; } else { if (!m_fCanGetAggregates) { FreeAggregates(); m_fAggregatesOutOfDate = FALSE; } else { size_t nAggregates = 0; size_t iAggregate = 0; HENUM hEnum; LPAGGREGATE lpAggregate; for (lpAggregate = AggregateFindFirst (&hEnum); lpAggregate; lpAggregate = AggregateFindNext (&hEnum)) { ++nAggregates; lpAggregate->Close(); } if (nAggregates) { for (lpAggregate = AggregateFindFirst (&hEnum); lpAggregate; lpAggregate = AggregateFindNext (&hEnum)) { ULONG perComplete = (ULONG)( ((double)perAGGREGATES / 100.0) * ((double)iAggregate * 100.0 / nAggregates) ); NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllUpdate, lpAggregate->GetIdentifier(), NULL, NULL, NULL, (ULONG)( 100.0 * dInit + dFactor * (double)perComplete ), 0); lpAggregate->RefreshFilesets (TRUE); lpAggregate->Close(); ++iAggregate; } } } if (!m_fCanGetServices) { FreeServices(); m_fServicesOutOfDate = FALSE; } else { size_t nServices = 0; size_t iService = 0; HENUM hEnum; LPSERVICE lpService; for (lpService = ServiceFindFirst (&hEnum); lpService; lpService = ServiceFindNext (&hEnum)) { ++nServices; lpService->Close(); } if (nServices) { for (lpService = ServiceFindFirst (&hEnum); lpService; lpService = ServiceFindNext (&hEnum)) { ULONG perComplete = (ULONG)( (double)perAGGREGATES + ((double)perSERVICES / 100.0) * ((double)iService * 100.0 / nServices) ); NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllUpdate, lpService->GetIdentifier(), NULL, NULL, NULL, (ULONG)( 100.0 * dInit + dFactor * (double)perComplete ), 0); lpService->RefreshStatus (TRUE); lpService->Close(); ++iService; } } } if (cRefreshAllReq == 1) // not being called as part of a cell-wide op? { LPCELL lpCell; if ((lpCell = OpenCell()) != NULL) { lpCell->RefreshVLDB (GetIdentifier(), TRUE, NULL); lpCell->Close(); } } } NOTIFYCALLBACK::SendNotificationToAll (evtRefreshStatusEnd, GetIdentifier(), m_lastStatus); if ((--cRefreshAllReq) == 0) { NOTIFYCALLBACK::SendNotificationToAll (evtRefreshAllEnd, GetIdentifier(), NULL, NULL, NULL, 100, m_lastStatus); } } if (rc && m_lastStatus) rc = FALSE; if (!rc && pStatus) *pStatus = status; return rc; }