Skip to content
Snippets Groups Projects
Commit 021af9f0 authored by Ruud Overeem's avatar Ruud Overeem
Browse files

BugID: 1000

Uses 'forcedQuitTimer' for guaranteed stop 5 econds after stoptime is reached.
Implemented begin of quality criteria.
parent 30c19d4c
No related branches found
No related tags found
No related merge requests found
...@@ -66,10 +66,14 @@ ObservationControl::ObservationControl(const string& cntlrName) : ...@@ -66,10 +66,14 @@ ObservationControl::ObservationControl(const string& cntlrName) :
itsParentPort (0), itsParentPort (0),
itsTimerPort (0), itsTimerPort (0),
itsState (CTState::NOSTATE), itsState (CTState::NOSTATE),
itsNrControllers (0),
itsBusyControllers (0),
itsQuitReason (CT_RESULT_NO_ERROR),
itsClaimTimer (0), itsClaimTimer (0),
itsPrepareTimer (0), itsPrepareTimer (0),
itsStartTimer (0), itsStartTimer (0),
itsStopTimer (0), itsStopTimer (0),
itsForcedQuitTimer (0),
itsHeartBeatTimer (0), itsHeartBeatTimer (0),
itsHeartBeatItv (0) itsHeartBeatItv (0)
{ {
...@@ -464,6 +468,7 @@ GCFEvent::TResult ObservationControl::active_state(GCFEvent& event, GCFPortInter ...@@ -464,6 +468,7 @@ GCFEvent::TResult ObservationControl::active_state(GCFEvent& event, GCFPortInter
case F_ENTRY: { case F_ENTRY: {
// convert times and periods to timersettings. // convert times and periods to timersettings.
itsChildControl->startChildControllers(); itsChildControl->startChildControllers();
itsNrControllers = itsChildControl->countChilds(0, CNTLRTYPE_NO_TYPE);
setObservationTimers(); setObservationTimers();
itsHeartBeatTimer = itsTimerPort->setTimer(1.0 * itsHeartBeatItv); itsHeartBeatTimer = itsTimerPort->setTimer(1.0 * itsHeartBeatItv);
break; break;
...@@ -516,6 +521,13 @@ GCFEvent::TResult ObservationControl::active_state(GCFEvent& event, GCFPortInter ...@@ -516,6 +521,13 @@ GCFEvent::TResult ObservationControl::active_state(GCFEvent& event, GCFPortInter
LOG_DEBUG("Requesting all childs to quit"); LOG_DEBUG("Requesting all childs to quit");
itsChildControl->requestState(CTState::QUITED, ""); itsChildControl->requestState(CTState::QUITED, "");
itsBusyControllers = itsChildControl->countChilds(0, CNTLRTYPE_NO_TYPE); itsBusyControllers = itsChildControl->countChilds(0, CNTLRTYPE_NO_TYPE);
// reschedule forced-quit timer for safety.
itsTimerPort->cancelTimer(itsForcedQuitTimer);
itsForcedQuitTimer = itsTimerPort->setTimer(5.0);
}
else if (timerEvent.id == itsForcedQuitTimer) {
LOG_WARN("QUITING BEFORE ALL CHILDREN DIED.");
TRAN(ObservationControl::finishing_state);
} }
// some other timer? // some other timer?
...@@ -636,17 +648,24 @@ GCFEvent::TResult ObservationControl::finishing_state(GCFEvent& event, ...@@ -636,17 +648,24 @@ GCFEvent::TResult ObservationControl::finishing_state(GCFEvent& event,
break; break;
case F_ENTRY: { case F_ENTRY: {
// first turn off 'old' timers
itsTimerPort->cancelTimer(itsForcedQuitTimer);
itsTimerPort->cancelTimer(itsStopTimer);
// tell Parent task we like to go down.
itsParentControl->nowInState(getName(), CTState::QUIT);
// inform MACScheduler we are going down // inform MACScheduler we are going down
CONTROLQuitedEvent msg; CONTROLQuitedEvent msg;
msg.cntlrName = getName(); msg.cntlrName = getName();
msg.result = CT_RESULT_NO_ERROR; msg.result = itsQuitReason;;
itsParentPort->send(msg); itsParentPort->send(msg);
// update PVSS // update PVSS
itsPropertySet->setValue(string(PVSSNAME_FSM_CURACT),GCFPVString("finished")); itsPropertySet->setValue(string(PVSSNAME_FSM_CURACT),GCFPVString("finished"));
itsPropertySet->setValue(string(PVSSNAME_FSM_ERROR),GCFPVString("")); itsPropertySet->setValue(string(PVSSNAME_FSM_ERROR),GCFPVString(""));
itsTimerPort->setTimer(1L); itsTimerPort->setTimer(1L); // give PVSS task some time to update the DB.
break; break;
} }
...@@ -680,7 +699,9 @@ void ObservationControl::setObservationTimers() ...@@ -680,7 +699,9 @@ void ObservationControl::setObservationTimers()
itsTimerPort->cancelTimer(itsPrepareTimer); itsTimerPort->cancelTimer(itsPrepareTimer);
itsTimerPort->cancelTimer(itsStartTimer); itsTimerPort->cancelTimer(itsStartTimer);
itsTimerPort->cancelTimer(itsStopTimer); itsTimerPort->cancelTimer(itsStopTimer);
itsClaimTimer = itsPrepareTimer = itsStartTimer = itsStopTimer = 0; itsTimerPort->cancelTimer(itsForcedQuitTimer);
itsClaimTimer = itsPrepareTimer = itsStartTimer =
itsStopTimer = itsForcedQuitTimer = 0;
// recalc new intervals // recalc new intervals
int32 sec2claim = start - now - itsPreparePeriod - itsClaimPeriod; int32 sec2claim = start - now - itsPreparePeriod - itsClaimPeriod;
...@@ -730,6 +751,8 @@ void ObservationControl::setObservationTimers() ...@@ -730,6 +751,8 @@ void ObservationControl::setObservationTimers()
if (itsState < CTState::RELEASE) { // not yet shutting down? if (itsState < CTState::RELEASE) { // not yet shutting down?
if (sec2stop > 0) { if (sec2stop > 0) {
itsStopTimer = itsTimerPort->setTimer(1.0 * sec2stop); itsStopTimer = itsTimerPort->setTimer(1.0 * sec2stop);
// make sure we go down 5 seconds after quit was requested.
itsForcedQuitTimer = itsTimerPort->setTimer(sec2stop + 5.0);
LOG_DEBUG_STR ("Observation stops over " << sec2stop << " seconds"); LOG_DEBUG_STR ("Observation stops over " << sec2stop << " seconds");
} }
else { else {
...@@ -768,6 +791,20 @@ void ObservationControl::doHeartBeatTask() ...@@ -768,6 +791,20 @@ void ObservationControl::doHeartBeatTask()
vector<ChildControl::StateInfo> lateCntlrs = vector<ChildControl::StateInfo> lateCntlrs =
itsChildControl->getPendingRequest("", 0, CNTLRTYPE_NO_TYPE); itsChildControl->getPendingRequest("", 0, CNTLRTYPE_NO_TYPE);
// check if enough stations are left too do our job.
// TODO: add criteria to SAS database and test those iso this foolish criteria.
if (nrChilds != itsNrControllers) {
LOG_WARN_STR("Only " << nrChilds << " out of " << itsNrControllers << " stations still available.");
// if no more children left while we are not in the quit-phase (stoptimer still running)
if (!nrChilds && itsStopTimer) {
LOG_FATAL("Too less stations left, FORCING QUIT OF OBSERVATION");
itsQuitReason = CT_RESULT_LOST_CONNECTION;
itsTimerPort->cancelTimer(itsStopTimer);
itsStopTimer = itsTimerPort->setTimer(0.0);
return;
}
}
LOG_TRACE_FLOW_STR("itsBusyControllers=" << itsBusyControllers); LOG_TRACE_FLOW_STR("itsBusyControllers=" << itsBusyControllers);
// all controllers up to date? // all controllers up to date?
...@@ -779,8 +816,8 @@ void ObservationControl::doHeartBeatTask() ...@@ -779,8 +816,8 @@ void ObservationControl::doHeartBeatTask()
return; return;
} }
if (itsBusyControllers) { // last time not all cntrls ready? if (itsBusyControllers) { // last time NOT all cntrls ready?
CTState cts; CTState cts; // report that state is reached.
setState(cts.stateAck(itsState)); setState(cts.stateAck(itsState));
itsBusyControllers = 0; itsBusyControllers = 0;
// inform Parent (ignore funtion-result) // inform Parent (ignore funtion-result)
......
...@@ -130,14 +130,17 @@ private: ...@@ -130,14 +130,17 @@ private:
GCFTimerPort* itsTimerPort; GCFTimerPort* itsTimerPort;
CTState::CTstateNr itsState; CTState::CTstateNr itsState;
uint32 itsNrControllers;
uint32 itsBusyControllers; uint32 itsBusyControllers;
uint16 itsChildResult; uint16 itsChildResult;
uint16 itsQuitReason;
// timers for the several stages. // timers for the several stages.
uint32 itsClaimTimer; uint32 itsClaimTimer;
uint32 itsPrepareTimer; uint32 itsPrepareTimer;
uint32 itsStartTimer; uint32 itsStartTimer;
uint32 itsStopTimer; uint32 itsStopTimer;
uint32 itsForcedQuitTimer;
uint32 itsHeartBeatTimer; uint32 itsHeartBeatTimer;
// ParameterSet variables // ParameterSet variables
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment