in AliShuttleTrigger:
authoracolla <acolla@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 7 Dec 2007 19:14:36 +0000 (19:14 +0000)
committeracolla <acolla@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 7 Dec 2007 19:14:36 +0000 (19:14 +0000)
Added automatic collection of new runs on a regular time basis (settable from the configuration)

in AliShuttleConfig: new members

- triggerWait: time to wait for DIM trigger (s) before starting automatic collection of new runs
- mode: run mode (test, prod) -> used to build log folder (logs or logs_PROD)

in AliShuttle:

- logs now stored in logs/#RUN/DET_#RUN.log

SHUTTLE/AliShuttle.cxx
SHUTTLE/AliShuttleConfig.cxx
SHUTTLE/AliShuttleConfig.h
SHUTTLE/AliShuttleTrigger.cxx

index 5dafd7c..17a6066 100644 (file)
@@ -15,6 +15,9 @@
 
 /*
 $Log$
+Revision 1.66  2007/12/05 10:45:19  jgrosseo
+changed order of arguments to TMonaLisaWriter
+
 Revision 1.65  2007/11/26 16:58:37  acolla
 Monalisa configuration added: host and table name
 
@@ -1458,8 +1461,8 @@ Bool_t AliShuttle::Process(AliShuttleLogbookEntry* entry)
        TString lhcPeriod(GetLHCPeriod());
        if (lhcPeriod.Length() == 0) 
        {
-               Log("SHUTTLE","StoreRunMetaDataFile - LHCPeriod not found in logbook!");
-               return 0;
+               Log("SHUTTLE","Process - LHCPeriod not found in logbook!");
+               return 0; 
        }       
        
        if (fgkMainCDB.Length() == 0)
@@ -2764,9 +2767,13 @@ void AliShuttle::Log(const char* detector, const char* message)
        // Fill log string with a message
        //
 
-       void* dir = gSystem->OpenDirectory(GetShuttleLogDir());
+       TString logRunDir = GetShuttleLogDir();
+       if (GetCurrentRun() >=0)
+               logRunDir += Form("/%d", GetCurrentRun());
+       
+       void* dir = gSystem->OpenDirectory(logRunDir.Data());
        if (dir == NULL) {
-               if (gSystem->mkdir(GetShuttleLogDir(), kTRUE)) {
+               if (gSystem->mkdir(logRunDir.Data(), kTRUE)) {
                        AliError(Form("Can't open directory <%s>", GetShuttleLogDir()));
                        return;
                }
@@ -2813,9 +2820,12 @@ TString AliShuttle::GetLogFileName(const char* detector) const
        TString fileName;
        
        if (GetCurrentRun() >= 0) 
-               fileName.Form("%s/%s_%d.log", GetShuttleLogDir(), detector, GetCurrentRun());
-       else
+       {
+               fileName.Form("%s/%d/%s_%d.log", GetShuttleLogDir(), GetCurrentRun(), 
+                       detector, GetCurrentRun());
+       } else {
                fileName.Form("%s/%s.log", GetShuttleLogDir(), detector);
+       }
 
        return fileName;
 }
@@ -3075,12 +3085,20 @@ Bool_t AliShuttle::SendMail()
        TString body = Form("Dear %s expert(s), \n\n", fCurrentDetector.Data());
        body += Form("SHUTTLE just detected that your preprocessor "
                        "failed processing run %d!!\n\n", GetCurrentRun());
-       body += Form("Please check %s status on the SHUTTLE monitoring page: \n\n", fCurrentDetector.Data());
+       body += Form("Please check %s status on the SHUTTLE monitoring page: \n\n", 
+                               fCurrentDetector.Data());
        body += Form("\thttp://pcalimonitor.cern.ch:8889/shuttle.jsp?time=168 \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/logs/%s_%d.log \n\n", 
-               fCurrentDetector.Data(), fCurrentDetector.Data(), GetCurrentRun());
-       body += Form("The last 10 lines of %s log file are following:\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()));
 
@@ -3088,7 +3106,8 @@ Bool_t AliShuttle::SendMail()
        mailBody.close();
        mailBody.open(bodyFileName, ofstream::out | ofstream::app);
 
-       TString logFileName = Form("%s/%s_%d.log", GetShuttleLogDir(), fCurrentDetector.Data(), GetCurrentRun());
+       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()))
        {
@@ -3173,12 +3192,20 @@ Bool_t AliShuttle::SendMailToDCS()
        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());
+       body += Form("Please check %s status on the SHUTTLE monitoring page: \n\n", 
+                               fCurrentDetector.Data());
        body += Form("\thttp://pcalimonitor.cern.ch:8889/shuttle.jsp?time=168 \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/logs/%s_%d.log \n\n", 
-               fCurrentDetector.Data(), fCurrentDetector.Data(), GetCurrentRun());
-       body += Form("The last 10 lines of %s log file are following:\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()));
 
@@ -3186,7 +3213,8 @@ Bool_t AliShuttle::SendMailToDCS()
        mailBody.close();
        mailBody.open(bodyFileName, ofstream::out | ofstream::app);
 
-       TString logFileName = Form("%s/%s_%d.log", GetShuttleLogDir(), fCurrentDetector.Data(), GetCurrentRun());
+       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()))
        {
index 46dfae9..d621351 100644 (file)
@@ -15,6 +15,9 @@
 
 /*
 $Log$
+Revision 1.25  2007/11/26 16:58:37  acolla
+Monalisa configuration added: host and table name
+
 Revision 1.24  2007/10/24 10:44:08  acolla
 
 debug AliInfo removed
@@ -519,6 +522,8 @@ AliShuttleConfig::AliShuttleConfig(const char* host, Int_t port,
        fPPMaxMem(0), 
        fMonitorHost(""), 
        fMonitorTable(""), 
+       fTriggerWait(3600),
+       fRunMode(kTest),
        fDetectorMap(), 
        fDetectorList(),
        fShuttleInstanceHost(""), 
@@ -962,7 +967,29 @@ UInt_t AliShuttleConfig::SetGlobalConfig(TList* list)
                return 4;
        }
        fMonitorTable = anAttribute->GetValue();
+
+       anAttribute = anEntry->GetAttribute("triggerWait"); // MAY
+       if (!anAttribute) {
+               AliWarning(Form("triggerWait not set! default = ", fTriggerWait));
+       }
+       tmpStr = anAttribute->GetValue();
+       fTriggerWait = tmpStr.Atoi();
        
+       anAttribute = anEntry->GetAttribute("mode");
+       if (!anAttribute) {
+               AliWarning("Run mode not set! Running in test mode.");
+       }
+       tmpStr = anAttribute->GetValue();
+       if (tmpStr == "test")
+       {
+               fRunMode = kTest;
+       } else if (tmpStr == "prod") {
+               fRunMode = kProd;
+       } else {
+               AliWarning(Form("Not a valid run mode: %s", tmpStr.Data()));            
+               AliWarning("Valid run modes are \"test\" and \"prod\". Running in test mode.");
+       }
+               
        return 0;
        
        
@@ -1180,10 +1207,14 @@ void AliShuttleConfig::Print(Option_t* option) const
 
        TString result;
        result += '\n';
+       
+       TString mode = "test";
+       if (fRunMode == kProd) mode = "production";
 
-       result += "####################################################\n";
-       result += Form(" Shuttle configuration from %s \n", fConfigHost.Data());
-       result += "####################################################\n";
+       result += "########################################################################\n";
+       result += Form(" Shuttle configuration from %s - Run Mode: <%s> \n", 
+                                       fConfigHost.Data(), mode.Data());
+       result += "########################################################################\n";
        result += Form("\nShuttle running on %s \n", fShuttleInstanceHost.Data());
 
        if(fProcessAll) {
@@ -1198,8 +1229,9 @@ void AliShuttleConfig::Print(Option_t* option) const
                result += "\n";
        }
 
-       result += Form("PP time out = %d - max PP mem size = %d KB - max retries = %d\n\n", 
-                               fPPTimeOut, fPPMaxMem, fMaxRetries);
+       result += Form("PP time out = %d - max PP mem size = %d KB - max retries = %d "
+                      "- DIM trigger waiting timeout = %d\n\n", 
+                               fPPTimeOut, fPPMaxMem, fMaxRetries, fTriggerWait);
        result += "------------------------------------------------------\n";
 
        result += Form("Logbook Configuration \n\n \tHost: %s:%d; \tUser: %s; ",
index 44c20d4..1422a9f 100644 (file)
@@ -20,6 +20,8 @@
 
 class AliShuttleConfig: public TObject {
 public:
+       enum RunMode {kTest=0, kProd};
+       
        AliShuttleConfig(const char* host, Int_t port = LDAP_PORT,
                        const char* binddn = 0, const char* password = 0,
                        const char* basedn = "o=alice,dc=cern,dc=ch");
@@ -58,6 +60,10 @@ public:
        const char* GetMonitorHost() const {return fMonitorHost.Data();}
        const char* GetMonitorTable() const {return fMonitorTable.Data();}
 
+       Int_t GetTriggerWait() const {return fTriggerWait;}
+       
+       RunMode GetRunMode() const {return fRunMode;}
+       
        const TObjArray* GetDetectors() const;
 
        Bool_t HasDetector(const char* detector) const;
@@ -194,6 +200,9 @@ private:
        
        TString fMonitorHost;           // host of the MonaLisa monitoring server
        TString fMonitorTable;          // Monalisa's SHUTTLE table name
+       
+       Int_t fTriggerWait;             // time to wait for DIM trigger before starting new collection 
+       RunMode  fRunMode;              // Working mode (0=test; 1=prod)
 
        TMap fDetectorMap;              // Map of the detector-by-detector configuration
        TObjArray fDetectorList;        // List of detectors with valid configuration
index c789f6b..5fed192 100644 (file)
 
 /*
  $Log$
+ Revision 1.13  2006/11/16 16:16:48  jgrosseo
+ introducing strict run ordering flag
+ removed giving preprocessor name to preprocessor, they have to know their name themselves ;-)
+
  Revision 1.12  2006/10/20 15:22:59  jgrosseo
  o) Adding time out to the execution of the preprocessors: The Shuttle forks and the parent process monitors the child
  o) Merging Collect, CollectAll, CollectNew function
@@ -123,6 +127,7 @@ AliShuttleTrigger::AliShuttleTrigger(const AliShuttleConfig* config,
        // localStorage (local) CDB storage to be used if mainStorage is unavailable
        //
 
+       if (!fConfig->IsValid()) AliFatal("********** !!!!! Invalid configuration !!!!! **********");
        fShuttle = new AliShuttle(config, timeout, retries);
 
        TerminateSignalHandler* fQuitSignalHandler = new TerminateSignalHandler(this, kSigQuit);
@@ -191,12 +196,15 @@ void AliShuttleTrigger::Run() {
 
        DATENotifier* notifier = new DATENotifier(this, "/DATE/LOGBOOK/UPDATE");
 
+       Int_t nTry=0;
+       
        while (1) {
        
                fMutex.Lock();
 
                while (!(fNotified || fTerminate)) {
-                       fCondition.Wait();
+                       if (fCondition.TimedWaitRelative(1000*fConfig->GetTriggerWait()) == 1)
+                               break; // 1 = timeout
                }
 
                fNotified = kFALSE;
@@ -207,6 +215,15 @@ void AliShuttleTrigger::Run() {
                        AliInfo("Terminated.");
                        break;          
                }
+               
+               // TODO Check this!
+               //nTry++;
+               //AliInfo(Form("Received %d triggers so far", nTry));
+               //if(nTry>5)
+               //{
+               //      AliInfo("Collect() ran more than 5 times -> Exiting!");
+               //      break;
+               //}
        
                Collect();
        }