// For detSpec is used the alias name.
//
+#include <stdexcept>
#include "AliShuttle.h"
#include "AliCDBManager.h"
#include <sys/wait.h>
#include <signal.h>
+using namespace std;
ClassImp(AliShuttle)
//
if (!fConfig->IsValid()) AliFatal("********** !!!!! Invalid configuration !!!!! **********");
- for(int iSys=0;iSys<4;iSys++) {
+ for(int iSys=0;iSys<5;iSys++) {
fServer[iSys]=0;
- if (iSys < 3)
+ if (iSys < 4)
fFXSlist[iSys].SetOwner(kTRUE);
}
fPreprocessorMap.SetOwner(kTRUE);
//
fPreprocessorMap.DeleteAll();
- for(int iSys=0;iSys<4;iSys++)
+ for(int iSys=0;iSys<5;iSys++)
if(fServer[iSys]) {
fServer[iSys]->Close();
delete fServer[iSys];
//
// returns 0 if fail, 1 otherwise
+
if (fTestMode & kErrorStorage)
{
Log(fCurrentDetector, "StoreLocally - In TESTMODE - Simulating error while storing locally");
if (!(AliCDBManager::Instance()->GetStorage(localUri))) {
Log("SHUTTLE", Form("StoreLocally - Cannot activate local %s storage", cdbType));
} else {
+ Int_t logLevel = AliLog::GetGlobalLogLevel();
+ AliLog::SetGlobalLogLevel(AliLog::kError);
result = AliCDBManager::Instance()->GetStorage(localUri)
->Put(object, id, metaData);
+ AliLog::SetGlobalLogLevel((AliLog::EType_t)logLevel);
}
if(!result) {
Log(fCurrentDetector, Form("StoreLocally - Can't store object <%s>!", id.ToString().Data()));
}
+
return result;
}
Bool_t resultMetadata = kTRUE;
if(fCurrentDetector == "GRP")
{
- Log("StoreOCDB - SHUTTLE","Storing Run Metadata file ...");
+ Log("SHUTTLE","StoreOCDB - Storing Run Metadata file ...");
resultMetadata = CopyFilesToGrid("metadata");
}
Form("StoreOCDB - cannot activate main %s storage", type));
return -2;
}
+ gridSto->SetMirrorSEs(fgkMirrorSEs.Data());
gridIds = gridSto->GetQueryCDBList();
if (!dirList) return kTRUE;
- if (dirList->GetEntries() < 3)
+ if (dirList->GetEntries() < 3) // to be changed to 4?
{
delete dirList;
return kTRUE;
//
TString offDetStr(GetOfflineDetName(detector));
- TString dir;
+ static TString dir;
if (offDetStr == "ITS" || offDetStr == "MUON" || offDetStr == "PHOS")
{
dir.Form("%s/%s/%s", base, offDetStr.Data(), detector);
}
return dir.Data();
-
-
}
//______________________________________________________________________________________________
fStatusEntry = 0;
}
- fStatusEntry = AliCDBManager::Instance()->GetStorage(GetLocalCDB())
- ->Get(Form("/SHUTTLE/STATUS/%s", fCurrentDetector.Data()), GetCurrentRun());
+ Int_t path1 = GetCurrentRun()/10000;
+ try{
+ fStatusEntry = AliCDBManager::Instance()->GetStorage(GetLocalCDB())
+ ->Get(Form("/SHUTTLE/%s/%d", fCurrentDetector.Data(), path1), GetCurrentRun());
+ } catch(std::exception& x) {
+ AliInfo(TString::Format("%s",x.what()));
+ }
if (!fStatusEntry) return 0;
fStatusEntry->SetOwner(1);
}
Int_t run = GetCurrentRun();
+ Int_t path1 = run/10000;
+ TString path1_string = Form("%d",path1);
- AliCDBId id(AliCDBPath("SHUTTLE", "STATUS", fCurrentDetector), run, run);
+ AliCDBId id(AliCDBPath("SHUTTLE", fCurrentDetector, path1_string), run, run);
fStatusEntry = new AliCDBEntry(status, id, new AliCDBMetaData);
fStatusEntry->SetOwner(1);
+ Int_t logLevel = AliLog::GetGlobalLogLevel();
+ AliLog::SetGlobalLogLevel(AliLog::kError);
+
UInt_t result = AliCDBManager::Instance()->GetStorage(fgkLocalCDB)->Put(fStatusEntry);
- if (!result) {
+ AliLog::SetGlobalLogLevel((AliLog::EType_t)logLevel);
+
+ if (!result) {
Log("SHUTTLE", Form("WriteShuttleStatus - Failed for %s, run %d",
fCurrentDetector.Data(), run));
return kFALSE;
status->SetStatus(newStatus);
if (increaseCount) status->IncreaseCount();
+ Int_t logLevel = AliLog::GetGlobalLogLevel();
+ AliLog::SetGlobalLogLevel(AliLog::kError);
+
AliCDBManager::Instance()->GetStorage(fgkLocalCDB)->Put(fStatusEntry);
+ AliLog::SetGlobalLogLevel((AliLog::EType_t)logLevel);
+
SendMLDetInfo();
}
dynamic_cast<AliPreprocessor*> (fPreprocessorMap.GetValue(fCurrentDetector));
if (!aPreprocessor)
{
- Log("SHUTTLE", Form("ContinueProcessing - %s: no preprocessor registered", fCurrentDetector.Data()));
- return kFALSE;
+ Log("SHUTTLE", Form("ContinueProcessing - %s: no preprocessor registered", fCurrentDetector.Data()));
+ return kFALSE;
}
AliShuttleLogbookEntry::Status entryStatus =
if (fTestMode == kNone)
{
Log("SHUTTLE", Form("ContinueProcessing - %s requires strict run ordering"
- " but this is not the first unprocessed run!"));
+ " but this is not the first unprocessed run!",fCurrentDetector.Data()));
return kFALSE;
}
else
Log("SHUTTLE", Form("ContinueProcessing - In TESTMODE - "
"Although %s requires strict run ordering "
"and this is not the first unprocessed run, "
- "the SHUTTLE continues"));
+ "the SHUTTLE continues",fCurrentDetector.Data()));
}
}
// Send mail to detector expert!
Log("SHUTTLE", Form("ContinueProcessing - Sending mail to %s expert...",
fCurrentDetector.Data()));
+ // det experts in to
+ TString to="";
+ TIter *iterExperts = 0;
+ iterExperts = new TIter(fConfig->GetResponsibles(fCurrentDetector));
+ TObjString *anExpert=0;
+ while ((anExpert = (TObjString*) iterExperts->Next()))
+ {
+ to += Form("%s, \n", anExpert->GetName());
+ }
+ delete iterExperts;
+
+ if (to.Length() > 0)
+ to.Remove(to.Length()-3);
+ AliDebug(2, Form("to: %s",to.Data()));
+
+ if (to.IsNull()) {
+ Log("SHUTTLE", Form("List of %s responsibles not set!", fCurrentDetector.Data()));
+ return kFALSE;
+ }
+
+ Log(fCurrentDetector.Data(), Form("ContinueProcessing - Sending mail to %s expert(s):",
+ fCurrentDetector.Data()));
+ Log(fCurrentDetector.Data(), Form("\n%s", to.Data()));
if (!SendMail(kPPEMail))
Log("SHUTTLE", Form("ContinueProcessing - Could not send mail to %s expert",
fCurrentDetector.Data()));
Bool_t increaseCount = kTRUE;
if (status->GetStatus() == AliShuttleStatus::kDCSError ||
status->GetStatus() == AliShuttleStatus::kDCSStarted ||
- status->GetStatus() == AliShuttleStatus::kFXSError)
+ status->GetStatus() == AliShuttleStatus::kFXSError ||
+ status->GetStatus() == AliShuttleStatus::kOCDBError)
increaseCount = kFALSE;
UpdateShuttleStatus(AliShuttleStatus::kStarted, increaseCount);
runType += fLogbookEntry->GetRunParameter("log");
runType += ")";
}
+ if (fLogbookEntry->GetDATestMode()){
+ runType += " (DATest)";
+ }
TMonaLisaText mlRunType("SHUTTLE_runtype", runType);
TList mlList;
// Initialization
Bool_t hasError = kFALSE;
- // Set the CDB and Reference folders according to the year and LHC period
- TString lhcPeriod(GetLHCPeriod());
- if (lhcPeriod.Length() == 0)
- {
- Log("SHUTTLE","Process - LHCPeriod not found in logbook!");
- return 0;
- }
-
- // build cdb paths (repeat each time, LHCperiod might have changed)
- fgkMainCDB.Form("alien://folder=%s%d/%s/OCDB?user=alidaq?cacheFold=/tmp/OCDBCache",
- fConfig->GetAlienPath(), GetCurrentYear(), lhcPeriod.Data());
-
- fgkMainRefStorage.Form("alien://folder=%s%d/%s/Reference?user=alidaq?cacheFold=/tmp/OCDBCache",
- fConfig->GetAlienPath(), GetCurrentYear(), lhcPeriod.Data());
-
+ // Set the CDB and Reference folders according to the year
+
+ // build cdb paths (repeat each time, run might be a DATest run)
+ if (!fLogbookEntry->GetDATestMode()){
+ fgkMainCDB.Form("alien://folder=%s%d/OCDB?user=alidaq?cacheFold=/tmp/OCDBCache",
+ fConfig->GetAlienPath(), GetCurrentYear());
+
+ fgkMainRefStorage.Form("alien://folder=%s%d/Reference?user=alidaq?cacheFold=/tmp/OCDBCache",
+ fConfig->GetAlienPath(), GetCurrentYear());
+ }
+ else {
+ fgkMainCDB.Form("alien://folder=%s%d/DATest/OCDB?user=alidaq?cacheFold=/tmp/OCDBCache",
+ fConfig->GetAlienPath(), GetCurrentYear());
+
+ fgkMainRefStorage.Form("alien://folder=%s%d/DATest/Reference?user=alidaq?cacheFold=/tmp/OCDBCache",
+ fConfig->GetAlienPath(), GetCurrentYear());
+ }
+
+ AliDebug(2,Form("Main CDB storage = %s",fgkMainCDB.Data()));
+ AliDebug(2,Form("Main Reference storage = %s",fgkMainRefStorage.Data()));
+
// Loop on detectors in the configuration
TIter iter(fConfig->GetDetectors());
TObjString* aDetector = 0;
Log("SHUTTLE", Form("\t\t\t****** run %d - %s: START ******",
GetCurrentRun(), aDetector->GetName()));
- for(Int_t iSys=0;iSys<3;iSys++) fFXSCalled[iSys]=kFALSE;
+ for(Int_t iSys=0;iSys<4;iSys++) fFXSCalled[iSys]=kFALSE;
Int_t initialMem = GetMem(getpid());
Log("SHUTTLE", Form("Memory consumption before forking is %d", initialMem));
{
Long_t expiredTime = time(0) - begin;
- if (expiredTime > fConfig->GetPPTimeOut())
+ // the run-dependent timeout is the timeout from the configuration plus a twentieth of
+ // the run duration, e.g. 3 additional minutes for 1h run or 1/2h for a 10h run
+ Int_t runDepTimeOut = fConfig->GetPPTimeOut() + (GetCurrentEndTime() - GetCurrentStartTime()) * 0.05;
+ if (expiredTime > runDepTimeOut)
{
TString logMsg;
AliShuttleStatus *currentStatus = ReadShuttleStatus();
AliShuttleStatus::Status newStatus = AliShuttleStatus::kInvalid;
- if (currentStatus->GetStatus() <= AliShuttleStatus::kPPDone)
+ if (currentStatus->GetStatus() == AliShuttleStatus::kDCSStarted)
+ {
+ // in case the pp goes in TimeOut while retrieving the DCS DPs
+ // set status to kDCSError
+
+ logMsg.Form("Process - Process of %s timed out while retrieving the DCS DataPoints. Run time: %ld seconds. Killing... and setting status to DCSError.",
+ fCurrentDetector.Data(), expiredTime);
+ newStatus = AliShuttleStatus::kDCSError;
+ }
+ else if (currentStatus->GetStatus() <= AliShuttleStatus::kPPDone)
{
// in case pp not yet done set status to kPPTimeOut
- logMsg.Form("Process - Process of %s timed out. Run time: %d seconds. Killing...",
+ logMsg.Form("Process - Process of %s timed out. Run time: %ld seconds. Killing...",
fCurrentDetector.Data(), expiredTime);
newStatus = AliShuttleStatus::kPPTimeOut;
}
// in case the pp goes in TimeOut while storing the objects in the OCDB
// set status to kStoreError
- logMsg.Form("Process - Process of %s timed out while storing the OCDB object. Run time: %d seconds. Killing... and setting status to StoreError.",
+ logMsg.Form("Process - Process of %s timed out while storing the OCDB object. Run time: %ld seconds. Killing... and setting status to StoreError.",
fCurrentDetector.Data(), expiredTime);
newStatus = AliShuttleStatus::kStoreError;
}
{
// in other cases don't change the status
- logMsg.Form("Process - Process of %s timed out in status = %s. Run time: %d seconds. Killing... without changing the status",
+ logMsg.Form("Process - Process of %s timed out in status = %s. Run time: %ld seconds. Killing... without changing the status",
fCurrentDetector.Data(), currentStatus->GetStatusName(), expiredTime);
}
if (expiredTime % 60 == 0)
{
Log("SHUTTLE", Form("Process - %s: Checking process. "
- "Run time: %d seconds - Memory consumption: %d KB",
+ "Run time: %ld seconds - Memory consumption: %d KB",
fCurrentDetector.Data(), expiredTime, mem));
SendAlive();
}
Log("SHUTTLE", "Process - Could not redirect stderr");
}
+
+ Log("SHUTTLE", "Executing TGrid::Connect");
+ TGrid::Connect("alien://");
TString wd = gSystem->WorkingDirectory();
- TString tmpDir = Form("%s/%s_%d_process", GetShuttleTempDir(),
- fCurrentDetector.Data(), GetCurrentRun());
+ Int_t dir_lev1 = GetCurrentRun()/10000;
+ TString tmpDir = Form("%s/%d/%d/%s_process", GetShuttleTempDir(),
+ dir_lev1, GetCurrentRun(), fCurrentDetector.Data());
Int_t result = gSystem->GetPathInfo(tmpDir.Data(), 0, (Long64_t*) 0, 0, 0);
if (!result) // temp dir already exists!
else if (success == 0)
{
Log("SHUTTLE",
- Form("\t\t\t****** run %d - %s: PP ERROR ******",
+ Form("\t\t\t****** run %d - %s: ERROR ******",
GetCurrentRun(), aDetector->GetName()));
}
- for (UInt_t iSys=0; iSys<3; iSys++)
+ for (UInt_t iSys=0; iSys<4; iSys++)
{
if (fFXSCalled[iSys]) fFXSlist[iSys].Clear();
}
return 2;
}
+ // checking if OCDB is reachable
+ AliCDBEntry* testEntry = GetFromOCDB("SHUTTLE","GRP/CTP/DummyConfig");
+ if (!testEntry){
+ // OCDB is not accessible, going in OCDBError for current detector
+ AliError("OCDB Test entry not accessible");
+ UpdateShuttleStatus(AliShuttleStatus::kOCDBError);
+ return 0;
+ }
+
TMap* dcsMap = new TMap();
aPreprocessor->Initialize(GetCurrentRun(), GetCurrentStartTime(), GetCurrentEndTime());
SendAlive();
// check connection, in case connect
- if (!Connect(3))
+ if (!Connect(4))
return;
TString sqlQuery;
sqlQuery = Form("select count(*) from %s where shuttle_done=0", fConfig->GetShuttlelbTable());
- TSQLResult* aResult = fServer[3]->Query(sqlQuery);
+ TSQLResult* aResult = fServer[4]->Query(sqlQuery);
if (!aResult) {
AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
return;
entries.SetOwner(1);
// check connection, in case connect
- if (!Connect(3)) return kFALSE;
+ if (!Connect(4)) return kFALSE;
TString sqlQuery;
sqlQuery = Form("select * from %s %s order by run", fConfig->GetShuttlelbTable(), whereClause);
- TSQLResult* aResult = fServer[3]->Query(sqlQuery);
+ TSQLResult* aResult = fServer[4]->Query(sqlQuery);
if (!aResult) {
AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
return kFALSE;
}
// TODO Check field count!
- const UInt_t nCols = 23;
+ const UInt_t nCols = 26;
if (aResult->GetFieldCount() != (Int_t) nCols) {
Log("SHUTTLE", "Invalid SQL result field number!");
delete aResult;
if (!entry)
continue;
+ // DA test mode flag
+ TString daTestModeString(aRow->GetField(2), aRow->GetFieldLength(2)); // field 2 = DA test mode flag
+ Bool_t daTestMode = (Bool_t)daTestModeString.Atoi();
+ entry->SetDATestMode(daTestMode);
+
// loop on detectors
for(UInt_t ii = 0; ii < nCols; ii++)
entry->SetDetectorStatus(aResult->GetFieldName(ii), aRow->GetField(ii));
//
// check connection, in case connect
- if (!Connect(3))
+ if (!Connect(4))
return 0;
TString sqlQuery;
sqlQuery.Form("select * from %s where run=%d", fConfig->GetDAQlbTable(), run);
- TSQLResult* aResult = fServer[3]->Query(sqlQuery);
+ TSQLResult* aResult = fServer[4]->Query(sqlQuery);
if (!aResult) {
Log("SHUTTLE", Form("Can't execute query <%s>!", sqlQuery.Data()));
return 0;
UInt_t startTime = entry->GetStartTime();
UInt_t endTime = entry->GetEndTime();
Bool_t ecsSuccess = entry->GetECSSuccess();
-
- TString totEventsStr = entry->GetRunParameter("totalEvents");
- Int_t totEvents = totEventsStr.Atoi();
+ TString runType = entry->GetRunType();
+ TString tmpdaqstartTime = entry->GetRunParameter("DAQ_time_start");
+ TString recordingFlagString = entry->GetRunParameter("GDCmStreamRecording");
+ UInt_t recordingFlag = recordingFlagString.Atoi();
+ UInt_t daqstartTime = tmpdaqstartTime.Atoi();
UInt_t now = time(0);
- // TODO make this a configuration parameter
Int_t dcsDelay = fConfig->GetDCSDelay()+fConfig->GetDCSQueryOffset();
-
- // runs are accepted if they have ecsSuccess set or more than 1 event
- if (startTime != 0 && endTime != 0 && endTime > startTime && (totEvents > 1 || ecsSuccess) && (endTime < now - dcsDelay))
- {
- if (ecsSuccess == kFALSE)
- Log("SHUTTLE", Form("Processing run %d although in status ECS failure, Reason: %s", run, entry->GetRunParameter("eor_reason")));
- return entry;
- }
Bool_t skip = kFALSE;
- if (endTime != 0 && endTime >= now - dcsDelay)
- {
- Log("SHUTTLE", Form("Skipping run %d for now, because DCS buffer time is not yet expired", run));
- }
- else if (totEvents <= 1)
- {
- Log("SHUTTLE", Form("QueryRunParameters - Run %d has 1 event or less - Skipping!", run));
- skip = kTRUE;
- }
- else
- {
- Log("SHUTTLE", Form("QueryRunParameters - Invalid parameters for Run %d: "
- "startTime = %d, endTime = %d. Skipping (Shuttle won't be marked as DONE)!",
- run, startTime, endTime));
+ // runs are processed if
+ // a) runType is PHYSICS and ecsSuccess is set
+ // b) runType is not PHYSICS and (ecsSuccess is set or DAQ_time_start is non-0)
+ // effectively this means that all runs are processed that started properly (ecsSucess behaviour is different for PHYSICS and non-PHYSICS runs (check with ECS!)
+ if (startTime != 0 && endTime != 0) {
+ if (endTime > startTime) {
+ if (endTime >= now - dcsDelay) {
+ Log("SHUTTLE", Form("Skipping run %d for now, because DCS buffer time is not yet expired", run));
+ } else {
+ if ((runType == "PHYSICS" || runType == "STANDALONE") && recordingFlag == 0){
+ Log("SHUTTLE", Form("QueryRunParameters - Run type for run %d is %s but the recording is OFF - Skipping!", run, runType.Data()));
+ skip = kTRUE;
+ }
+ else {
+ if (runType == "PHYSICS") {
+ if (ecsSuccess) {
+ return entry;
+ } else {
+ Log("SHUTTLE", Form("QueryRunParameters - Run type for run %d is PHYSICS but ECS success flag not set (Reason = %s) - Skipping!", run, entry->GetRunParameter("eor_reason")));
+ skip = kTRUE;
+ }
+ } else {
+ if (ecsSuccess || daqstartTime > 0) {
+ if (ecsSuccess == kFALSE)
+ Log("SHUTTLE", Form("Processing run %d although in status ECS failure (Reason: %s), since run type != PHYSICS and DAQ_time_start != 0", run, entry->GetRunParameter("eor_reason")));
+ return entry;
+ } else {
+ Log("SHUTTLE", Form("QueryRunParameters - Run type for run %d is %s, ECS success flag was not set (Reason = %s) and DAQ_time_start was NULL - Skipping!", run, runType.Data(), entry->GetRunParameter("eor_reason")));
+ skip = kTRUE;
+ }
+ }
+ }
+ }
+ } else {
+ Log("SHUTTLE", Form("QueryRunParameters - Invalid parameters for run %d: startTime equal to endTime: %d %d - Skipping!", run, startTime, endTime));
+ skip = kTRUE;
+ }
+ } else {
+ Log("SHUTTLE", Form("QueryRunParameters - Invalid parameters for Run %d: "
+ "startTime = %d, endTime = %d. Skipping (Shuttle won't be marked as DONE)!",
+ run, startTime, endTime));
}
if (skip)
// returns TMap of values, 0 when failure
AliDCSClient client(host, port, fTimeout, fRetries, multiSplit);
- UInt_t offset = fConfig->GetDCSQueryOffset();
TMap* result = 0;
if (type == kAlias)
{
//result = client.GetAliasValues(entries, GetCurrentStartTime()-offset,
// GetCurrentEndTime()+offset);
- result = client.GetAliasValues(entries, GetCurrentTimeCreated()-offset,
- GetCurrentEndTime()+offset);
+ result = client.GetAliasValues(entries, GetStartTimeDCSQuery(),
+ GetEndTimeDCSQuery());
}
else if (type == kDP)
{
//result = client.GetDPValues(entries, GetCurrentStartTime()-offset,
// GetCurrentEndTime()+offset);
- result = client.GetDPValues(entries, GetCurrentTimeCreated()-offset,
- GetCurrentEndTime()+offset);
+ result = client.GetDPValues(entries, GetStartTimeDCSQuery(),
+ GetEndTimeDCSQuery());
}
if (result == 0)
TString whereClause = Form("run=%d and detector=\"%s\" and fileId=\"%s\"",
GetCurrentRun(), detector, id);
- if (system == kDAQ)
+ if (system == kDAQ || system == kDQM)
{
whereClause += Form(" and DAQsource=\"%s\"", source);
}
filePath.Data(), fileSize.Data(), fileChecksum.Data()));
// retrieved file is renamed to make it unique
- TString localFileName = Form("%s/%s_%d_process/%s_%s_%d_%s_%s.shuttle",
- GetShuttleTempDir(), detector, GetCurrentRun(),
+ Int_t dir_lev1 = GetCurrentRun()/10000;
+ TString localFileName = Form("%s/%d/%d/%s_process/%s_%s_%d_%s_%s.shuttle",
+ GetShuttleTempDir(), dir_lev1, GetCurrentRun(), detector,
GetSystemName(system), detector, GetCurrentRun(),
id, sourceName.Data());
+ Log("SHUTTLE",Form("file from FXS = %s",localFileName.Data()));
// file retrieval from FXS
return NULL;
}
- TString sourceName = 0;
- if (system == kDAQ)
+ TString sourceName = "";
+ if (system == kDAQ || system == kDQM)
{
sourceName = "DAQsource";
} else if (system == kHLT)
return NULL;
}
- TString sourceName = 0;
+ TString sourceName = "";
if (system == kDAQ)
{
sourceName = "DAQsource";
//
// check connection: if already connected return
- if(fServer[system] && fServer[system]->IsConnected()) return kTRUE;
+
+ if(fServer[system] && fServer[system]->IsConnected()) {
+ // ping the server
+ if (fServer[system]->PingVerify()==kTRUE){ // connection is still alive
+ return kTRUE;
+ }
+ else{
+ AliWarning(Form("Connection got lost to FXS database for %s. Closing and reconnecting.",
+ AliShuttleInterface::GetSystemName(system)));
+ fServer[system]->Close();
+ delete fServer[system];
+ fServer[system] = 0x0;
+ }
+ }
TString dbHost, dbUser, dbPass, dbName;
- if (system < 3) // FXS db servers
+ if (system < 4) // FXS db servers
{
dbHost = Form("mysql://%s:%d", fConfig->GetFXSdbHost(system), fConfig->GetFXSdbPort(system));
dbUser = fConfig->GetFXSdbUser(system);
}
fServer[system] = TSQLServer::Connect(dbHost.Data(), dbUser.Data(), dbPass.Data());
- if (!fServer[system] || !fServer[system]->IsConnected()) {
- if(system < 3)
+ if (!fServer[system] || !fServer[system]->IsConnected()) {
+ if(system < 4)
{
AliError(Form("Can't establish connection to FXS database for %s",
AliShuttleInterface::GetSystemName(system)));
case kHLT:
aResult = fServer[kHLT]->GetTables(dbName.Data());
break;
+ case kDQM:
+ aResult = fServer[kDQM]->GetTables(dbName.Data());
+ break;
default:
- aResult = fServer[3]->GetTables(dbName.Data());
+ aResult = fServer[4]->GetTables(dbName.Data());
break;
}
Bool_t result = kTRUE;
- for (UInt_t system=0; system<3; system++)
+ for (UInt_t system=0; system<4; system++)
{
if(!fFXSCalled[system]) continue;
const char* source = ((TObjString*) aFXSarray->At(1))->GetName();
TString whereClause;
- if (system == kDAQ)
+ if (system == kDAQ || system == kDQM)
{
whereClause = Form("where run=%d and detector=\"%s\" and fileId=\"%s\" and DAQsource=\"%s\";",
GetCurrentRun(), fCurrentDetector.Data(), fileId, source);
delete aFXSarray;
- TString sqlQuery = Form("update %s set time_processed=%d %s", fConfig->GetFXSdbTable(system),
- now.GetSec(), whereClause.Data());
+ TString sqlQuery = Form("update %s set time_processed=%ld %s", fConfig->GetFXSdbTable(system),
+ (ULong_t)now.GetSec(), whereClause.Data());
AliDebug(2, Form("SQL query: \n%s",sqlQuery.Data()));
Bool_t result = kTRUE;
- for (UInt_t system=0; system<3; system++)
+ TString detName(detector);
+
+ for (UInt_t system=0; system<4; system++)
{
// check connection, in case connect
TIter iter(&fFXSlist[system]);
TString whereClause;
- if (detector == "ALL") whereClause = Form("where run=%d and time_processed IS NULL;",GetCurrentRun());
+ if (detName == "ALL") whereClause = Form("where run=%d and time_processed IS NULL;",GetCurrentRun());
else whereClause = Form("where run=%d and detector=\"%s\" and time_processed IS NULL;",GetCurrentRun(), detector);
- Log("SHUTTLE",Form(" whereClause = %s ",whereClause.Data()));
+ //Log("SHUTTLE",Form(" whereClause = %s ",whereClause.Data()));
- TString sqlQuery = Form("update %s set time_processed=%d %s", fConfig->GetFXSdbTable(system),
- now.GetSec(), whereClause.Data());
+ TString sqlQuery = Form("update %s set time_processed=%ld %s", fConfig->GetFXSdbTable(system),
+ (ULong_t)now.GetSec(), whereClause.Data());
AliDebug(2, Form("SQL query: \n%s",sqlQuery.Data()));
Bool_t result = kTRUE;
- for (UInt_t system=0; system<3; system++)
+ for (UInt_t system=0; system<4; system++)
{
// check connection, in case connect
if (!Connect(system))
GetCurrentRun(), fCurrentDetector.Data());
- TString sqlQuery = Form("update %s set time_processed=%d %s", fConfig->GetFXSdbTable(system),
- now.GetSec(), whereClause.Data());
+ TString sqlQuery = Form("update %s set time_processed=%ld %s", fConfig->GetFXSdbTable(system),
+ (ULong_t)now.GetSec(), whereClause.Data());
AliDebug(2, Form("SQL query: \n%s",sqlQuery.Data()));
//
// check connection, in case connect
- if(!Connect(3)){
+ if(!Connect(4)){
Log("SHUTTLE", "UpdateShuttleLogbook - Couldn't connect to DAQ Logbook.");
return kFALSE;
}
// Query execution
TSQLResult* aResult;
- aResult = dynamic_cast<TSQLResult*> (fServer[3]->Query(sqlQuery));
+ aResult = dynamic_cast<TSQLResult*> (fServer[4]->Query(sqlQuery));
if (!aResult) {
Log("SHUTTLE", Form("UpdateShuttleLogbook - Can't execute query <%s>", sqlQuery.Data()));
return kFALSE;
return fLogbookEntry ? fLogbookEntry->GetEndTime() : 0;
}
-//______________________________________________________________________________________________
-UInt_t AliShuttle::GetCurrentTimeCreated() const
-{
- //
- // get current end time from logbook entry
- //
-
- return fLogbookEntry ? fLogbookEntry->GetTimeCreated() : 0;
-}
-
//______________________________________________________________________________________________
UInt_t AliShuttle::GetCurrentYear() const
{
}
//______________________________________________________________________________________________
-void AliShuttle::Log(const char* detector, const char* message)
+void AliShuttle::Log(const char* detector, const char* message, UInt_t level)
{
//
// Fill log string with a message
//
-
- TString logRunDir = GetShuttleLogDir();
- if (GetCurrentRun() >=0)
- logRunDir += Form("/%d", GetCurrentRun());
+ TString logRunDir = GetShuttleLogDir();
+ if (GetCurrentRun() >=0) {
+ Int_t logDir_lev1 = GetCurrentRun()/10000;
+ logRunDir += Form("/%d/%d", logDir_lev1, GetCurrentRun());
+ }
void* dir = gSystem->OpenDirectory(logRunDir.Data());
if (dir == NULL) {
if (gSystem->mkdir(logRunDir.Data(), kTRUE)) {
toLog += Form("run %d - ", GetCurrentRun());
toLog += Form("%s", message);
- AliInfo(toLog.Data());
+ AliLog::Message(level, toLog, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);
// if we redirect the log output already to the file, leave here
if (fOutputRedirected && strcmp(detector, "SHUTTLE") != 0)
if (GetCurrentRun() >= 0)
{
- fileName.Form("%s/%d/%s_%d.log", GetShuttleLogDir(), GetCurrentRun(),
- detector, GetCurrentRun());
+ Int_t logDir_lev1 = GetCurrentRun()/10000;
+ fileName.Form("%s/%d/%d/%s.log", GetShuttleLogDir(), logDir_lev1, GetCurrentRun(),
+ detector);
} else {
fileName.Form("%s/%s.log", GetShuttleLogDir(), detector);
}
if (target == kDCSEMail || target == kFXSEMail) {
if (!fFirstProcessing)
- return kTRUE;
+ return kTRUE;
}
Int_t runMode = (Int_t)fConfig->GetRunMode();
if (system == kDAQ) sys="DAQ";
else if (system == kDCS) sys="DCS";
else if (system == kHLT) sys="HLT";
+ else if (system == kDQM) sys="DQM";
else return kFALSE;
body = Form("Dear %s FXS experts, \n\n",sys.Data());
body += Form("SHUTTLE couldn\'t retrieve data from the FXS for detector %s "
"in run %d!!\n\n", fCurrentDetector.Data(), GetCurrentRun());
+ body += Form("The contacted server was:\nDB: %s\nFXS:%s\n\n", fConfig->GetFXSdbHost(system), fConfig->GetFXSHost(system));
}
else {
subject = Form("%s %s Shuttle preprocessor FAILED in run %d (run type = %s)!",
body += Form("Find the %s log for the current run on \n\n"
- "\thttp://pcalishuttle01.cern.ch:8880/%s/%d/%s_%d.log \n\n",
- fCurrentDetector.Data(), logFolder.Data(), GetCurrentRun(),
- fCurrentDetector.Data(), GetCurrentRun());
- body += Form("The last 10 lines of %s log file are following:\n\n", fCurrentDetector.Data());
+ "\thttp://pcalishuttle02.cern.ch/%s/%d/%d/%s.log \n\n",
+ fCurrentDetector.Data(), logFolder.Data(), GetCurrentRun()/10000,
+ GetCurrentRun(), fCurrentDetector.Data());
+ body += Form("The last 15 lines of %s log file are following:\n\n", fCurrentDetector.Data());
AliDebug(2, Form("Body begin: %s", body.Data()));
mailBody.close();
mailBody.open(bodyFileName, ofstream::out | ofstream::app);
- TString logFileName = Form("%s/%d/%s_%d.log", GetShuttleLogDir(),
- GetCurrentRun(), fCurrentDetector.Data(), GetCurrentRun());
- TString tailCommand = Form("tail -n 10 %s >> %s", logFileName.Data(), bodyFileName.Data());
+ TString logFileName = Form("%s/%d/%d/%s.log", GetShuttleLogDir(),
+ GetCurrentRun()/10000, GetCurrentRun(), fCurrentDetector.Data());
+ TString tailCommand = Form("tail -n 15 %s >> %s", logFileName.Data(), bodyFileName.Data());
if (gSystem->Exec(tailCommand.Data()))
{
mailBody << Form("%s log file not found ...\n\n", fCurrentDetector.Data());
return result == 0;
}
-
//______________________________________________________________________________________________
const char* AliShuttle::GetRunType()
{
// Receives the trigger configuration from the DAQ logbook for the current run
// check connection, if needed reconnect
- if (!Connect(3))
+ if (!Connect(4))
return 0;
TString sqlQuery;
sqlQuery.Form("SELECT configFile FROM logbook_trigger_config WHERE run = %d", GetCurrentRun());
- TSQLResult* result = fServer[3]->Query(sqlQuery);
+ TSQLResult* result = fServer[4]->Query(sqlQuery);
if (!result)
{
Log("SHUTTLE", Form("ERROR: Can't execute query <%s>!", sqlQuery.Data()));
if (result->GetRowCount() == 0)
{
- Log("SHUTTLE", "ERROR: Trigger configuration not found in logbook_trigger_config");
+ Log("SHUTTLE", "WARNING: Trigger configuration not found in logbook_trigger_config");
delete result;
return 0;
}
return triggerConfig;
}
+//______________________________________________________________________________________________
+const char* AliShuttle::GetCTPTimeParams()
+{
+ // Receives the CTP time parameters from the DAQ logbook for the current run
+
+ // check connection, if needed reconnect
+ if (!Connect(4))
+ return 0;
+
+ TString sqlQuery;
+ sqlQuery.Form("SELECT alignmentFile FROM logbook_trigger_config WHERE run = %d", GetCurrentRun());
+ TSQLResult* result = fServer[4]->Query(sqlQuery);
+ if (!result)
+ {
+ Log("SHUTTLE", Form("ERROR: Can't execute query <%s>!", sqlQuery.Data()));
+ return 0;
+ }
+
+ if (result->GetRowCount() == 0)
+ {
+ Log("SHUTTLE", "WARNING: CTP time params not found in logbook_trigger_config");
+ delete result;
+ return 0;
+ }
+
+ TSQLRow* row = result->Next();
+ if (!row)
+ {
+ Log("SHUTTLE", "ERROR: Could not receive logbook_trigger_config data");
+ delete result;
+ return 0;
+ }
+
+ // static, so that pointer remains valid when it is returned to the calling class
+ static TString triggerTimeParams(row->GetField(0));
+
+ delete row;
+ row = 0;
+
+ delete result;
+ result = 0;
+
+ Log("SHUTTLE", Form("Found trigger time parameters: %s", triggerTimeParams.Data()));
+
+ return triggerTimeParams;
+}
+
+//______________________________________________________________________________________________
+const char* AliShuttle::GetTriggerDetectorMask()
+{
+ // Receives the trigger detector mask from DAQ logbook
+
+ // check connection, if needed reconnect
+ if (!Connect(4))
+ return 0;
+
+ TString sqlQuery;
+ sqlQuery.Form("SELECT BIN(BIT_OR(inputDetectorMask)) from logbook_trigger_clusters WHERE run = %d;", GetCurrentRun());
+ TSQLResult* result = fServer[4]->Query(sqlQuery);
+ if (!result)
+ {
+ Log("SHUTTLE", Form("ERROR: Can't execute query <%s>!", sqlQuery.Data()));
+ return 0;
+ }
+
+ if (result->GetRowCount() == 0)
+ {
+ Log("SHUTTLE", "ERROR: Trigger Detector Mask not found in logbook_trigger_clusters");
+ delete result;
+ return 0;
+ }
+
+ TSQLRow* row = result->Next();
+ if (!row)
+ {
+ Log("SHUTTLE", "ERROR: Could not receive logbook_trigger_clusters data");
+ delete result;
+ return 0;
+ }
+
+ // static, so that pointer remains valid when it is returned to the calling class
+ static TString triggerDetectorMask(row->GetField(0));
+
+ delete row;
+ row = 0;
+
+ delete result;
+ result = 0;
+
+ Log("SHUTTLE", Form("Found Trigger Detector Mask: %s", triggerDetectorMask.Data()));
+
+ return triggerDetectorMask;
+}
+
//______________________________________________________________________________________________
void AliShuttle::SetShuttleTempDir(const char* tmpDir)
{
}
TString dir;
- dir.Form("%s%d/%s/SHUTTLE_DONE", fConfig->GetAlienPath(), GetCurrentYear(), GetLHCPeriod());
+ dir.Form("%s%d/SHUTTLE_DONE", fConfig->GetAlienPath(), GetCurrentYear());
// checking whether directory for touch command exists
TString commandLs;
commandLs.Form("ls %s",dir.Data());
return kFALSE;
}
TObjString *valueLsPath = dynamic_cast<TObjString*>(mapLs->GetValue("path"));
- if (!valueLsPath || (TString)(valueLsPath->GetString()).CompareTo(dir)!=1){
+ if (!valueLsPath || (valueLsPath->GetString()).CompareTo(dir)!=1){
Log("SHUTTLE",Form("No directory %s found, creating it",dir.Data()));
// creating the directory
return kTRUE;
}
//______________________________________________________________________________________________
-const UInt_t AliShuttle::GetStartTimeDCSQuery()
+UInt_t AliShuttle::GetStartTimeDCSQuery()
{
// Return Start Time for the DCS query
//
// The call is delegated to AliShuttleInterface
- return GetCurrentTimeCreated()-fConfig->GetDCSQueryOffset();
+ return GetCurrentStartTime()-fConfig->GetDCSQueryOffset();
}
//______________________________________________________________________________________________
-const UInt_t AliShuttle::GetEndTimeDCSQuery()
+UInt_t AliShuttle::GetEndTimeDCSQuery()
{
// Return End Time for the DCS query
//
return GetCurrentEndTime()+fConfig->GetDCSQueryOffset();
}
+//______________________________________________________________________________________________
+void AliShuttle::SendMLFromDet(const char* value)
+{
+ //
+ // Sending an information coming from the current detector to ML
+ //
+
+ TMonaLisaText mlText(Form("%s_RunCondition", fCurrentDetector.Data()), value);
+
+ TList mlList;
+ mlList.Add(&mlText);
+
+ TString mlID;
+ mlID.Form("%d", GetCurrentRun());
+ fMonaLisa->SendParameters(&mlList, mlID);
+
+ return;
+}
+//______________________________________________________________________________________________
+TString* AliShuttle::GetLTUConfig(const char* det)
+{
+ //
+ // Getting ltuFineDelay1, ltuFineDelay2, ltuBCDelay for detector det from logbook_detectors table in logbook
+ //
+
+ if (!Connect(4))
+ return 0;
+
+ TString sqlQuery;
+ sqlQuery.Form("select LTUFineDelay1, LTUFineDelay2, LTUBCDelayAdd from logbook_detectors WHERE run_number = %d and detector = \"%s\";", GetCurrentRun(),det);
+
+ TSQLResult* result = fServer[4]->Query(sqlQuery);
+ if (!result){
+ Log("SHUTTLE","ERROR: No result found for the LTU configuration query");
+ return 0x0;
+ }
+ if (result->GetRowCount() == 0){
+ Log("SHUTTLE",Form("ERROR: LTU configuration not found in logbook_detectors for detector %s, returning null pointer",det));
+ delete result;
+ return 0x0;
+ }
+ if (result->GetFieldCount() != 3){
+ Log("SHUTTLE",Form("ERROR: not all the required fields are there for the LTU configuration for detector %s (only %d found), returning a null pointer",det, result->GetFieldCount()));
+ delete result;
+ return 0x0;
+ }
+ TSQLRow* row = result->Next();
+ if (!row){
+ Printf("ERROR: Could not receive logbook_detectors data, returning null pointer");
+ delete result;
+ return 0x0;
+ }
+ TString* ltuConfigString = new TString[3];
+
+ ltuConfigString[0] = row->GetField(0);
+ ltuConfigString[1] = row->GetField(1);
+ ltuConfigString[2] = row->GetField(2);
+ return ltuConfigString;
+}