X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=SHUTTLE%2FAliShuttle.cxx;h=a9ead41837285ffaecc95715bcc2335a0b6e82e2;hb=9a1a13345cc1c683f8556a6622334e6a6534ff04;hp=9385047de85b9ba9320148e3540a2d9ecab849a1;hpb=1265724de36c9c383637d05f882e77d8c5db75de;p=u%2Fmrichter%2FAliRoot.git diff --git a/SHUTTLE/AliShuttle.cxx b/SHUTTLE/AliShuttle.cxx index 9385047de85..a9ead418372 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"); } @@ -375,6 +380,8 @@ Int_t AliShuttle::StoreOCDB(const TString& gridURI) AliCDBId aLocId = aLocEntry->GetId(); aLocEntry->SetVersion(-1); aLocEntry->SetSubVersion(-1); + + Log(fCurrentDetector.Data(), Form("Attempting to store %s", aLocId.ToString().Data())); // If local object is valid up to infinity we store it only if it is // the first unprocessed run! @@ -395,47 +402,51 @@ Int_t AliShuttle::StoreOCDB(const TString& gridURI) Bool_t store = kTRUE; TIter gridIter(gridIds); AliCDBId* aGridId = 0; - while((aGridId = dynamic_cast (gridIter.Next()))){ - if(aGridId->GetPath() != aLocId.GetPath()) continue; + while ((aGridId = dynamic_cast (gridIter.Next()))) { + if (aGridId->GetPath() != aLocId.GetPath()) + continue; // skip all objects valid up to infinity - if(aGridId->GetLastRun() == AliCDBRunRange::Infinity()) continue; + if (aGridId->GetLastRun() == AliCDBRunRange::Infinity()) + continue; + // if we get here, it means there's already some more recent object stored on Grid! + Log(fCurrentDetector.Data(), + Form("StoreOCDB - A more recent object already exists in %s storage: <%s>", + type, aGridId->ToString().Data())); + store = kFALSE; break; } - // If we get here, the file can be stored! - Bool_t storeOk = gridSto->Put(aLocEntry); - if(!store || storeOk){ - - if (!store) - { - Log(fCurrentDetector.Data(), - Form("StoreOCDB - A more recent object already exists in %s storage: <%s>", - type, aGridId->ToString().Data())); - } else { + Bool_t storeOk = kFALSE; + if (store) + { + Log(fCurrentDetector.Data(), Form("Prechecks succeeded. Ready to store %s", aLocId.ToString().Data())); + storeOk = gridSto->Put(aLocEntry); + if (storeOk) { Log("SHUTTLE", - Form("StoreOCDB - Object <%s> successfully put into %s storage", - aLocId.ToString().Data(), type)); + Form("StoreOCDB - Object <%s> successfully put into %s storage", + aLocId.ToString().Data(), type)); Log(fCurrentDetector.Data(), Form("StoreOCDB - Object <%s> successfully put into %s storage", - aLocId.ToString().Data(), type)); + aLocId.ToString().Data(), type)); + } else { + Log("SHUTTLE", + Form("StoreOCDB - Grid %s storage of object <%s> failed", + type, aLocId.ToString().Data())); + Log(fCurrentDetector.Data(), + Form("StoreOCDB - Grid %s storage of object <%s> failed", + type, aLocId.ToString().Data())); + result = kFALSE; } - - // removing local filename... + } + + if (!store || storeOk) { + // removing local file... TString filename; localSto->IdToFilename(aLocId, filename); Log("SHUTTLE", Form("StoreOCDB - Removing local file %s", filename.Data())); RemoveFile(filename.Data()); - continue; - } else { - Log("SHUTTLE", - Form("StoreOCDB - Grid %s storage of object <%s> failed", - type, aLocId.ToString().Data())); - Log(fCurrentDetector.Data(), - Form("StoreOCDB - Grid %s storage of object <%s> failed", - type, aLocId.ToString().Data())); - result = kFALSE; } } localEntries->Clear(); @@ -859,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); @@ -868,8 +879,6 @@ const char* AliShuttle::GetRefFilePrefix(const char* base, const char* detector) } return dir.Data(); - - } //______________________________________________________________________________________________ @@ -940,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); @@ -968,21 +978,28 @@ 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; } - SendMLInfo(); + SendMLDetInfo(); return kTRUE; } @@ -1016,13 +1033,18 @@ 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); - SendMLInfo(); + AliLog::SetGlobalLogLevel((AliLog::EType_t)logLevel); + + SendMLDetInfo(); } //______________________________________________________________________________________________ -void AliShuttle::SendMLInfo() +void AliShuttle::SendMLDetInfo() { // // sends ML information about the current status of the current detector being processed @@ -1031,7 +1053,7 @@ void AliShuttle::SendMLInfo() AliShuttleStatus* status = dynamic_cast (fStatusEntry->GetObject()); if (!status){ - Log("SHUTTLE", "SendMLInfo - UNEXPECTED: status could not be read from current CDB entry"); + Log("SHUTTLE", "SendMLDetInfo - UNEXPECTED: status could not be read from current CDB entry"); return; } @@ -1159,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())); @@ -1170,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); @@ -1180,6 +1226,71 @@ Bool_t AliShuttle::ContinueProcessing() return cont; } +//______________________________________________________________________________________________ +void AliShuttle::SendMLRunInfo(const char* status) +{ + // + // Send information about this run to ML + + TMonaLisaText mlStatus("SHUTTLE_status", status); + TString runType(fLogbookEntry->GetRunType()); + if (strlen(fLogbookEntry->GetRunParameter("log")) > 0){ + + runType += "("; + runType += fLogbookEntry->GetRunParameter("log"); + runType += ")"; + } + if (fLogbookEntry->GetDATestMode()){ + runType += " (DATest)"; + } + TMonaLisaText mlRunType("SHUTTLE_runtype", runType); + + TList mlList; + mlList.Add(&mlStatus); + mlList.Add(&mlRunType); + + TString mlID; + mlID.Form("%d", GetCurrentRun()); + fMonaLisa->SendParameters(&mlList, mlID); +} + +//______________________________________________________________________________________________ +Int_t AliShuttle::GetMem(Int_t pid) +{ + // invokes ps to get the memory consumption of the process + // returns -1 in case of error + + TString checkStr; + checkStr.Form("ps -o vsize --pid %d | tail -n 1", pid); + FILE* pipe = gSystem->OpenPipe(checkStr, "r"); + if (!pipe) + { + Log("SHUTTLE", Form("Process - Error: " + "Could not open pipe to %s", checkStr.Data())); + return -1; + } + + char buffer[100]; + if (!fgets(buffer, 100, pipe)) + { + Log("SHUTTLE", "Process - Error: ps did not return anything"); + gSystem->ClosePipe(pipe); + return -1; + } + gSystem->ClosePipe(pipe); + + //Log("SHUTTLE", Form("ps returned %s", buffer)); + + Int_t mem = 0; + if ((sscanf(buffer, "%d\n", &mem) != 1) || !mem) + { + Log("SHUTTLE", "Process - Error: Could not parse output of ps"); + return -1; + } + + return mem; +} + //______________________________________________________________________________________________ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) { @@ -1197,26 +1308,10 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) Log("SHUTTLE", Form("\t\t\t^*^*^*^*^*^*^*^*^*^*^*^* run %d: START ^*^*^*^*^*^*^*^*^*^*^*^*", GetCurrentRun())); - // Send the information to ML CountOpenRuns(); - TMonaLisaText mlStatus("SHUTTLE_status", "Processing"); - TString runType(entry->GetRunType()); - if (strlen(entry->GetRunParameter("log")) > 0){ - - runType += "("; - runType += entry->GetRunParameter("log"); - runType += ")"; - } - TMonaLisaText mlRunType("SHUTTLE_runtype", runType); - - TList mlList; - mlList.Add(&mlStatus); - mlList.Add(&mlRunType); - - TString mlID; - mlID.Form("%d", GetCurrentRun()); - fMonaLisa->SendParameters(&mlList, mlID); + // Send the information to ML + SendMLRunInfo("Processing"); if (fLogbookEntry->IsDone()) { @@ -1264,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; @@ -1306,6 +1407,9 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) GetCurrentRun(), aDetector->GetName())); for(Int_t iSys=0;iSys<3;iSys++) fFXSCalled[iSys]=kFALSE; + + Int_t initialMem = GetMem(getpid()); + Log("SHUTTLE", Form("Memory consumption before forking is %d", initialMem)); Log(fCurrentDetector.Data(), "Process - Starting processing"); @@ -1330,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); @@ -1348,33 +1487,14 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) { gSystem->Sleep(1000); - TString checkStr; - checkStr.Form("ps -o vsize --pid %d | tail -n 1", pid); - FILE* pipe = gSystem->OpenPipe(checkStr, "r"); - if (!pipe) - { - Log("SHUTTLE", Form("Process - Error: " - "Could not open pipe to %s", checkStr.Data())); + Int_t mem = GetMem(pid); + + if (mem < 0) continue; - } - char buffer[100]; - if (!fgets(buffer, 100, pipe)) - { - Log("SHUTTLE", "Process - Error: ps did not return anything"); - gSystem->ClosePipe(pipe); - continue; - } - gSystem->ClosePipe(pipe); - - //Log("SHUTTLE", Form("ps returned %s", buffer)); - - Int_t mem = 0; - if ((sscanf(buffer, "%d\n", &mem) != 1) || !mem) - { - Log("SHUTTLE", "Process - Error: Could not parse output of ps"); - continue; - } + mem -= initialMem; + if (mem < 0) + mem = 0; if (expiredTime % 60 == 0) { @@ -1437,8 +1557,9 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) } 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! @@ -1487,7 +1608,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())); } @@ -1541,10 +1662,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) fFirstUnprocessed[iDet] = kFALSE; } } - TMonaLisaText mlStatusPending("SHUTTLE_status", "Pending"); - mlList.Clear(); - mlList.Add(&mlStatusPending); - fMonaLisa->SendParameters(&mlList, mlID); + SendMLRunInfo("Pending"); } } @@ -1579,11 +1697,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()); @@ -1629,6 +1760,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); @@ -1651,6 +1783,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); @@ -1743,6 +1876,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; @@ -1821,7 +1956,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; @@ -1837,6 +1972,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)); @@ -1901,35 +2041,66 @@ 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"); + UInt_t daqstartTime = tmpdaqstartTime.Atoi(); - TString totEventsStr = entry->GetRunParameter("totalEvents"); - Int_t totEvents = totEventsStr.Atoi(); - - if (startTime != 0 && endTime != 0 && endTime > startTime && totEvents > 0 && ecsSuccess) - return entry; - - if (ecsSuccess == kFALSE) - { - Log("SHUTTLE", Form("Skipped run %d due to ECS failure, Reason: %s", run, entry->GetRunParameter("eor_reason"))); - } - else if (totEvents < 1) - { - Log("SHUTTLE", Form("QueryRunParameters - Run %d has 0 events - Skipping!", run)); + UInt_t now = time(0); + Int_t dcsDelay = fConfig->GetDCSDelay()+fConfig->GetDCSQueryOffset(); + + Bool_t skip = kFALSE; + + // 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") { + 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)); } - else + + if (skip) { - Log("SHUTTLE", Form("QueryRunParameters - Invalid parameters for Run %d: " - "startTime = %d, endTime = %d. Skipping (Shuttle won't be marked as DONE)!", - run, startTime, endTime)); + Log("SHUTTLE", Form("Marking SHUTTLE skipped for run %d", run)); + fLogbookEntry = entry; + if (!UpdateShuttleLogbook("shuttle_skipped")) + { + 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; } - - //Log("SHUTTLE", Form("Marking SHUTTLE done for run %d", run)); - //fLogbookEntry = entry; - //if (!UpdateShuttleLogbook("shuttle_done")) - //{ - // AliError(Form("Could not update logbook for run %d !", run)); - //} - //fLogbookEntry = 0; delete entry; return 0; @@ -1950,13 +2121,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) @@ -2083,10 +2258,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 @@ -2244,7 +2421,7 @@ TList* AliShuttle::GetFileSources(Int_t system, const char* detector, const char return NULL; } - TString sourceName = 0; + TString sourceName = ""; if (system == kDAQ) { sourceName = "DAQsource"; @@ -2323,7 +2500,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"; @@ -2387,7 +2564,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; @@ -2521,6 +2711,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() { @@ -2586,29 +2831,24 @@ Bool_t AliShuttle::UpdateShuttleLogbook(const char* detector, const char* status TString detName(detector); TString setClause; - if (detName == "shuttle_done" || detName == "shuttle_ignored") + if (detName == "shuttle_done" || detName == "shuttle_skipped") { setClause = "set shuttle_done=1"; - + if (detName == "shuttle_done") { - if (TouchFile()==kTRUE){ - //Send the information to ML - TMonaLisaText mlStatus("SHUTTLE_status", "Done"); - - TList mlList; - mlList.Add(&mlStatus); - - TString mlID; - mlID.Form("%d", GetCurrentRun()); - fMonaLisa->SendParameters(&mlList, mlID); - } - else{ + if (TouchFile() != kTRUE) + { + SendMLRunInfo("Pending"); return kFALSE; } - + + SendMLRunInfo("Done"); } - } else { + else + SendMLRunInfo("Skipped"); + } + else { TString statusStr(status); if(statusStr.Contains("done", TString::kIgnoreCase) || statusStr.Contains("failed", TString::kIgnoreCase)){ @@ -2669,7 +2909,6 @@ UInt_t AliShuttle::GetCurrentEndTime() const return fLogbookEntry ? fLogbookEntry->GetEndTime() : 0; } - //______________________________________________________________________________________________ UInt_t AliShuttle::GetCurrentYear() const { @@ -2699,16 +2938,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)) { @@ -2725,7 +2965,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) @@ -2759,8 +2999,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); } @@ -2802,7 +3043,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"); @@ -2833,9 +3073,9 @@ Bool_t AliShuttle::Collect(Int_t run) { // query Shuttle logbook for earlier runs, check if some detectors are unprocessed, // flag them into fFirstUnprocessed array - TString whereClause(Form("where shuttle_done=0 and run < %d", run)); + TString whereClauseBis(Form("where shuttle_done=0 and run < %d", run)); TObjArray tmpLogbookEntries; - if (!QueryShuttleLogbook(whereClause, tmpLogbookEntries)) + if (!QueryShuttleLogbook(whereClauseBis, tmpLogbookEntries)) { Log("SHUTTLE", "Collect - Can't retrieve entries from Shuttle logbook"); return kFALSE; @@ -3000,9 +3240,13 @@ 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(); + TString tmpStr; + if (runMode == 0) tmpStr = " Nightly Test:"; + else tmpStr = " Data Taking:"; void* dir = gSystem->OpenDirectory(GetShuttleLogDir()); if (dir == NULL) { @@ -3083,8 +3327,8 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) TString body; if (target == kDCSEMail){ - subject = Form("Retrieval of data points for %s FAILED in run %d !", - fCurrentDetector.Data(), GetCurrentRun()); + 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())); body = Form("Dear DCS experts, \n\n"); @@ -3092,8 +3336,8 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) "in run %d!!\n\n", fCurrentDetector.Data(), GetCurrentRun()); } else if (target == kFXSEMail){ - subject = Form("FXS communication for %s FAILED in run %d !", - fCurrentDetector.Data(), GetCurrentRun()); + 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; if (system == kDAQ) sys="DAQ"; @@ -3103,10 +3347,11 @@ 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 Shuttle preprocessor FAILED in run %d (run type = %s)!", - fCurrentDetector.Data(), GetCurrentRun(), GetRunType()); + subject = Form("%s %s Shuttle preprocessor FAILED in run %d (run type = %s)!", + tmpStr.Data(), fCurrentDetector.Data(), GetCurrentRun(), GetRunType()); AliDebug(2, Form("subject: %s", subject.Data())); body = Form("Dear %s expert(s), \n\n", fCurrentDetector.Data()); @@ -3119,9 +3364,9 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) fCurrentDetector.Data()); if (fConfig->GetRunMode() == AliShuttleConfig::kTest) { - body += Form("\thttp://pcalimonitor.cern.ch:8889/shuttle.jsp?time=168 \n\n"); + body += Form("\thttp://pcalimonitor.cern.ch/shuttle.jsp?time=24 \n\n"); } else { - body += Form("\thttp://pcalimonitor.cern.ch/shuttle.jsp?instance=PROD&time=168 \n\n"); + body += Form("\thttp://pcalimonitor.cern.ch/shuttle.jsp?instance=PROD&time=24 \n\n"); } @@ -3131,10 +3376,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())); @@ -3142,9 +3387,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()); @@ -3173,7 +3418,6 @@ Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) return result == 0; } - //______________________________________________________________________________________________ const char* AliShuttle::GetRunType() { @@ -3201,7 +3445,7 @@ Bool_t AliShuttle::GetHLTStatus() } // TODO implement when HLTMode is inserted in run logbook - TString hltMode = fLogbookEntry->GetRunParameter("HLTMode"); + TString hltMode = fLogbookEntry->GetRunParameter("HLTmode"); TSubString firstChar = hltMode(0,1); AliDebug(2,Form("First char = %s ",firstChar.Data())); if (firstChar == "A") { @@ -3236,7 +3480,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; } @@ -3263,6 +3507,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) { @@ -3297,7 +3635,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()); @@ -3309,10 +3647,12 @@ Bool_t AliShuttle::TouchFile() TMap *mapLs = dynamic_cast(resultLs->At(0)); if (!mapLs){ Log("SHUTTLE",Form("No map for %s command, returning without touching",commandLs.Data())); + delete resultLs; + resultLs = 0x0; 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 @@ -3320,6 +3660,8 @@ Bool_t AliShuttle::TouchFile() Bool_t boolMkdir = gGrid->Mkdir(dir.Data()); if (!boolMkdir) { Log("SHUTTLE",Form("Impossible to create dir %s in alien catalogue for run %i!",dir.Data(),GetCurrentRun())); + delete resultLs; + resultLs = 0x0; return kFALSE; } Log("SHUTTLE",Form("Directory %s successfully created in alien catalogue for run %i",dir.Data(),GetCurrentRun())); @@ -3328,6 +3670,9 @@ Bool_t AliShuttle::TouchFile() Log("SHUTTLE",Form("Directory %s correctly found for run %i",dir.Data(),GetCurrentRun())); } + delete resultLs; + resultLs = 0x0; + TString command; command.Form("touch %s/%i", dir.Data(), GetCurrentRun()); Log("SHUTTLE", Form("Creating entry in file catalog: %s", command.Data())); @@ -3339,18 +3684,44 @@ Bool_t AliShuttle::TouchFile() TMap *mapTouch = dynamic_cast(resultTouch->At(0)); if (!mapTouch){ Log("SHUTTLE",Form("No map for touching command, returning without touching for run %i",GetCurrentRun())); + delete resultTouch; + resultTouch = 0x0; return kFALSE; } TObjString *valueTouch = dynamic_cast(mapTouch->GetValue("__result__")); if (!valueTouch){ Log("SHUTTLE",Form("No value for \"__result__\" key set in the map for touching command, returning without touching for run %i",GetCurrentRun())); + delete resultTouch; + resultTouch = 0x0; return kFALSE; } if (valueTouch->GetString()!="1"){ Log("SHUTTLE",Form("Failing the touching command, returning without touching for run %i",GetCurrentRun())); + delete resultTouch; + resultTouch = 0x0; return kFALSE; } + 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(); +}