//------------------------------------------------------------------------------ void WESplClient::onDisconnect() { //TODO // - set fContinue to false - set the thread free setContinue(false); setConnected(false); setRollbackRslt(-1); setCleanupRslt(-1); if((!fCpiPassed)&&(!fCpiFailed)) //a hard disconnection { fOwner.onCpimportFail(fPmId); fOwner.setDisconnectFailure(true); } // update all the flags of disconnect. // alert on roll back // do not allow to connect back again. try { // send alarm SNMPManager alarmMgr; //std::string alarmItem = sin_addr2String(fClnt->serv_addr().sin_addr); std::string alarmItem = fClnt->addr2String(); alarmItem.append(" WriteEngineServer"); alarmMgr.sendAlarmReport(alarmItem.c_str(), oam::CONN_FAILURE, SET); } catch(...) { // just ignore it for time being. } }
/****************************************************************************************** * @brief sendAlarm * * purpose: send a trap and log the process information * ******************************************************************************************/ void ServerMonitor::sendAlarm(string alarmItem, ALARMS alarmID, int action, float sensorValue) { ServerMonitor serverMonitor; Oam oam; //Log this event LoggingID lid(SERVER_MONITOR_LOG_ID); MessageLog ml(lid); Message msg; Message::Args args; args.add(alarmItem); args.add(", sensor value out-of-range: "); args.add(sensorValue); // get current server name string moduleName; oamModuleInfo_t st; try { st = oam.getModuleInfo(); moduleName = boost::get<0>(st); } catch (...) { moduleName = "Unknown Server"; } // check if there is an active alarm above the reporting theshold // that needs to be cleared serverMonitor.checkAlarm(alarmItem, alarmID); // check if Alarm is already active, don't resend if ( !( oam.checkActiveAlarm(alarmID, moduleName, alarmItem)) ) { SNMPManager alarmMgr; // send alarm alarmMgr.sendAlarmReport(alarmItem.c_str(), alarmID, action); args.add(", Alarm set: "); args.add(alarmID); } // output log msg.format(args); ml.logWarningMessage(msg); return; }
/****************************************************************************************** * @brief clearAlarm * * purpose: clear Alarm that was previously set * ******************************************************************************************/ void ServerMonitor::clearAlarm(string alarmItem, ALARMS alarmID) { SNMPManager alarmMgr; alarmMgr.sendAlarmReport(alarmItem.c_str(), alarmID, CLEAR); //Log this event LoggingID lid(SERVER_MONITOR_LOG_ID); MessageLog ml(lid); Message msg; Message::Args args; args.add(alarmItem); args.add(" alarm #"); args.add(alarmID); args.add("cleared"); msg.format(args); ml.logWarningMessage(msg); }
/****************************************************************************************** * @brief sendResourceAlarm * * purpose: send a trap and log the process information * ******************************************************************************************/ bool ServerMonitor::sendResourceAlarm(string alarmItem, ALARMS alarmID, int action, int usage) { ServerMonitor serverMonitor; Oam oam; //Log this event LoggingID lid(SERVER_MONITOR_LOG_ID); MessageLog ml(lid); Message msg; Message::Args args; args.add(alarmItem); args.add(" usage at percentage of "); args.add(usage); // get current module name string moduleName; oamModuleInfo_t st; try { st = oam.getModuleInfo(); moduleName = boost::get<0>(st); } catch (...) { moduleName = "Unknown Server"; } // check if there is an active alarm above the reporting theshold // that needs to be cleared if (alarmItem == "CPU") serverMonitor.checkCPUAlarm(alarmItem, alarmID); else if (alarmItem == "Local Disk" || alarmItem == "External") serverMonitor.checkDiskAlarm(alarmItem, alarmID); else if (alarmItem == "Local Memory") serverMonitor.checkMemoryAlarm(alarmItem, alarmID); else if (alarmItem == "Local Swap") serverMonitor.checkSwapAlarm(alarmItem, alarmID); // don't issue an alarm on thge dbroots is already issued by this or another server if ( alarmItem.find(startup::StartUp::installDir() + "/data") == 0 ) { // check if Alarm is already active from any module, don't resend if ( !( oam.checkActiveAlarm(alarmID, "*", alarmItem)) ) { SNMPManager alarmMgr; // send alarm alarmMgr.sendAlarmReport(alarmItem.c_str(), alarmID, action); args.add(", Alarm set: "); args.add(alarmID); msg.format(args); ml.logInfoMessage(msg); return true; } else return false; } else { // check if Alarm is already active from this module, don't resend if ( !( oam.checkActiveAlarm(alarmID, moduleName, alarmItem)) ) { SNMPManager alarmMgr; // send alarm alarmMgr.sendAlarmReport(alarmItem.c_str(), alarmID, action); args.add(", Alarm set: "); args.add(alarmID); msg.format(args); ml.logInfoMessage(msg); return true; } else return false; } return true; }
void WEClients::Listen ( boost::shared_ptr<MessageQueueClient> client, uint32_t connIndex) { SBS sbs; try { while ( Busy() ) { //TODO: This call blocks so setting Busy() in another thread doesn't work here... sbs = client->read(); if ( sbs->length() != 0 ) { //cout << "adding data to connIndex " << endl; addDataToOutput(sbs, connIndex); } else // got zero bytes on read, nothing more will come { if (closingConnection > 0) { return; } cerr << "WEC got 0 byte message for object " << this << endl; goto Error; } } return; } catch (std::exception& e) { cerr << "WEC Caught EXCEPTION: " << e.what() << endl; goto Error; } catch (...) { cerr << "WEC Caught UNKNOWN EXCEPT" << endl; goto Error; } Error: // error condition! push 0 length bs to messagequeuemap and // eventually let jobstep error out. mutex::scoped_lock lk(fMlock); MessageQueueMap::iterator map_tok; sbs.reset(new ByteStream(0)); for (map_tok = fSessionMessages.begin(); map_tok != fSessionMessages.end(); ++map_tok) { map_tok->second->queue.clear(); (void)atomicops::atomicInc(&map_tok->second->unackedWork[0]); map_tok->second->queue.push(sbs); } lk.unlock(); // reset the pmconnection map { mutex::scoped_lock onErrLock(fOnErrMutex); string moduleName = client->moduleName(); ClientList::iterator itor = fPmConnections.begin(); while (itor != fPmConnections.end()) { if (moduleName == (itor->second)->moduleName()) { (fPmConnections[itor->first]).reset(); pmCount--; ostringstream oss; //oss << "WECLIENT: connection to is reset and this = " << this << " and pmcount is decremented."; //writeToLog(__FILE__, __LINE__, oss.str() , LOG_TYPE_DEBUG); } itor++; } // send alarm SNMPManager alarmMgr; // string alarmItem = sin_addr2String(client->serv_addr().sin_addr); string alarmItem = client->addr2String(); alarmItem.append(" WriteEngineServer"); alarmMgr.sendAlarmReport(alarmItem.c_str(), oam::CONN_FAILURE, SET); } return; }