1 #include "daq/expreco/ERecoMasterCallback.h"
3 #include "daq/expreco/ERecoRunControlCallback.h"
5 #include "daq/rfarm/manager/RFCommand.h"
6 #include "daq/rfarm/manager/RfNodeInfo.h"
7 #include "daq/rfarm/manager/RfUnitInfo.h"
9 #include <daq/slc/nsm/NSMCommunicator.h>
10 #include <daq/slc/runcontrol/RCCommand.h>
11 #include <daq/slc/runcontrol/RCHandlerException.h>
12 #include <daq/slc/system/Time.h>
14 #include <daq/slc/base/StringUtil.h>
15 #include <daq/slc/base/TimeoutException.h>
19 ERecoMasterCallback::ERecoMasterCallback(
ConfigFile& config) : m_callback(NULL)
21 reg(RFCommand::CONFIGURE);
22 reg(RFCommand::UNCONFIGURE);
23 reg(RFCommand::START);
25 reg(RFCommand::RESUME);
26 reg(RFCommand::PAUSE);
27 reg(RFCommand::RESTART);
28 reg(RFCommand::STATUS);
30 m_rcnode =
NSMNode(config.get(
"ereco.rcnode"));
31 LogFile::debug(
"ERecoMaster started: Bridge Node = %s", m_rcnode.getName().c_str());
34 void ERecoMasterCallback::initialize(
const DBObject& obj)
39 void ERecoMasterCallback::configure(
const DBObject& obj)
41 m_nodes = NSMNodeList();
42 m_dataname = StringList();
43 const std::string format = obj(
"system").getText(
"nsmdata");
45 if (obj.hasObject(
"dqmserver")) {
46 m_nodes.push_back(
NSMNode(obj(
"dqmserver").getText(
"nodename")));
49 std::string nodename = obj(
"distributor").getText(
"nodename");
50 m_nodes.push_back(
NSMNode(nodename));
51 addData(nodename, format);
53 const DBObject& processor(obj(
"processor"));
54 int maxnodes = processor.getInt(
"nnodes");
55 int idbase = processor.getInt(
"idbase");
56 std::string hostbase = processor.getText(
"nodebase");
57 std::string badlist = processor.getText(
"badlist");
59 for (
int i = 0; i < maxnodes; i++) {
60 sprintf(idname,
"%2.2d", idbase + i);
61 if (badlist.size() == 0 || StringUtil::find(badlist, idname)) {
62 nodename = StringUtil::form(
"evp_%s%2.2d", hostbase.c_str(), idbase + i);
63 m_nodes.push_back(
NSMNode(nodename));
64 addData(nodename, format);
68 nodename = obj(
"eventsampler").getText(
"nodename");
69 m_nodes.push_back(
NSMNode(nodename));
73 std::string rcconf = obj.getName();
74 if (StringUtil::find(rcconf,
"@")) {
75 rcconf = StringUtil::split(rcconf,
'@')[1];
77 for (NSMNodeList::iterator it = m_nodes.begin();
78 it != m_nodes.end(); it++) {
81 std::string vname = StringUtil::form(
"node[%d]", i++);
82 add(
new NSMVHandlerText(vname +
".rcstate",
true,
false, s.getLabel()));
85 StringUtil::tolower(node.getName())));
86 vname = StringUtil::tolower(node.getName());
87 add(
new NSMVHandlerText(vname +
".rcstate",
true,
false, s.getLabel()));
92 void ERecoMasterCallback::setState(
NSMNode& node,
const RCState& state)
96 for (NSMNodeList::iterator it = m_nodes.begin();
97 it != m_nodes.end(); it++) {
99 if (StringUtil::toupper(rnode.getName()) == StringUtil::toupper(node.getName())) {
100 std::string vname = StringUtil::form(
"node[%d].rcstate", i);
101 set(vname, state.getLabel());
106 std::string vname = StringUtil::tolower(node.getName()) +
".rcstate";
107 set(vname, state.getLabel());
110 void ERecoMasterCallback::monitor()
112 if (!m_callback->getData().isAvailable())
return;
114 unitinfo->nnodes = m_dataname.size();
115 unitinfo->updatetime =
Time().get();
116 unitinfo->rcstate = getNode().getState().getId();
118 for (StringList::iterator it = m_dataname.begin();
119 it != m_dataname.end(); it++) {
122 if (data.isAvailable()) {
125 memcpy(nodeinfo_o, nodeinfo_i,
sizeof(
RfNodeInfo));
130 static unsigned long long count = 0;
131 for (NSMNodeList::iterator it = m_nodes.begin(); it != m_nodes.end(); it++) {
133 if (count % 60 == 59 || node.getState() == RCState::UNKNOWN) {
134 if (NSMCommunicator::send(
NSMMessage(node, RFCommand::STATUS))) {
136 setState(node, RCState::UNKNOWN);
143 void ERecoMasterCallback::ok(
const char* nodename,
const char* data)
145 for (NSMNodeList::iterator it = m_nodes.begin();
146 it != m_nodes.end(); it++) {
148 if (node.getName() == nodename) {
149 if (strcmp(data,
"Configured") == 0) {
150 setState(node, RCState::READY_S);
151 }
else if (strcmp(data,
"Unconfigured") == 0) {
152 setState(node, RCState::NOTREADY_S);
153 }
else if (strcmp(data,
"Stopped") == 0) {
154 setState(node, RCState::READY_S);
155 }
else if (strcmp(data,
"Running") == 0) {
156 setState(node, RCState::RUNNING_S);
157 }
else if (strcmp(data,
"Idle") == 0) {
158 setState(node, RCState::PAUSED_S);
160 LogFile::debug(
"OK << %s (%s)", nodename, data);
164 LogFile::warning(
"OK from unknown node %s (%s)", nodename, data);
167 void ERecoMasterCallback::error(
const char* nodename,
const char* data)
169 for (NSMNodeList::iterator it = m_nodes.begin();
170 it != m_nodes.end(); it++) {
172 if (node.getName() == nodename) {
173 LogFile::error(
"ERROR << %s (%s)", nodename, data);
174 setState(node, RCState::NOTREADY_S);
178 LogFile::warning(
"Error from unknwon node %s : %s)", nodename, data);
181 void ERecoMasterCallback::load(
const DBObject& db,
const std::string& runtype)
183 for (NSMNodeList::iterator it = m_nodes.begin(); it != m_nodes.end(); it++) {
185 printf(
"Loading : %s\n", node.getName().c_str());
186 if (node.getName().find(
"EVP") == std::string::npos) {
188 bool configured =
true;
189 for (NSMNodeList::iterator it2 = m_nodes.begin();
191 if (it2->getState() != RCState::READY_S)
194 if (configured)
break;
196 perform(NSMCommunicator::select(30));
200 if (node.getState() != RCState::READY_S) {
201 printf(
"ERecoMasterCallback::load : loading %s\n", (node.getName()).c_str());
202 if (NSMCommunicator::send(
NSMMessage(node, RCCommand::LOAD))) {
203 setState(node, RCState::LOADING_TS);
204 LogFile::debug(
"%s >> LOADING", node.getName().c_str());
209 LogFile::debug(
"%s is READY", node.getName().c_str());
213 bool configured =
true;
214 for (NSMNodeList::iterator it = m_nodes.begin(); it != m_nodes.end(); it++) {
215 if (it->getState() != RCState::READY_S) configured =
false;
217 if (configured)
break;
219 perform(NSMCommunicator::select(30));
222 if (m_callback != NULL)
223 m_callback->setState(RCState::READY_S);
224 RCCallback::setState(RCState::READY_S);
227 void ERecoMasterCallback::abort()
229 for (NSMNodeList::reverse_iterator it = m_nodes.rbegin();
230 it != m_nodes.rend(); it++) {
232 if (node.getName().find(
"EVP") == std::string::npos) {
234 bool unconfigured =
true;
235 for (NSMNodeList::reverse_iterator it2 = m_nodes.rbegin();
237 if (it2->getState() != RCState::NOTREADY_S)
238 unconfigured =
false;
240 if (unconfigured)
break;
242 perform(NSMCommunicator::select(30));
246 if (node.getState() != RCState::NOTREADY_S) {
247 if (NSMCommunicator::send(
NSMMessage(node, RCCommand::ABORT))) {
248 setState(node, RCState::ABORTING_RS);
249 LogFile::debug(
"%s >> ABORTING", node.getName().c_str());
254 LogFile::debug(
"%s is NOTREADY", node.getName().c_str());
258 bool unconfigured =
true;
259 for (NSMNodeList::reverse_iterator it = m_nodes.rbegin(); it != m_nodes.rend(); it++) {
260 if (it->getState() != RCState::NOTREADY_S) unconfigured =
false;
262 if (unconfigured)
break;
264 perform(NSMCommunicator::select(30));
267 if (m_callback != NULL)
268 m_callback->setState(RCState::NOTREADY_S);
269 RCCallback::setState(RCState::NOTREADY_S);
272 void ERecoMasterCallback::start(
int expno,
int runno)
274 int pars[] = {expno, runno};
276 if (getNode().
getName().find(
"_") != std::string::npos) {
277 get(
"hlt.script", script);
280 LogFile::debug(
"asking database : node = %s", m_rcnode.getName().c_str());
281 get(m_rcnode,
"RUNCONTROL@hlt.script", script);
284 script =
"run_" + script +
".py";
285 printf(
"ERECO script = %s\n", script.c_str());
287 for (NSMNodeList::iterator it = m_nodes.begin(); it != m_nodes.end(); it++) {
289 if (node.getName().find(
"EVP") == std::string::npos) {
291 bool configured =
true;
292 for (NSMNodeList::iterator it2 = m_nodes.begin();
294 if (it2->getState() != RCState::RUNNING_S)
297 if (configured)
break;
299 perform(NSMCommunicator::select(30));
303 if (node.getState() != RCState::RUNNING_S) {
304 if (NSMCommunicator::send(
NSMMessage(node, RCCommand::START, 2, pars, script))) {
305 setState(node, RCState::STARTING_TS);
306 LogFile::debug(
"%s >> STARTING (script=%s)", node.getName().c_str(), script.c_str());
311 LogFile::debug(
"%s is RUNNING", node.getName().c_str());
315 bool configured =
true;
316 for (NSMNodeList::iterator it = m_nodes.begin(); it != m_nodes.end(); it++) {
317 if (it->getState() != RCState::RUNNING_S) configured =
false;
319 if (configured)
break;
321 perform(NSMCommunicator::select(30));
324 if (m_callback != NULL)
325 m_callback->setState(RCState::RUNNING_S);
326 RCCallback::setState(RCState::RUNNING_S);
329 void ERecoMasterCallback::stop()
331 for (NSMNodeList::reverse_iterator it = m_nodes.rbegin();
332 it != m_nodes.rend(); it++) {
334 if (node.getName().find(
"EVP") == std::string::npos) {
336 bool unconfigured =
true;
337 for (NSMNodeList::reverse_iterator it2 = m_nodes.rbegin();
339 if (it2->getState() != RCState::READY_S)
340 unconfigured =
false;
342 if (unconfigured)
break;
344 perform(NSMCommunicator::select(30));
348 if (node.getState() != RCState::READY_S) {
349 if (NSMCommunicator::send(
NSMMessage(node, RCCommand::STOP))) {
350 setState(node, RCState::STOPPING_TS);
351 LogFile::debug(
"%s >> STOPPING", node.getName().c_str());
356 LogFile::debug(
"%s is READY", node.getName().c_str());
360 bool unconfigured =
true;
361 for (NSMNodeList::reverse_iterator it = m_nodes.rbegin(); it != m_nodes.rend(); it++) {
362 if (it->getState() != RCState::READY_S) unconfigured =
false;
364 if (unconfigured)
break;
366 perform(NSMCommunicator::select(30));
369 if (m_callback != NULL)
370 m_callback->setState(RCState::READY_S);
371 RCCallback::setState(RCState::READY_S);
374 bool ERecoMasterCallback::pause()
379 bool ERecoMasterCallback::resume(
int )
384 void ERecoMasterCallback::recover(
const DBObject& obj,
const std::string& runtype)
390 void ERecoMasterCallback::addData(
const std::string& dataname,
const std::string& format)
392 openData(dataname, format);
393 int i = (int)m_dataname.size();
394 std::string vname = StringUtil::form(
"data[%d].name", i);
395 add(
new NSMVHandlerText(vname,
true,
false, StringUtil::tolower(dataname)));
396 vname = StringUtil::form(
"data[%d].format", i);
398 m_dataname.push_back(dataname);
404 if (RCCallback::perform(com)) {
407 const RFCommand cmd = msg.getRequestName();
409 if (cmd == RFCommand::CONFIGURE) {
410 load(getDBObject(),
"");
412 }
else if (cmd == RFCommand::UNCONFIGURE) {
415 }
else if (cmd == RFCommand::START) {
417 }
else if (cmd == RFCommand::STOP) {
419 }
else if (cmd == RFCommand::RESTART) {
421 }
else if (cmd == RFCommand::PAUSE) {
423 }
else if (cmd == RFCommand::RESUME) {
425 }
else if (cmd == RFCommand::STATUS) {
429 std::string emsg = StringUtil::form(
"%s. aborting",
e.what());
430 LogFile::error(emsg);
433 RCCallback::setState(RCState::ABORTING_RS);
435 RCCallback::setState(RCState::NOTREADY_S);
437 std::string emsg = StringUtil::form(
"Failed to abort : %s",
e.what());
438 LogFile::fatal(emsg);
440 }
catch (
const std::exception& e) {
441 LogFile::fatal(
"Unknown exception: %s. terminating process",
e.what());