X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=SHUTTLE%2FAliShuttle.cxx;h=080d557d55b1c25b0576a9ccd97349a77ed8133a;hb=d52fab812a79e326c5c56340166d1781b88fa7fc;hp=1c66683650fb561e059e7970257515efd9037e87;hpb=6c0c994810707f6e4bdcc7d305277d2bedb7848f;p=u%2Fmrichter%2FAliRoot.git diff --git a/SHUTTLE/AliShuttle.cxx b/SHUTTLE/AliShuttle.cxx index 1c66683650f..080d557d55b 100644 --- a/SHUTTLE/AliShuttle.cxx +++ b/SHUTTLE/AliShuttle.cxx @@ -200,6 +200,7 @@ Bool_t AliShuttle::StoreLocally(const TString& localUri, // // returns 0 if fail, 1 otherwise + if (fTestMode & kErrorStorage) { Log(fCurrentDetector, "StoreLocally - In TESTMODE - Simulating error while storing locally"); @@ -234,8 +235,11 @@ Bool_t AliShuttle::StoreLocally(const TString& localUri, 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) { @@ -243,6 +247,7 @@ Bool_t AliShuttle::StoreLocally(const TString& localUri, Log(fCurrentDetector, Form("StoreLocally - Can't store object <%s>!", id.ToString().Data())); } + return result; } @@ -256,7 +261,7 @@ Bool_t AliShuttle::StoreOCDB() // UpdateShuttleStatus(AliShuttleStatus::kStoreStarted); - + if (fTestMode & kErrorGrid) { Log("SHUTTLE", "StoreOCDB - In TESTMODE - Simulating error while storing in the Grid"); @@ -276,7 +281,7 @@ Bool_t AliShuttle::StoreOCDB() Bool_t resultMetadata = kTRUE; if(fCurrentDetector == "GRP") { - Log("StoreOCDB - SHUTTLE","Storing Run Metadata file ..."); + Log("SHUTTLE","StoreOCDB - Storing Run Metadata file ..."); resultMetadata = CopyFilesToGrid("metadata"); } @@ -865,7 +870,7 @@ const char* AliShuttle::GetRefFilePrefix(const char* base, const char* detector) // 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); @@ -874,8 +879,6 @@ const char* AliShuttle::GetRefFilePrefix(const char* base, const char* detector) } return dir.Data(); - - } //______________________________________________________________________________________________ @@ -946,8 +949,9 @@ AliShuttleStatus* AliShuttle::ReadShuttleStatus() fStatusEntry = 0; } + Int_t path1 = GetCurrentRun()/10000; fStatusEntry = AliCDBManager::Instance()->GetStorage(GetLocalCDB()) - ->Get(Form("/SHUTTLE/STATUS/%s", fCurrentDetector.Data()), GetCurrentRun()); + ->Get(Form("/SHUTTLE/%s/%d", fCurrentDetector.Data(), path1), GetCurrentRun()); if (!fStatusEntry) return 0; fStatusEntry->SetOwner(1); @@ -974,15 +978,22 @@ Bool_t AliShuttle::WriteShuttleStatus(AliShuttleStatus* status) } 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; @@ -1022,8 +1033,13 @@ void AliShuttle::UpdateShuttleStatus(AliShuttleStatus::Status newStatus, Bool_t 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(); } @@ -1165,6 +1181,29 @@ Bool_t AliShuttle::ContinueProcessing() // 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())); @@ -1176,7 +1215,8 @@ Bool_t AliShuttle::ContinueProcessing() 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); @@ -1200,6 +1240,9 @@ void AliShuttle::SendMLRunInfo(const char* status) runType += fLogbookEntry->GetRunParameter("log"); runType += ")"; } + if (fLogbookEntry->GetDATestMode()){ + runType += " (DATest)"; + } TMonaLisaText mlRunType("SHUTTLE_runtype", runType); TList mlList; @@ -1316,21 +1359,27 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) // 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; @@ -1385,16 +1434,51 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) if (expiredTime > fConfig->GetPPTimeOut()) { - TString tmp; - tmp.Form("Process - Process of %s time out. " - "Run time: %d seconds. Killing...", - fCurrentDetector.Data(), expiredTime); - Log("SHUTTLE", tmp); - Log(fCurrentDetector, tmp); + TString logMsg; + AliShuttleStatus *currentStatus = ReadShuttleStatus(); + AliShuttleStatus::Status newStatus = AliShuttleStatus::kInvalid; + + 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: %d 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...", + fCurrentDetector.Data(), expiredTime); + newStatus = AliShuttleStatus::kPPTimeOut; + } + else if (currentStatus->GetStatus() == AliShuttleStatus::kStoreStarted) + { + // 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.", + fCurrentDetector.Data(), expiredTime); + newStatus = AliShuttleStatus::kStoreError; + } + else + { + // 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", + fCurrentDetector.Data(), currentStatus->GetStatusName(), expiredTime); + } + + Log("SHUTTLE", logMsg); + Log(fCurrentDetector, logMsg); kill(pid, 9); - UpdateShuttleStatus(AliShuttleStatus::kPPTimeOut); + if (newStatus != AliShuttleStatus::kInvalid) + UpdateShuttleStatus(newStatus); hasError = kTRUE; gSystem->Sleep(1000); @@ -1471,10 +1555,14 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) 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! @@ -1523,7 +1611,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) 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())); } @@ -1612,11 +1700,24 @@ Int_t AliShuttle::ProcessCurrentDetector() { UpdateShuttleStatus(AliShuttleStatus::kSkipped); UpdateShuttleLogbook(fCurrentDetector, "DONE"); + if (!UpdateTableSkippedCase(fCurrentDetector.Data())) + { + AliError(Form("Could not update FXS tables for run %d !", GetCurrentRun())); + } Log(fCurrentDetector, Form("ProcessCurrentDetector - %s preprocessor is not interested in this run type", fCurrentDetector.Data())); 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()); @@ -1662,6 +1763,7 @@ Int_t AliShuttle::ProcessCurrentDetector() if (fConfig->GetDCSAliases(fCurrentDetector, iServ)->GetEntries() > 0) { + Log(fCurrentDetector, Form("Querying %d DCS aliases", fConfig->GetDCSAliases(fCurrentDetector, iServ)->GetEntries())); aliasMap = GetValueSet(host, port, fConfig->GetDCSAliases(fCurrentDetector, iServ), kAlias, multiSplit); @@ -1684,6 +1786,7 @@ Int_t AliShuttle::ProcessCurrentDetector() if (fConfig->GetDCSDataPoints(fCurrentDetector, iServ)->GetEntries() > 0) { + Log(fCurrentDetector, Form("Querying %d DCS data points", fConfig->GetDCSDataPoints(fCurrentDetector, iServ)->GetEntries())); dpMap = GetValueSet(host, port, fConfig->GetDCSDataPoints(fCurrentDetector, iServ), kDP, multiSplit); @@ -1776,6 +1879,8 @@ void AliShuttle::CountOpenRuns() { // Query DAQ's Shuttle logbook and sends the number of open runs to ML + SendAlive(); + // check connection, in case connect if (!Connect(3)) return; @@ -1854,7 +1959,7 @@ Bool_t AliShuttle::QueryShuttleLogbook(const char* whereClause, } // 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; @@ -1870,6 +1975,11 @@ Bool_t AliShuttle::QueryShuttleLogbook(const char* whereClause, 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)); @@ -1934,30 +2044,58 @@ AliShuttleLogbookEntry* AliShuttle::QueryRunParameters(Int_t run) UInt_t startTime = entry->GetStartTime(); UInt_t endTime = entry->GetEndTime(); Bool_t ecsSuccess = entry->GetECSSuccess(); + 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(); - TString totEventsStr = entry->GetRunParameter("totalEvents"); - Int_t totEvents = totEventsStr.Atoi(); - - // runs are accepted if they have ecsSuccess set or more than 1 event - if (startTime != 0 && endTime != 0 && endTime > startTime && (totEvents > 1 || ecsSuccess)) - { - if (ecsSuccess == kFALSE) - Log("SHUTTLE", Form("Processing run %d although in status ECS failure, Reason: %s", run, entry->GetRunParameter("eor_reason"))); - return entry; - } + UInt_t now = time(0); + Int_t dcsDelay = fConfig->GetDCSDelay()+fConfig->GetDCSQueryOffset(); Bool_t skip = kFALSE; - 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) @@ -1968,6 +2106,10 @@ AliShuttleLogbookEntry* AliShuttle::QueryRunParameters(Int_t run) { AliError(Form("Could not update logbook for run %d !", run)); } + if (!UpdateTableSkippedCase("ALL")) + { + AliError(Form("Could not update FXS tables for run %d !", run)); + } fLogbookEntry = 0; } @@ -1990,13 +2132,17 @@ TMap* AliShuttle::GetValueSet(const char* host, Int_t port, const TSeqCollection TMap* result = 0; if (type == kAlias) { - result = client.GetAliasValues(entries, GetCurrentStartTime(), - GetCurrentEndTime()); + //result = client.GetAliasValues(entries, GetCurrentStartTime()-offset, + // GetCurrentEndTime()+offset); + result = client.GetAliasValues(entries, GetStartTimeDCSQuery(), + GetEndTimeDCSQuery()); } else if (type == kDP) { - result = client.GetDPValues(entries, GetCurrentStartTime(), - GetCurrentEndTime()); + //result = client.GetDPValues(entries, GetCurrentStartTime()-offset, + // GetCurrentEndTime()+offset); + result = client.GetDPValues(entries, GetStartTimeDCSQuery(), + GetEndTimeDCSQuery()); } if (result == 0) @@ -2123,10 +2269,12 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector, 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 @@ -2284,7 +2432,7 @@ TList* AliShuttle::GetFileSources(Int_t system, const char* detector, const char return NULL; } - TString sourceName = 0; + TString sourceName = ""; if (system == kDAQ) { sourceName = "DAQsource"; @@ -2363,7 +2511,7 @@ TList* AliShuttle::GetFileIDs(Int_t system, const char* detector, const char* so return NULL; } - TString sourceName = 0; + TString sourceName = ""; if (system == kDAQ) { sourceName = "DAQsource"; @@ -2427,7 +2575,20 @@ Bool_t AliShuttle::Connect(Int_t system) // // 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; @@ -2561,6 +2722,61 @@ Bool_t AliShuttle::UpdateTable() return result; } +//_______________________________________________________________________________ +Bool_t AliShuttle::UpdateTableSkippedCase(const char* detector) +{ + // + // Update FXS table filling time_processed field in all rows corresponding to current run and detector + // if detector = "ALL" update all detectors + // + + Bool_t result = kTRUE; + + TString detName(detector); + + for (UInt_t system=0; system<3; system++) + { + + // check connection, in case connect + if (!Connect(system)) + { + Log(fCurrentDetector, Form("UpdateTableSkippedCase - Couldn't connect to %s FXS database", GetSystemName(system))); + result = kFALSE; + continue; + } + + TTimeStamp now; // now + + // Loop on FXS list entries + TIter iter(&fFXSlist[system]); + + TString whereClause; + 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())); + + TString sqlQuery = Form("update %s set time_processed=%d %s", fConfig->GetFXSdbTable(system), + now.GetSec(), whereClause.Data()); + + AliDebug(2, Form("SQL query: \n%s",sqlQuery.Data())); + + // Query execution + TSQLResult* aResult; + aResult = dynamic_cast (fServer[system]->Query(sqlQuery)); + if (!aResult) + { + Log("SHUTTLE", Form("UpdateTableSkippedCase - %s db: can't execute SQL query <%s>", + GetSystemName(system), sqlQuery.Data())); + result = kFALSE; + continue; + } + delete aResult; + + } + + return result; +} //______________________________________________________________________________________________ Bool_t AliShuttle::UpdateTableFailCase() { @@ -2633,7 +2849,10 @@ Bool_t AliShuttle::UpdateShuttleLogbook(const char* detector, const char* status if (detName == "shuttle_done") { if (TouchFile() != kTRUE) + { + SendMLRunInfo("Pending"); return kFALSE; + } SendMLRunInfo("Done"); } @@ -2701,7 +2920,6 @@ UInt_t AliShuttle::GetCurrentEndTime() const return fLogbookEntry ? fLogbookEntry->GetEndTime() : 0; } - //______________________________________________________________________________________________ UInt_t AliShuttle::GetCurrentYear() const { @@ -2731,16 +2949,17 @@ const char* AliShuttle::GetLHCPeriod() 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)) { @@ -2757,7 +2976,7 @@ void AliShuttle::Log(const char* detector, const char* message) 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) @@ -2791,8 +3010,9 @@ TString AliShuttle::GetLogFileName(const char* detector) const 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); } @@ -2834,7 +3054,6 @@ Bool_t AliShuttle::Collect(Int_t run) if (!fMonaLisa) fMonaLisa = new TMonaLisaWriter(fConfig->GetMonitorHost(), fConfig->GetMonitorTable()); - SendAlive(); CountOpenRuns(); TString whereClause("where shuttle_done=0"); @@ -3032,7 +3251,7 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) if (target == kDCSEMail || target == kFXSEMail) { if (!fFirstProcessing) - return kTRUE; + return kTRUE; } Int_t runMode = (Int_t)fConfig->GetRunMode(); @@ -3119,7 +3338,7 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) TString body; if (target == kDCSEMail){ - subject = Form("%s Retrieval of data points for %s FAILED in run %d !", + subject = Form("%s CRITICAL Retrieval of data points for %s FAILED in run %d !", tmpStr.Data(), fCurrentDetector.Data(), GetCurrentRun()); AliDebug(2, Form("subject: %s", subject.Data())); @@ -3128,7 +3347,7 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) "in run %d!!\n\n", fCurrentDetector.Data(), GetCurrentRun()); } else if (target == kFXSEMail){ - subject = Form("%s FXS communication for %s FAILED in run %d !", + subject = Form("%s CRITICAL FXS communication for %s FAILED in run %d !", tmpStr.Data(), fCurrentDetector.Data(), GetCurrentRun()); AliDebug(2, Form("subject: %s", subject.Data())); TString sys; @@ -3139,6 +3358,7 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) 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)!", @@ -3167,10 +3387,10 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) 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())); @@ -3178,9 +3398,9 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) 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()); @@ -3209,7 +3429,6 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) return result == 0; } - //______________________________________________________________________________________________ const char* AliShuttle::GetRunType() { @@ -3272,7 +3491,7 @@ const char* AliShuttle::GetTriggerConfiguration() 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; } @@ -3299,6 +3518,100 @@ const char* AliShuttle::GetTriggerConfiguration() 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(3)) + return 0; + + TString sqlQuery; + sqlQuery.Form("SELECT alignmentFile FROM logbook_trigger_config WHERE run = %d", GetCurrentRun()); + TSQLResult* result = fServer[3]->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(3)) + return 0; + + TString sqlQuery; + sqlQuery.Form("SELECT BIN(BIT_OR(inputDetectorMask)) from logbook_trigger_clusters WHERE run = %d;", GetCurrentRun()); + TSQLResult* result = fServer[3]->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) { @@ -3333,7 +3646,7 @@ Bool_t AliShuttle::TouchFile() } 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()); @@ -3350,7 +3663,7 @@ Bool_t AliShuttle::TouchFile() return kFALSE; } TObjString *valueLsPath = dynamic_cast(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 @@ -3401,7 +3714,25 @@ Bool_t AliShuttle::TouchFile() } delete resultTouch; resultTouch = 0x0; + Log("SHUTTLE", "Sucessfully touched the file"); return kTRUE; } +//______________________________________________________________________________________________ +UInt_t AliShuttle::GetStartTimeDCSQuery() +{ + // Return Start Time for the DCS query + // + // The call is delegated to AliShuttleInterface + return GetCurrentStartTime()-fConfig->GetDCSQueryOffset(); +} +//______________________________________________________________________________________________ +UInt_t AliShuttle::GetEndTimeDCSQuery() +{ + // Return End Time for the DCS query + // + // The call is delegated to AliShuttleInterface + + return GetCurrentEndTime()+fConfig->GetDCSQueryOffset(); +}