X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=SHUTTLE%2FAliShuttle.cxx;h=57f97f334d16ad25331d37dfaabc2f3e7220df81;hb=777a0ba65ef2496048d8f0840853969bcf985794;hp=b49d6c8dda9dbe75e607048945867e3ad6977118;hpb=1bd183bab6e99988b7e8bf75e9db2aeb3bfc1222;p=u%2Fmrichter%2FAliRoot.git diff --git a/SHUTTLE/AliShuttle.cxx b/SHUTTLE/AliShuttle.cxx index b49d6c8dda9..57f97f334d1 100644 --- a/SHUTTLE/AliShuttle.cxx +++ b/SHUTTLE/AliShuttle.cxx @@ -13,7 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* $Id:$ */ +/* $Id$ */ // // This class is the main manager for AliShuttle. @@ -57,6 +57,7 @@ #include #include #include +#include #include @@ -77,6 +78,8 @@ fTimeout(timeout), fRetries(retries), fPreprocessorMap(), fLogbookEntry(0), fCurrentDetector(), +fFirstProcessing(0), +fFXSError(-1), fStatusEntry(0), fMonitoringMutex(0), fLastActionTime(0), @@ -252,6 +255,8 @@ Bool_t AliShuttle::StoreOCDB() // Then calls StoreRefFilesToGrid to store reference files. // + UpdateShuttleStatus(AliShuttleStatus::kStoreStarted); + if (fTestMode & kErrorGrid) { Log("SHUTTLE", "StoreOCDB - In TESTMODE - Simulating error while storing in the Grid"); @@ -260,10 +265,10 @@ Bool_t AliShuttle::StoreOCDB() } Log("SHUTTLE","StoreOCDB - Storing OCDB data ..."); - Bool_t resultCDB = StoreOCDB(fgkMainCDB); + Int_t resultCDB = StoreOCDB(fgkMainCDB); Log("SHUTTLE","StoreOCDB - Storing reference data ..."); - Bool_t resultRef = StoreOCDB(fgkMainRefStorage); + Int_t resultRef = StoreOCDB(fgkMainRefStorage); Log("SHUTTLE","StoreOCDB - Storing reference files ..."); Bool_t resultRefFiles = CopyFilesToGrid("reference"); @@ -271,23 +276,60 @@ 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"); } - return resultCDB && resultRef && resultRefFiles && resultMetadata; + Int_t storeResult = 0; + + if (resultCDB < 0 || resultRef < 0 || resultRefFiles == kFALSE || resultMetadata == kFALSE) + storeResult = -1; + else if (resultCDB > 0 || resultRef > 0) + storeResult = 1; + + if (storeResult < 0) + { + Log("SHUTTLE", + Form("\t\t\t****** run %d - %s: STORAGE ERROR ******", + GetCurrentRun(), fCurrentDetector.Data())); + UpdateShuttleStatus(AliShuttleStatus::kStoreError); + } + else if (storeResult > 0) + { + Log("SHUTTLE", + Form("\t\t\t****** run %d - %s: STORAGE DELAYED ******", + GetCurrentRun(), fCurrentDetector.Data())); + UpdateShuttleStatus(AliShuttleStatus::kStoreDelayed); + } + else if (storeResult == 0) + { + Log("SHUTTLE", + Form("\t\t\t****** run %d - %s: DONE ******", + GetCurrentRun(), fCurrentDetector.Data())); + UpdateShuttleStatus(AliShuttleStatus::kDone); + UpdateShuttleLogbook(fCurrentDetector, "DONE"); + } + + return (storeResult == 0); } //______________________________________________________________________________________________ -Bool_t AliShuttle::StoreOCDB(const TString& gridURI) +Int_t AliShuttle::StoreOCDB(const TString& gridURI) { // // Called by StoreOCDB(), performs actual storage to the main OCDB and reference storages (Grid) // + // Return code: + // -2 initialization error + // -1 storage error + // 0 success + // 1 storage delayed (e.g. previous unprocessed runs) + // TObjArray* gridIds=0; Bool_t result = kTRUE; + Bool_t delayed = kFALSE; const char* type = 0; TString localURI; @@ -299,7 +341,7 @@ Bool_t AliShuttle::StoreOCDB(const TString& gridURI) localURI = fgkLocalRefStorage; } else { AliError(Form("Invalid storage URI: %s", gridURI.Data())); - return kFALSE; + return -2; } AliCDBManager* man = AliCDBManager::Instance(); @@ -308,7 +350,7 @@ Bool_t AliShuttle::StoreOCDB(const TString& gridURI) if(!gridSto) { Log("SHUTTLE", Form("StoreOCDB - cannot activate main %s storage", type)); - return kFALSE; + return -2; } gridIds = gridSto->GetQueryCDBList(); @@ -318,7 +360,7 @@ Bool_t AliShuttle::StoreOCDB(const TString& gridURI) if(!localSto) { Log("SHUTTLE", Form("StoreOCDB - cannot activate local %s storage", type)); - return kFALSE; + return -2; } AliCDBPath aPath(GetOfflineDetName(fCurrentDetector.Data()),"*","*"); // Local objects were stored with current run as Grid version! @@ -333,6 +375,8 @@ Bool_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! @@ -342,7 +386,10 @@ Bool_t AliShuttle::StoreOCDB(const TString& gridURI) Log("SHUTTLE", Form("StoreOCDB - %s: object %s has validity infinite but " "there are previous unprocessed runs!", fCurrentDetector.Data(), aLocId.GetPath().Data())); - result = kFALSE; + Log(fCurrentDetector.Data(), Form("StoreOCDB - %s: object %s has validity infinite but " + "there are previous unprocessed runs!", + fCurrentDetector.Data(), aLocId.GetPath().Data())); + delayed = kTRUE; continue; } @@ -350,52 +397,66 @@ Bool_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(); - return result; + Int_t returnCode = 0; + + if (result == kFALSE) + returnCode = -1; + else if (delayed != kFALSE) + returnCode = 1; + + Log("SHUTTLE", Form("StoreOCDB - Returning with %d (result = %d, delayed = %d)", returnCode, result, delayed)); + Log(fCurrentDetector.Data(), Form("StoreOCDB - Returning with %d (result = %d, delayed = %d)", returnCode, result, delayed)); + + return returnCode; } //______________________________________________________________________________________________ @@ -561,8 +622,8 @@ Bool_t AliShuttle::StoreRunMetadataFile(const char* localFile, const char* gridF lhcPeriod.Data())); } - TString target = Form("%s/GRP/RunMetadata/alice/data/%d/%s/%09d/raw/%s", - localBaseFolder.Data(), GetCurrentYear(), + TString target = Form("%s/GRP/RunMetadata%s%d/%s/%09d/raw/%s", + localBaseFolder.Data(), fConfig->GetAlienPath(), GetCurrentYear(), lhcPeriod.Data(), GetCurrentRun(), gridFileName); return CopyFileLocally(localFile, target); @@ -681,10 +742,10 @@ Bool_t AliShuttle::CopyFilesToGrid(const char* type) lhcPeriod.Append(Form("_%s", partition.Data())); } - dir = Form("%s/GRP/RunMetadata/alice/data/%d/%s/%09d/raw", - localBaseFolder.Data(), GetCurrentYear(), + dir = Form("%s/GRP/RunMetadata%s%d/%s/%09d/raw", + localBaseFolder.Data(), fConfig->GetAlienPath(), GetCurrentYear(), lhcPeriod.Data(), GetCurrentRun()); - alienDir = dir(dir.Index("/alice/data/"), dir.Length()); + alienDir = dir(dir.Index(fConfig->GetAlienPath()), dir.Length()); begin = ""; } @@ -885,8 +946,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); @@ -913,8 +975,10 @@ 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); @@ -927,7 +991,7 @@ Bool_t AliShuttle::WriteShuttleStatus(AliShuttleStatus* status) return kFALSE; } - SendMLInfo(); + SendMLDetInfo(); return kTRUE; } @@ -963,11 +1027,11 @@ void AliShuttle::UpdateShuttleStatus(AliShuttleStatus::Status newStatus, Bool_t AliCDBManager::Instance()->GetStorage(fgkLocalCDB)->Put(fStatusEntry); - SendMLInfo(); + SendMLDetInfo(); } //______________________________________________________________________________________________ -void AliShuttle::SendMLInfo() +void AliShuttle::SendMLDetInfo() { // // sends ML information about the current status of the current detector being processed @@ -976,7 +1040,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; } @@ -999,7 +1063,8 @@ Bool_t AliShuttle::ContinueProcessing() // checks if the processing should be continued // if yes it returns kTRUE and updates the AliShuttleStatus with nextStatus - if (!fConfig->HostProcessDetector(fCurrentDetector)) return kFALSE; + if (!fConfig->HostProcessDetector(fCurrentDetector)) + return kFALSE; AliPreprocessor* aPreprocessor = dynamic_cast (fPreprocessorMap.GetValue(fCurrentDetector)); @@ -1012,7 +1077,7 @@ Bool_t AliShuttle::ContinueProcessing() AliShuttleLogbookEntry::Status entryStatus = fLogbookEntry->GetDetectorStatus(fCurrentDetector); - if(entryStatus != AliShuttleLogbookEntry::kUnprocessed) { + if (entryStatus != AliShuttleLogbookEntry::kUnprocessed) { Log("SHUTTLE", Form("ContinueProcessing - %s is %s", fCurrentDetector.Data(), fLogbookEntry->GetDetectorStatusName(entryStatus))); @@ -1040,45 +1105,44 @@ Bool_t AliShuttle::ContinueProcessing() } } + // Is the subdetector processed first time for this run? + fFirstProcessing = kFALSE; + AliShuttleStatus* status = ReadShuttleStatus(); if (!status) { // first time Log("SHUTTLE", Form("ContinueProcessing - %s: Processing first time", fCurrentDetector.Data())); status = new AliShuttleStatus(AliShuttleStatus::kStarted); + fFirstProcessing = kTRUE; return WriteShuttleStatus(status); } - // The following two cases shouldn't happen if Shuttle Logbook was correctly updated. + // The following case shouldn't happen if Shuttle Logbook was correctly updated. // If it happens it may mean Logbook updating failed... let's do it now! if (status->GetStatus() == AliShuttleStatus::kDone || - status->GetStatus() == AliShuttleStatus::kFailed){ + status->GetStatus() == AliShuttleStatus::kFailed || + status->GetStatus() == AliShuttleStatus::kSkipped) { Log("SHUTTLE", Form("ContinueProcessing - %s is already %s. Updating Shuttle Logbook", fCurrentDetector.Data(), status->GetStatusName(status->GetStatus()))); - UpdateShuttleLogbook(fCurrentDetector.Data(), - status->GetStatusName(status->GetStatus())); + + if (status->GetStatus() == AliShuttleStatus::kSkipped) + { + UpdateShuttleLogbook(fCurrentDetector.Data(), "DONE"); + } + else + UpdateShuttleLogbook(fCurrentDetector.Data(), status->GetStatusName(status->GetStatus())); + return kFALSE; } - if (status->GetStatus() == AliShuttleStatus::kStoreStarted || status->GetStatus() == AliShuttleStatus::kStoreError) { + if (status->GetStatus() == AliShuttleStatus::kStoreStarted || status->GetStatus() == AliShuttleStatus::kStoreDelayed ||status->GetStatus() == AliShuttleStatus::kStoreError) { Log("SHUTTLE", Form("ContinueProcessing - %s: Grid storage of one or more " "objects failed. Trying again now", fCurrentDetector.Data())); - UpdateShuttleStatus(AliShuttleStatus::kStoreStarted); - if (StoreOCDB()){ - Log("SHUTTLE", Form("ContinueProcessing - %s: all objects " - "successfully stored into main storage", - fCurrentDetector.Data())); - UpdateShuttleStatus(AliShuttleStatus::kDone); - UpdateShuttleLogbook(fCurrentDetector, "DONE"); - } else { - Log("SHUTTLE", - Form("ContinueProcessing - %s: Grid storage failed again", - fCurrentDetector.Data())); - UpdateShuttleStatus(AliShuttleStatus::kStoreError); - } + StoreOCDB(); return kFALSE; } @@ -1103,10 +1167,10 @@ Bool_t AliShuttle::ContinueProcessing() // Send mail to detector expert! Log("SHUTTLE", Form("ContinueProcessing - Sending mail to %s expert...", - fCurrentDetector.Data())); - if (!SendMail()) + fCurrentDetector.Data())); + if (!SendMail(kPPEMail)) Log("SHUTTLE", Form("ContinueProcessing - Could not send mail to %s expert", - fCurrentDetector.Data())); + fCurrentDetector.Data())); } else { Log("SHUTTLE", Form("ContinueProcessing - %s: restarting. " @@ -1114,7 +1178,8 @@ Bool_t AliShuttle::ContinueProcessing() status->GetStatusName(), status->GetCount())); Bool_t increaseCount = kTRUE; if (status->GetStatus() == AliShuttleStatus::kDCSError || - status->GetStatus() == AliShuttleStatus::kDCSStarted) + status->GetStatus() == AliShuttleStatus::kDCSStarted || + status->GetStatus() == AliShuttleStatus::kFXSError) increaseCount = kFALSE; UpdateShuttleStatus(AliShuttleStatus::kStarted, increaseCount); @@ -1124,6 +1189,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) { @@ -1141,17 +1271,10 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) Log("SHUTTLE", Form("\t\t\t^*^*^*^*^*^*^*^*^*^*^*^* run %d: START ^*^*^*^*^*^*^*^*^*^*^*^*", GetCurrentRun())); + CountOpenRuns(); + // Send the information to ML - TMonaLisaText mlStatus("SHUTTLE_status", "Processing"); - TMonaLisaText mlRunType("SHUTTLE_runtype", Form("%s (%s)", entry->GetRunType(), entry->GetRunParameter("log"))); - - TList mlList; - mlList.Add(&mlStatus); - mlList.Add(&mlRunType); - - TString mlID; - mlID.Form("%d", GetCurrentRun()); - fMonaLisa->SendParameters(&mlList, mlID); + SendMLRunInfo("Processing"); if (fLogbookEntry->IsDone()) { @@ -1199,22 +1322,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; - } - - if (fgkMainCDB.Length() == 0) - fgkMainCDB = Form("alien://folder=/alice/data/%d/%s/OCDB?user=alidaq?cacheFold=/tmp/OCDBCache", - GetCurrentYear(), lhcPeriod.Data()); - - if (fgkMainRefStorage.Length() == 0) - fgkMainRefStorage = Form("alien://folder=/alice/data/%d/%s/Reference?user=alidaq?cacheFold=/tmp/OCDBCache", - 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; @@ -1225,7 +1353,8 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) { fCurrentDetector = aDetector->String(); - if (ContinueProcessing() == kFALSE) continue; + if (ContinueProcessing() == kFALSE) + continue; if (first) { @@ -1241,6 +1370,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"); @@ -1265,16 +1397,42 @@ 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::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); @@ -1283,33 +1441,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) { @@ -1353,8 +1492,8 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) } else if (pid == 0) { - // client - Log("SHUTTLE", Form("Process - In client process of %d - %s", GetCurrentRun(), + // child + Log("SHUTTLE", Form("Process - In child process of %d - %s", GetCurrentRun(), aDetector->GetName())); Log("SHUTTLE", Form("Process - Redirecting output to %s log",fCurrentDetector.Data())); @@ -1372,8 +1511,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! @@ -1395,11 +1535,11 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) gSystem->Exit(1); } - Bool_t success = ProcessCurrentDetector(); - + Int_t success = ProcessCurrentDetector(); + gSystem->ChangeDirectory(wd.Data()); - if (success) // Preprocessor finished successfully! + if (success == 1) // Preprocessor finished successfully! { // remove temporary folder or DCS map if (!fConfig->KeepTempFolder()) @@ -1416,22 +1556,10 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) fCurrentDetector.Data())); // Transfer the data from local storage to main storage (Grid) - UpdateShuttleStatus(AliShuttleStatus::kStoreStarted); if (StoreOCDB() == kFALSE) - { - Log("SHUTTLE", - Form("\t\t\t****** run %d - %s: STORAGE ERROR ******", - GetCurrentRun(), aDetector->GetName())); - UpdateShuttleStatus(AliShuttleStatus::kStoreError); success = kFALSE; - } else { - Log("SHUTTLE", - Form("\t\t\t****** run %d - %s: DONE ******", - GetCurrentRun(), aDetector->GetName())); - UpdateShuttleStatus(AliShuttleStatus::kDone); - UpdateShuttleLogbook(fCurrentDetector, "DONE"); - } - } else + } + else if (success == 0) { Log("SHUTTLE", Form("\t\t\t****** run %d - %s: PP ERROR ******", @@ -1488,6 +1616,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) fFirstUnprocessed[iDet] = kFALSE; } } + SendMLRunInfo("Pending"); } } @@ -1497,7 +1626,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry) } //______________________________________________________________________________________________ -Bool_t AliShuttle::ProcessCurrentDetector() +Int_t AliShuttle::ProcessCurrentDetector() { // // Makes data retrieval just for a specific detector (fCurrentDetector). @@ -1509,16 +1638,30 @@ Bool_t AliShuttle::ProcessCurrentDetector() TString wd = gSystem->WorkingDirectory(); if (!CleanReferenceStorage(fCurrentDetector.Data())) - return kFALSE; + return 0; gSystem->ChangeDirectory(wd.Data()); - TMap* dcsMap = new TMap(); - // call preprocessor AliPreprocessor* aPreprocessor = dynamic_cast (fPreprocessorMap.GetValue(fCurrentDetector)); + // check if the preprocessor wants to process this run type + if (aPreprocessor->ProcessRunType() == kFALSE) + { + 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; + } + + TMap* dcsMap = new TMap(); + aPreprocessor->Initialize(GetCurrentRun(), GetCurrentStartTime(), GetCurrentEndTime()); Bool_t processDCS = aPreprocessor->ProcessDCS(); @@ -1538,7 +1681,7 @@ Bool_t AliShuttle::ProcessCurrentDetector() UpdateShuttleStatus(AliShuttleStatus::kDCSStarted); UpdateShuttleStatus(AliShuttleStatus::kDCSError); delete dcsMap; - return kFALSE; + return 0; } else { UpdateShuttleStatus(AliShuttleStatus::kDCSStarted); @@ -1559,9 +1702,10 @@ Bool_t AliShuttle::ProcessCurrentDetector() TMap* aliasMap = 0; TMap* dpMap = 0; - + 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); @@ -1573,17 +1717,18 @@ Bool_t AliShuttle::ProcessCurrentDetector() " Sending mail to DCS experts!", host.Data())); UpdateShuttleStatus(AliShuttleStatus::kDCSError); - if (!SendMailToDCS()) + if (!SendMail(kDCSEMail)) Log("SHUTTLE", Form("ProcessCurrentDetector - " - "Could not send mail to DCS experts!")); + "Could not send mail to DCS experts!")); delete dcsMap; - return kFALSE; + return 0; } } 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); @@ -1595,13 +1740,13 @@ Bool_t AliShuttle::ProcessCurrentDetector() " Sending mail to DCS experts!", host.Data())); UpdateShuttleStatus(AliShuttleStatus::kDCSError); - if (!SendMailToDCS()) + if (!SendMail(kDCSEMail)) Log("SHUTTLE", Form("ProcessCurrentDetector - " - "Could not send mail to DCS experts!")); + "Could not send mail to DCS experts!")); if (aliasMap) delete aliasMap; delete dcsMap; - return kFALSE; + return 0; } } @@ -1638,7 +1783,17 @@ Bool_t AliShuttle::ProcessCurrentDetector() // DCS Archive DB processing successful. Call Preprocessor! UpdateShuttleStatus(AliShuttleStatus::kPPStarted); + fFXSError = -1; // this variable is kTRUE after ::Process if an FXS error occured + UInt_t returnValue = aPreprocessor->Process(dcsMap); + + if (fFXSError!=-1) { + UpdateShuttleStatus(AliShuttleStatus::kFXSError); + SendMail(kFXSEMail, fFXSError); + dcsMap->DeleteAll(); + delete dcsMap; + return 0; + } if (returnValue > 0) // Preprocessor error! { @@ -1647,7 +1802,7 @@ Bool_t AliShuttle::ProcessCurrentDetector() UpdateShuttleStatus(AliShuttleStatus::kPPError); dcsMap->DeleteAll(); delete dcsMap; - return kFALSE; + return 0; } // preprocessor ok! @@ -1658,7 +1813,7 @@ Bool_t AliShuttle::ProcessCurrentDetector() dcsMap->DeleteAll(); delete dcsMap; - return kTRUE; + return 1; } //______________________________________________________________________________________________ @@ -1666,6 +1821,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; @@ -1744,7 +1901,7 @@ Bool_t AliShuttle::QueryShuttleLogbook(const char* whereClause, } // TODO Check field count! - const UInt_t nCols = 23; + const UInt_t nCols = 25; if (aResult->GetFieldCount() != (Int_t) nCols) { Log("SHUTTLE", "Invalid SQL result field number!"); delete aResult; @@ -1760,6 +1917,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)); @@ -1818,119 +1980,63 @@ AliShuttleLogbookEntry* AliShuttle::QueryRunParameters(Int_t run) for (Int_t ii = 0; ii < aResult->GetFieldCount(); ii++) entry->SetRunParameter(aResult->GetFieldName(ii), aRow->GetField(ii)); + delete aRow; + delete aResult; + UInt_t startTime = entry->GetStartTime(); UInt_t endTime = entry->GetEndTime(); - -// if (!startTime || !endTime || startTime > endTime) -// { -// Log("SHUTTLE", -// Form("QueryRunParameters - Invalid parameters for Run %d: startTime = %d, endTime = %d. Skipping!", -// run, startTime, endTime)); -// -// 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; -// delete aRow; -// delete aResult; -// return 0; -// } - - if (!startTime) + Bool_t ecsSuccess = entry->GetECSSuccess(); + + TString totEventsStr = entry->GetRunParameter("totalEvents"); + Int_t totEvents = totEventsStr.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)) { - Log("SHUTTLE", - Form("QueryRunParameters - Invalid parameters for Run %d: " - "startTime = %d, endTime = %d. Skipping!", - run, startTime, endTime)); - - Log("SHUTTLE", Form("Marking SHUTTLE done for run %d", run)); - fLogbookEntry = entry; - if (!UpdateShuttleLogbook("shuttle_ignored")) - { - AliError(Form("Could not update logbook for run %d !", run)); - } - fLogbookEntry = 0; + 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; - delete entry; - delete aRow; - delete aResult; - return 0; + if (endTime != 0 && endTime >= now - dcsDelay) + { + Log("SHUTTLE", Form("Skipping run %d for now, because DCS buffer time is not yet expired", run)); } - - if (startTime && !endTime) + else if (totEvents <= 1) { - // TODO Here we don't mark SHUTTLE done, because this may mean - //the run is still ongoing!! - 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 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; - delete aRow; - delete aResult; - return 0; + Log("SHUTTLE", Form("QueryRunParameters - Run %d has 1 event or less - Skipping!", run)); + skip = kTRUE; } - - if (startTime && endTime && (startTime > endTime)) + else { - Log("SHUTTLE", - Form("QueryRunParameters - Invalid parameters for Run %d: " - "startTime = %d, endTime = %d. Skipping!", - run, startTime, endTime)); - - Log("SHUTTLE", Form("Marking SHUTTLE done for run %d", run)); - fLogbookEntry = entry; - if (!UpdateShuttleLogbook("shuttle_ignored")) - { - AliError(Form("Could not update logbook for run %d !", run)); - } - fLogbookEntry = 0; - - delete entry; - delete aRow; - delete aResult; - return 0; + Log("SHUTTLE", Form("QueryRunParameters - Invalid parameters for Run %d: " + "startTime = %d, endTime = %d. Skipping (Shuttle won't be marked as DONE)!", + run, startTime, endTime)); } - - TString totEventsStr = entry->GetRunParameter("totalEvents"); - Int_t totEvents = totEventsStr.Atoi(); - if (totEvents < 1) + + if (skip) { - Log("SHUTTLE", - Form("QueryRunParameters - Run %d has 0 events - Skipping!", run)); - - Log("SHUTTLE", Form("Marking SHUTTLE done for run %d", run)); - fLogbookEntry = entry; - if (!UpdateShuttleLogbook("shuttle_ignored")) + 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; - - delete entry; - delete aRow; - delete aResult; - return 0; } - - delete aRow; - delete aResult; - - return entry; + + delete entry; + return 0; } //______________________________________________________________________________________________ @@ -1948,13 +2054,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) @@ -1994,6 +2104,7 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector, if (!Connect(system)) { Log(detector, Form("GetFile - Couldn't connect to %s FXS database", GetSystemName(system))); + fFXSError = system; return 0; } @@ -2016,7 +2127,6 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector, else if (system == kHLT) { whereClause += Form(" and DDLnumbers=\"%s\"", source); - nFields = 3; } TString sqlQuery = Form("%s %s", sqlQueryStart.Data(), whereClause.Data()); @@ -2027,15 +2137,16 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector, TSQLResult* aResult = 0; aResult = dynamic_cast (fServer[system]->Query(sqlQuery)); if (!aResult) { - Log(detector, Form("GetFileName - Can't execute SQL query to %s database for: id = %s, source = %s", + Log(detector, Form("GetFile - Can't execute SQL query to %s database for: id = %s, source = %s", GetSystemName(system), id, sourceName.Data())); + fFXSError = system; return 0; } - if(aResult->GetRowCount() == 0) + if (aResult->GetRowCount() == 0) { Log(detector, - Form("GetFileName - No entry in %s FXS db for: id = %s, source = %s", + Form("GetFile - No entry in %s FXS db for: id = %s, source = %s", GetSystemName(system), id, sourceName.Data())); delete aResult; return 0; @@ -2043,8 +2154,9 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector, if (aResult->GetRowCount() > 1) { Log(detector, - Form("GetFileName - More than one entry in %s FXS db for: id = %s, source = %s", + Form("GetFile - More than one entry in %s FXS db for: id = %s, source = %s", GetSystemName(system), id, sourceName.Data())); + fFXSError = system; delete aResult; return 0; } @@ -2053,6 +2165,7 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector, Log(detector, Form("GetFileName - Wrong field count in %s FXS db for: id = %s, source = %s", GetSystemName(system), id, sourceName.Data())); + fFXSError = system; delete aResult; return 0; } @@ -2060,8 +2173,9 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector, TSQLRow* aRow = dynamic_cast (aResult->Next()); if (!aRow){ - Log(detector, Form("GetFileName - Empty set result in %s FXS db from query: id = %s, source = %s", + Log(detector, Form("GetFile - Empty set result in %s FXS db from query: id = %s, source = %s", GetSystemName(system), id, sourceName.Data())); + fFXSError = system; delete aResult; return 0; } @@ -2077,10 +2191,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 @@ -2089,25 +2205,45 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector, Bool_t result = kFALSE; // copy!! if successful TSystem::Exec returns 0 - while(nRetries++ < maxRetries) { + while (nRetries++ < maxRetries) { AliDebug(2, Form("Trying to copy file. Retry # %d", nRetries)); result = RetrieveFile(system, filePath.Data(), localFileName.Data()); - if(!result) + if (!result) { - Log(detector, Form("GetFileName - Copy of file %s from %s FXS failed", + Log(detector, Form("GetFile - Copy of file %s from %s FXS failed", filePath.Data(), GetSystemName(system))); continue; } + if (fileSize.Length()>0) + { + // compare filesize of local file with the one stored in the FXS DB + Long_t size = -1; + Int_t sizeComp = gSystem->GetPathInfo(localFileName.Data(), 0, &size, 0, 0); + + if (sizeComp != 0 || size != fileSize.Atoi()) + { + Log(detector, Form("GetFile - size of file %s does not match with local copy!", + filePath.Data())); + result = kFALSE; + continue; + } + + } else { + Log(fCurrentDetector, Form("GetFile - size of file %s not set in %s database, skipping comparison", + filePath.Data(), GetSystemName(system))); + } + if (fileChecksum.Length()>0) { // compare md5sum of local file with the one stored in the FXS DB - Int_t md5Comp = gSystem->Exec(Form("md5sum %s |grep %s 2>&1 > /dev/null", + if(fileChecksum.Contains(' ')) fileChecksum.Resize(fileChecksum.First(' ')); + Int_t md5Comp = gSystem->Exec(Form("md5sum %s |grep %s > /dev/null 2> /dev/null", localFileName.Data(), fileChecksum.Data())); if (md5Comp != 0) { - Log(detector, Form("GetFileName - md5sum of file %s does not match with local copy!", + Log(detector, Form("GetFile - md5sum of file %s does not match with local copy!", filePath.Data())); result = kFALSE; continue; @@ -2119,7 +2255,11 @@ const char* AliShuttle::GetFile(Int_t system, const char* detector, if (result) break; } - if(!result) return 0; + if (!result) + { + fFXSError = system; + return 0; + } fFXSCalled[system]=kTRUE; TObjString *fileParams = new TObjString(Form("%s#!?!#%s", id, sourceName.Data())); @@ -2160,26 +2300,11 @@ Bool_t AliShuttle::RetrieveFile(UInt_t system, const char* fxsFileName, const ch } } - TString baseFXSFolder; - if (system == kDAQ) - { - baseFXSFolder = "FES/"; - } - else if (system == kDCS) - { - baseFXSFolder = ""; - } - else if (system == kHLT) - { - baseFXSFolder = "/opt/FXS/"; - } - - - TString command = Form("scp -oPort=%d -2 %s@%s:%s%s %s", + TString command = Form("scp -oPort=%d -2 %s@%s:%s/%s %s", fConfig->GetFXSPort(system), fConfig->GetFXSUser(system), fConfig->GetFXSHost(system), - baseFXSFolder.Data(), + fConfig->GetFXSBaseFolder(system), fxsFileName, localFileName); @@ -2225,6 +2350,7 @@ TList* AliShuttle::GetFileSources(Int_t system, const char* detector, const char if (!Connect(system)) { Log(detector, Form("GetFileSources - Couldn't connect to %s FXS database", GetSystemName(system))); + fFXSError = system; return NULL; } @@ -2252,6 +2378,7 @@ TList* AliShuttle::GetFileSources(Int_t system, const char* detector, const char if (!aResult) { Log(detector, Form("GetFileSources - Can't execute SQL query to %s database for id: %s", GetSystemName(system), id)); + fFXSError = system; return 0; } @@ -2370,7 +2497,12 @@ 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 --> automatic reconnection should occur if it was broken but the + // server is still alive + fServer[system]->Ping(); + return kTRUE; + } TString dbHost, dbUser, dbPass, dbName; @@ -2504,6 +2636,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() { @@ -2569,23 +2756,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") { - // 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); + 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)){ @@ -2646,7 +2834,6 @@ UInt_t AliShuttle::GetCurrentEndTime() const return fLogbookEntry ? fLogbookEntry->GetEndTime() : 0; } - //______________________________________________________________________________________________ UInt_t AliShuttle::GetCurrentYear() const { @@ -2681,11 +2868,12 @@ void AliShuttle::Log(const char* detector, const char* message) // // 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)) { @@ -2697,7 +2885,7 @@ void AliShuttle::Log(const char* detector, const char* message) gSystem->FreeDirectory(dir); } - TString toLog = Form("%s (%d): %s - ", TTimeStamp(time(0)).AsString("s"), getpid(), detector); + TString toLog = Form("%s UTC (%d): %s - ", TTimeStamp(time(0)).AsString("s"), getpid(), detector); if (GetCurrentRun() >= 0) toLog += Form("run %d - ", GetCurrentRun()); toLog += Form("%s", message); @@ -2736,8 +2924,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); } @@ -2779,7 +2968,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"); @@ -2810,9 +2998,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; @@ -2963,7 +3151,7 @@ AliCDBEntry* AliShuttle::GetFromOCDB(const char* detector, const AliCDBPath& pat } //______________________________________________________________________________________________ -Bool_t AliShuttle::SendMail() +Bool_t AliShuttle::SendMail(EMailTarget target, Int_t system) { // // sends a mail to the subdetector expert in case of preprocessor error @@ -2972,24 +3160,18 @@ Bool_t AliShuttle::SendMail() if (fTestMode != kNone) return kTRUE; - if (!fConfig->SendMail()) return kTRUE; - - TString to=""; - TIter iterExperts(fConfig->GetResponsibles(fCurrentDetector)); - TObjString *anExpert=0; - while ((anExpert = (TObjString*) iterExperts.Next())) - { - to += Form("%s,", anExpert->GetName()); - } - if (to.Length() > 0) - to.Remove(to.Length()-1); - AliDebug(2, Form("to: %s",to.Data())); + if (!fConfig->SendMail()) + return kTRUE; - if (to.IsNull()) { - Log("SHUTTLE", "List of detector responsibles not set!"); - return kFALSE; + if (target == kDCSEMail || target == kFXSEMail) { + if (!fFirstProcessing) + 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) { @@ -3003,151 +3185,43 @@ Bool_t AliShuttle::SendMail() gSystem->FreeDirectory(dir); } - TString bodyFileName; - bodyFileName.Form("%s/mail.body", GetShuttleLogDir()); - gSystem->ExpandPathName(bodyFileName); - - ofstream mailBody; - mailBody.open(bodyFileName, ofstream::out); - - if (!mailBody.is_open()) - { - Log("SHUTTLE", Form("Could not open mail body file %s", bodyFileName.Data())); - return kFALSE; - } - - TString cc=""; - TIter iterAdmins(fConfig->GetAdmins(AliShuttleConfig::kGlobal)); - TObjString *anAdmin=0; - while ((anAdmin = (TObjString*) iterAdmins.Next())) - { - cc += Form("%s,", anAdmin->GetName()); - } - if (cc.Length() > 0) - cc.Remove(to.Length()-1); - AliDebug(2, Form("cc: %s",to.Data())); - - TString subject = Form("%s Shuttle preprocessor FAILED in run %d (run type = %s)!", - fCurrentDetector.Data(), GetCurrentRun(), GetRunType()); - AliDebug(2, Form("subject: %s", subject.Data())); - - TString body = Form("Dear %s expert(s), \n\n", fCurrentDetector.Data()); - body += Form("SHUTTLE just detected that your preprocessor " - "failed processing run %d (run type = %s)!!\n\n", - GetCurrentRun(), GetRunType()); - body += Form("Please check %s status on the SHUTTLE monitoring page: \n\n", - fCurrentDetector.Data()); - if (fConfig->GetRunMode() == AliShuttleConfig::kTest) - { - body += Form("\thttp://pcalimonitor.cern.ch:8889/shuttle.jsp?time=168 \n\n"); - } else { - body += Form("\thttp://pcalimonitor.cern.ch/shuttle.jsp?instance=PROD&time=168 \n\n"); + // det experts in to + TString to=""; + TIter *iterExperts = 0; + if (target == kDCSEMail) { + iterExperts = new TIter(fConfig->GetAdmins(AliShuttleConfig::kAmanda)); } - - - TString logFolder = "logs"; - if (fConfig->GetRunMode() == AliShuttleConfig::kProd) - logFolder += "_PROD"; - - - 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()); - - AliDebug(2, Form("Body begin: %s", body.Data())); - - mailBody << body.Data(); - mailBody.close(); - mailBody.open(bodyFileName, ofstream::out | ofstream::app); - - TString logFileName = Form("%s/%d/%s_%d.log", GetShuttleLogDir(), - GetCurrentRun(), fCurrentDetector.Data(), GetCurrentRun()); - TString tailCommand = Form("tail -n 10 %s >> %s", logFileName.Data(), bodyFileName.Data()); - if (gSystem->Exec(tailCommand.Data())) - { - mailBody << Form("%s log file not found ...\n\n", fCurrentDetector.Data()); + else if (target == kFXSEMail) { + iterExperts = new TIter(fConfig->GetAdmins(system)); } - - TString endBody = Form("------------------------------------------------------\n\n"); - endBody += Form("In case of problems please contact the SHUTTLE core team.\n\n"); - endBody += "Please do not answer this message directly, it is automatically generated.\n\n"; - endBody += "Greetings,\n\n \t\t\tthe SHUTTLE\n"; - - AliDebug(2, Form("Body end: %s", endBody.Data())); - - mailBody << endBody.Data(); - - mailBody.close(); - - // send mail! - TString mailCommand = Form("mail -s \"%s\" -c %s %s < %s", - subject.Data(), - cc.Data(), - to.Data(), - bodyFileName.Data()); - AliDebug(2, Form("mail command: %s", mailCommand.Data())); - - Bool_t result = gSystem->Exec(mailCommand.Data()); - - return result == 0; -} - -//______________________________________________________________________________________________ -Bool_t AliShuttle::SendMailToDCS() -{ - // - // sends a mail to the DCS Amanda experts in case of DCS data point retrieval error - // - - if (fTestMode != kNone) - return kTRUE; - - if (!fConfig->SendMail()) return kTRUE; - - void* dir = gSystem->OpenDirectory(GetShuttleLogDir()); - if (dir == NULL) - { - if (gSystem->mkdir(GetShuttleLogDir(), kTRUE)) + if (iterExperts) { + TObjString *anExpert=0; + while ((anExpert = (TObjString*) iterExperts->Next())) { - Log("SHUTTLE", Form("SendMailToDCS - Can't open directory <%s>", GetShuttleLogDir())); - return kFALSE; + to += Form("%s,", anExpert->GetName()); } - - } else { - gSystem->FreeDirectory(dir); + delete iterExperts; } - TString bodyFileName; - bodyFileName.Form("%s/mail.body", GetShuttleLogDir()); - gSystem->ExpandPathName(bodyFileName); - - ofstream mailBody; - mailBody.open(bodyFileName, ofstream::out); - - if (!mailBody.is_open()) - { - Log("SHUTTLE", Form("SendMailToDCS - Could not open mail body file %s", bodyFileName.Data())); - return kFALSE; - } - - TString to=""; - TIter iterExperts(fConfig->GetAdmins(AliShuttleConfig::kAmanda)); + // add subdetector experts + iterExperts = new TIter(fConfig->GetResponsibles(fCurrentDetector)); TObjString *anExpert=0; - while ((anExpert = (TObjString*) iterExperts.Next())) + while ((anExpert = (TObjString*) iterExperts->Next())) { to += Form("%s,", anExpert->GetName()); } + delete iterExperts; + if (to.Length() > 0) to.Remove(to.Length()-1); AliDebug(2, Form("to: %s",to.Data())); if (to.IsNull()) { - Log("SHUTTLE", "List of Amanda server administrators not set!"); + Log("SHUTTLE", Form("List of %d responsibles not set!", (Int_t) target)); return kFALSE; } + // SHUTTLE responsibles in cc TString cc=""; TIter iterAdmins(fConfig->GetAdmins(AliShuttleConfig::kGlobal)); TObjString *anAdmin=0; @@ -3156,34 +3230,79 @@ Bool_t AliShuttle::SendMailToDCS() cc += Form("%s,", anAdmin->GetName()); } if (cc.Length() > 0) - cc.Remove(to.Length()-1); + cc.Remove(cc.Length()-1); AliDebug(2, Form("cc: %s",to.Data())); - TString subject = Form("Retrieval of data points for %s FAILED in run %d !", - fCurrentDetector.Data(), GetCurrentRun()); - AliDebug(2, Form("subject: %s", subject.Data())); + // mail body + TString bodyFileName; + bodyFileName.Form("%s/mail.body", GetShuttleLogDir()); + gSystem->ExpandPathName(bodyFileName); + + ofstream mailBody; + mailBody.open(bodyFileName, ofstream::out); + + if (!mailBody.is_open()) + { + Log("SHUTTLE", Form("Could not open mail body file %s", bodyFileName.Data())); + return kFALSE; + } + + + TString subject; + TString body; + + if (target == kDCSEMail){ + 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"); + body += Form("SHUTTLE couldn\'t retrieve the data points for detector %s " + "in run %d!!\n\n", fCurrentDetector.Data(), GetCurrentRun()); + } + else if (target == kFXSEMail){ + 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"; + else if (system == kDCS) sys="DCS"; + else if (system == kHLT) sys="HLT"; + else return kFALSE; + body = Form("Dear %s FXS experts, \n\n",sys.Data()); + body += Form("SHUTTLE couldn\'t retrieve data from the FXS for detector %s " + "in run %d!!\n\n", fCurrentDetector.Data(), GetCurrentRun()); + } + else { + 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()); + body += Form("SHUTTLE just detected that your preprocessor " + "failed processing run %d (run type = %s)!!\n\n", + GetCurrentRun(), GetRunType()); + } - TString body = Form("Dear DCS experts, \n\n"); - body += Form("SHUTTLE couldn\'t retrieve the data points for detector %s " - "in run %d!!\n\n", fCurrentDetector.Data(), GetCurrentRun()); body += Form("Please check %s status on the SHUTTLE monitoring page: \n\n", 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"); } - + + TString logFolder = "logs"; if (fConfig->GetRunMode() == AliShuttleConfig::kProd) logFolder += "_PROD"; 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()); + "\thttp://pcalishuttle01.cern.ch:8880/%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()); AliDebug(2, Form("Body begin: %s", body.Data())); @@ -3192,8 +3311,8 @@ Bool_t AliShuttle::SendMailToDCS() mailBody.close(); mailBody.open(bodyFileName, ofstream::out | ofstream::app); - TString logFileName = Form("%s/%d/%s_%d.log", GetShuttleLogDir(), GetCurrentRun(), - fCurrentDetector.Data(), GetCurrentRun()); + 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()); if (gSystem->Exec(tailCommand.Data())) { @@ -3223,7 +3342,6 @@ Bool_t AliShuttle::SendMailToDCS() return result == 0; } - //______________________________________________________________________________________________ const char* AliShuttle::GetRunType() { @@ -3243,18 +3361,74 @@ const char* AliShuttle::GetRunType() Bool_t AliShuttle::GetHLTStatus() { // Return HLT status (ON=1 OFF=0) - // Converts the HLT status from the status string read in the run logbook (not just a bool) + // Converts the HLT status from the mode string read in the run logbook (not just a bool) if(!fLogbookEntry) { AliError("No logbook entry!"); return 0; } - // TODO implement when HLTStatus is inserted in run logbook - //TString hltStatus = fLogbookEntry->GetRunParameter("HLTStatus"); - //if(hltStatus == "OFF") {return kFALSE}; + // TODO implement when HLTMode is inserted in run logbook + TString hltMode = fLogbookEntry->GetRunParameter("HLTmode"); + TSubString firstChar = hltMode(0,1); + AliDebug(2,Form("First char = %s ",firstChar.Data())); + if (firstChar == "A") { + return kFALSE; + } + else if ((firstChar == "B") || (firstChar == "C") || (firstChar == "D") || (firstChar == "E")) { + return kTRUE; + } + else { + Log("SHUTTLE","Unexpected HLT mode! Returning 0...."); + return kFALSE; + } +} - return kTRUE; +//______________________________________________________________________________________________ +const char* AliShuttle::GetTriggerConfiguration() +{ + // Receives the trigger configuration from the DAQ logbook for the current run + + // check connection, if needed reconnect + if (!Connect(3)) + return 0; + + TString sqlQuery; + sqlQuery.Form("SELECT configFile 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", "ERROR: Trigger configuration 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 triggerConfig(row->GetField(0)); + + delete row; + row = 0; + + delete result; + result = 0; + + Log("SHUTTLE", Form("Found trigger configuration: %s", triggerConfig.Data())); + + return triggerConfig; } //______________________________________________________________________________________________ @@ -3276,3 +3450,108 @@ void AliShuttle::SetShuttleLogDir(const char* logDir) fgkShuttleLogDir = gSystem->ExpandPathName(logDir); } +//______________________________________________________________________________________________ +Bool_t AliShuttle::TouchFile() +{ + // + // touching a file on the grid if run has been DONE + // + + if (!gGrid) + { + Log("SHUTTLE",Form("No TGrid connection estabilished!")); + Log("SHUTTLE",Form("Could not touch file for run %i",GetCurrentRun())); + return kFALSE; + } + + TString dir; + dir.Form("%s%d/SHUTTLE_DONE", fConfig->GetAlienPath(), GetCurrentYear()); + // checking whether directory for touch command exists + TString commandLs; + commandLs.Form("ls %s",dir.Data()); + TGridResult *resultLs = dynamic_cast(gGrid->Command(commandLs)); + if (!resultLs){ + Log("SHUTTLE",Form("No result for %s command, returning without touching",commandLs.Data())); + return kFALSE; + } + 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){ + Log("SHUTTLE",Form("No directory %s found, creating it",dir.Data())); + + // creating the directory + + 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())); + } + else { + 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())); + TGridResult *resultTouch = dynamic_cast(gGrid->Command(command)); + if (!resultTouch){ + Log("SHUTTLE",Form("No result for touching command, returning without touching for run %i",GetCurrentRun())); + return kFALSE; + } + 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(); +} +