X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=SHUTTLE%2FAliShuttle.cxx;h=f83a4f49f1f70209e2b4f4a107834c961295bbeb;hb=1415d3f9eeff627143207700f00d4b67e6b7c40c;hp=a7f736ce6dfe3d075495358cb7ec41ef93c2ce24;hpb=7802e8849a2b6ec69f2449ca7bd2f135172a105b;p=u%2Fmrichter%2FAliRoot.git diff --git a/SHUTTLE/AliShuttle.cxx b/SHUTTLE/AliShuttle.cxx index a7f736ce6df..f83a4f49f1f 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; } @@ -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(); - - } //______________________________________________________________________________________________ @@ -983,9 +986,14 @@ Bool_t AliShuttle::WriteShuttleStatus(AliShuttleStatus* status) 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; @@ -1025,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(); } @@ -1168,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())); @@ -1203,6 +1239,9 @@ void AliShuttle::SendMLRunInfo(const char* status) runType += fLogbookEntry->GetRunParameter("log"); runType += ")"; } + if (fLogbookEntry->GetDATestMode()){ + runType += " (DATest)"; + } TMonaLisaText mlRunType("SHUTTLE_runtype", runType); TList mlList; @@ -1319,21 +1358,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; @@ -1892,7 +1937,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; @@ -1908,6 +1953,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)); @@ -1972,38 +2022,45 @@ AliShuttleLogbookEntry* AliShuttle::QueryRunParameters(Int_t run) 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"); + 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)); + // 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 && 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") { + 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 - { - Log("SHUTTLE", Form("QueryRunParameters - Invalid parameters for Run %d: " - "startTime = %d, endTime = %d. Skipping (Shuttle won't be marked as DONE)!", - run, startTime, endTime)); + } + } 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 = %d, endTime = %d. Skipping (Shuttle won't be marked as DONE)!", + run, startTime, endTime)); } if (skip) @@ -2340,7 +2397,7 @@ TList* AliShuttle::GetFileSources(Int_t system, const char* detector, const char return NULL; } - TString sourceName = 0; + TString sourceName = ""; if (system == kDAQ) { sourceName = "DAQsource"; @@ -2419,7 +2476,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"; @@ -2483,7 +2540,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; @@ -2627,6 +2697,8 @@ Bool_t AliShuttle::UpdateTableSkippedCase(const char* detector) Bool_t result = kTRUE; + TString detName(detector); + for (UInt_t system=0; system<3; system++) { @@ -2644,10 +2716,10 @@ Bool_t AliShuttle::UpdateTableSkippedCase(const char* detector) 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()); @@ -2813,16 +2885,6 @@ UInt_t AliShuttle::GetCurrentEndTime() const 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 { @@ -3154,7 +3216,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(); @@ -3261,6 +3323,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)!", @@ -3289,10 +3352,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/%d/%s.log \n\n", + "\thttp://pcalishuttle02.cern.ch/%s/%d/%d/%s.log \n\n", fCurrentDetector.Data(), logFolder.Data(), GetCurrentRun()/10000, GetCurrentRun(), fCurrentDetector.Data()); - body += Form("The last 10 lines of %s log file are following:\n\n", 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())); @@ -3302,7 +3365,7 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) TString logFileName = Form("%s/%d/%d/%s.log", GetShuttleLogDir(), GetCurrentRun()/10000, GetCurrentRun(), fCurrentDetector.Data()); - TString tailCommand = Form("tail -n 10 %s >> %s", logFileName.Data(), bodyFileName.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()); @@ -3331,7 +3394,6 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) return result == 0; } - //______________________________________________________________________________________________ const char* AliShuttle::GetRunType() { @@ -3394,7 +3456,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; } @@ -3421,6 +3483,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) { @@ -3455,7 +3611,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()); @@ -3472,7 +3628,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 @@ -3527,16 +3683,16 @@ Bool_t AliShuttle::TouchFile() 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 // @@ -3545,4 +3701,3 @@ const UInt_t AliShuttle::GetEndTimeDCSQuery() return GetCurrentEndTime()+fConfig->GetDCSQueryOffset(); } -