]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - SHUTTLE/AliShuttle.cxx
Removing leftover return
[u/mrichter/AliRoot.git] / SHUTTLE / AliShuttle.cxx
index a4c3856d08086af8aaf12fb64681e861b2f64578..75d96728b96b0db9b21440ca0c54ac32fb5b43ef 100644 (file)
@@ -28,6 +28,7 @@
 // For detSpec is used the alias name.
 //
 
+#include <stdexcept>
 #include "AliShuttle.h"
 
 #include "AliCDBManager.h"
@@ -67,6 +68,7 @@
 #include <sys/wait.h>
 
 #include <signal.h>
+using namespace std;
 
 ClassImp(AliShuttle)
 
@@ -357,6 +359,7 @@ Int_t AliShuttle::StoreOCDB(const TString& gridURI)
                        Form("StoreOCDB - cannot activate main %s storage", type));
                return -2;
        }
+       gridSto->SetMirrorSEs(fgkMirrorSEs.Data());
 
        gridIds = gridSto->GetQueryCDBList();
 
@@ -950,8 +953,12 @@ AliShuttleStatus* AliShuttle::ReadShuttleStatus()
        }
 
        Int_t path1 = GetCurrentRun()/10000;
-       fStatusEntry = AliCDBManager::Instance()->GetStorage(GetLocalCDB())
-               ->Get(Form("/SHUTTLE/%s/%d", fCurrentDetector.Data(), path1), GetCurrentRun());
+       try{
+                fStatusEntry = AliCDBManager::Instance()->GetStorage(GetLocalCDB())
+                        ->Get(Form("/SHUTTLE/%s/%d", fCurrentDetector.Data(), path1), GetCurrentRun());
+        } catch(std::exception& x) {
+                AliInfo(TString::Format("%s",x.what()));
+        }
 
        if (!fStatusEntry) return 0;
        fStatusEntry->SetOwner(1);
@@ -1083,19 +1090,8 @@ Bool_t AliShuttle::ContinueProcessing()
                dynamic_cast<AliPreprocessor*> (fPreprocessorMap.GetValue(fCurrentDetector));
        if (!aPreprocessor)
        {
-           Log("SHUTTLE", Form("ContinueProcessing - %s: no preprocessor registered", fCurrentDetector.Data()));
-           if(fCurrentDetector==TString("HLT")){
-               Log("SHUTTLE", "ContinueProcessing: Fake processing HLT, to avoid pending runs! => temporary, till an HLT preprocessor is made available.");
-               UpdateShuttleLogbook("HLT","DONE");
-               Log(fCurrentDetector, "ContinueProcessing - skipping HLT preprocessor.");
-
-               AliShuttleStatus* status = ReadShuttleStatus();
-               if (!status) {
-                   status = new AliShuttleStatus(AliShuttleStatus::kDone);
-                   WriteShuttleStatus(status);
-               }
-           }
-           return kFALSE;
+               Log("SHUTTLE", Form("ContinueProcessing - %s: no preprocessor registered", fCurrentDetector.Data()));
+               return kFALSE;
        }
 
        AliShuttleLogbookEntry::Status entryStatus =
@@ -1417,7 +1413,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                Log("SHUTTLE", Form("\t\t\t****** run %d - %s: START  ******",
                                                GetCurrentRun(), aDetector->GetName()));
 
-               for(Int_t iSys=0;iSys<3;iSys++) fFXSCalled[iSys]=kFALSE;
+               for(Int_t iSys=0;iSys<4;iSys++) fFXSCalled[iSys]=kFALSE;
                
                Int_t initialMem = GetMem(getpid());
                Log("SHUTTLE", Form("Memory consumption before forking is %d", initialMem));
@@ -1443,7 +1439,10 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                        {
                                Long_t expiredTime = time(0) - begin;
 
-                               if (expiredTime > fConfig->GetPPTimeOut())
+                               // the run-dependent timeout is the timeout from the configuration plus a twentieth of
+                               // the run duration, e.g. 3 additional minutes for 1h run or 1/2h for a 10h run
+                               Int_t runDepTimeOut = fConfig->GetPPTimeOut() + (GetCurrentEndTime() - GetCurrentStartTime()) * 0.05;
+                               if (expiredTime > runDepTimeOut)
                                {
                                         TString logMsg;
                                        AliShuttleStatus *currentStatus = ReadShuttleStatus();
@@ -1626,7 +1625,7 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
                                                GetCurrentRun(), aDetector->GetName()));
                        }
 
-                       for (UInt_t iSys=0; iSys<3; iSys++)
+                       for (UInt_t iSys=0; iSys<4; iSys++)
                        {
                                if (fFXSCalled[iSys]) fFXSlist[iSys].Clear();
                        }
@@ -1970,7 +1969,7 @@ Bool_t AliShuttle::QueryShuttleLogbook(const char* whereClause,
        }
 
        // TODO Check field count!
-       const UInt_t nCols = 26;
+       const UInt_t nCols = 27;
        if (aResult->GetFieldCount() != (Int_t) nCols) {
                Log("SHUTTLE", "Invalid SQL result field number!");
                delete aResult;
@@ -2141,19 +2140,25 @@ TMap* AliShuttle::GetValueSet(const char* host, Int_t port, const TSeqCollection
        AliDCSClient client(host, port, fTimeout, fRetries, multiSplit);
 
        TMap* result = 0;
+       UInt_t startQuery = GetStartTimeDCSQuery();
+       UInt_t endQuery = GetEndTimeDCSQuery();
+       if (fCurrentDetector == "GRP" && (endQuery - startQuery) <= 120) { // enlarging DCS query for GRP when a run is shorter than 2 minutes (i.e. the time of forced archival of GRP DPs)
+         Log(fCurrentDetector.Data(), Form("GetValueSet: run lasting less than 120 seconds, enlarging DCS window for DPs retrival to 130 s"));
+         startQuery = endQuery - 130; // we add 130 s to be sure that there is something (even if the archival is forced after 120 s)
+       }
+
        if (type == kAlias)
        {
                //result = client.GetAliasValues(entries, GetCurrentStartTime()-offset, 
                //      GetCurrentEndTime()+offset);
-               result = client.GetAliasValues(entries, GetStartTimeDCSQuery(), 
-                       GetEndTimeDCSQuery());
+
+               result = client.GetAliasValues(entries, startQuery, endQuery);         
        } 
        else if (type == kDP)
        {
                //result = client.GetDPValues(entries, GetCurrentStartTime()-offset, 
                //      GetCurrentEndTime()+offset);
-                       result = client.GetDPValues(entries, GetStartTimeDCSQuery(), 
-                       GetEndTimeDCSQuery());
+                       result = client.GetDPValues(entries, startQuery, endQuery);
        }
 
        if (result == 0)
@@ -2663,7 +2668,7 @@ Bool_t AliShuttle::UpdateTable()
 
        Bool_t result = kTRUE;
 
-       for (UInt_t system=0; system<3; system++)
+       for (UInt_t system=0; system<4; system++)
        {
                if(!fFXSCalled[system]) continue;
 
@@ -2748,7 +2753,7 @@ Bool_t AliShuttle::UpdateTableSkippedCase(const char* detector)
 
        TString detName(detector);
 
-       for (UInt_t system=0; system<3; system++)
+       for (UInt_t system=0; system<4; system++)
        {
 
                // check connection, in case connect
@@ -2800,7 +2805,7 @@ Bool_t AliShuttle::UpdateTableFailCase()
 
        Bool_t result = kTRUE;
 
-       for (UInt_t system=0; system<3; system++)
+       for (UInt_t system=0; system<4; system++)
        {
                // check connection, in case connect
                if (!Connect(system))
@@ -3663,22 +3668,14 @@ Bool_t AliShuttle::TouchFile()
        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<TGridResult*>(gGrid->Command(commandLs));
-       if (!resultLs){
-               Log("SHUTTLE",Form("No result for %s command, returning without touching",commandLs.Data()));
+        TGridResult* resultLs = gGrid->Ls(dir.Data());
+       if (!resultLs){ // unfortunately we don't get this for ls of a non existing dir
+               Log("SHUTTLE",Form("No result for \"Ls(\"%s\")\", returning without touching", dir.Data()));
                return kFALSE;
        }
-       TMap *mapLs = dynamic_cast<TMap*>(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<TObjString*>(mapLs->GetValue("path"));
-       if (!valueLsPath || (valueLsPath->GetString()).CompareTo(dir)!=1){ 
+
+        if ( resultLs->GetEntries() == 1 && !resultLs->GetFileName(0) ) {
+          // this is what we currently get for ls of a non existing dir
                Log("SHUTTLE",Form("No directory %s found, creating it",dir.Data()));
 
                // creating the directory
@@ -3699,39 +3696,63 @@ Bool_t AliShuttle::TouchFile()
        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<TGridResult*>(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<TMap*>(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<TObjString*>(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; 
+        // Before trying to touch, check that the file is not already there (the touch would fail forever, leaving the run in pending)
+        TString lsFileCommand;
+        lsFileCommand.Form("ls %s/%i", dir.Data(), GetCurrentRun());
+        TGridResult *resultLsFile = dynamic_cast<TGridResult*>(gGrid->Command(lsFileCommand));
+       if (!resultLsFile){
+               Log("SHUTTLE",Form("No result for file ls command, returning without touching for run %i",GetCurrentRun()));
                return kFALSE;
        }
-       if (valueTouch->GetString()!="1"){
-               Log("SHUTTLE",Form("Failing the touching command, returning without touching for run %i",GetCurrentRun()));
-               delete resultTouch;
-               resultTouch = 0x0; 
+        TMap *mapLsFile = dynamic_cast<TMap*>(resultLsFile->At(0));
+       if (!mapLsFile){
+               Log("SHUTTLE",Form("No map for file ls command, returning without touching for run %i",GetCurrentRun()));
+               delete resultLsFile;
+               resultLsFile = 0x0; 
                return kFALSE;
        }
-       delete resultTouch;
-       resultTouch = 0x0; 
-       Log("SHUTTLE", "Sucessfully touched the file");
-       return kTRUE;
+       TObjString *valueLsFile = dynamic_cast<TObjString*>(mapLsFile->GetValue("name"));
+       if (valueLsFile){
+               Log("SHUTTLE",Form("\"name\" key set in the map for file ls command. Touchfile for run %i already there.",GetCurrentRun()));
+                Log("SHUTTLE", "The file was already there, did not touch it.");
+        }else{
+                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<TGridResult*>(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<TMap*>(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<TObjString*>(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 resultLsFile;
+                resultLsFile = 0x0; 
+                delete resultTouch;
+                resultTouch = 0x0;
+                Log("SHUTTLE", "Sucessfully touched the file");
+        }
+        return kTRUE;
 }
+
 //______________________________________________________________________________________________
 UInt_t AliShuttle::GetStartTimeDCSQuery()
 {