// For detSpec is used the alias name.
//
+#include <stdexcept>
#include "AliShuttle.h"
#include "AliCDBManager.h"
#include <sys/wait.h>
#include <signal.h>
+using namespace std;
ClassImp(AliShuttle)
//
if (!fConfig->IsValid()) AliFatal("********** !!!!! Invalid configuration !!!!! **********");
- for(int iSys=0;iSys<4;iSys++) {
+ for(int iSys=0;iSys<5;iSys++) {
fServer[iSys]=0;
- if (iSys < 3)
+ if (iSys < 4)
fFXSlist[iSys].SetOwner(kTRUE);
}
fPreprocessorMap.SetOwner(kTRUE);
//
fPreprocessorMap.DeleteAll();
- for(int iSys=0;iSys<4;iSys++)
+ for(int iSys=0;iSys<5;iSys++)
if(fServer[iSys]) {
fServer[iSys]->Close();
delete fServer[iSys];
Form("StoreOCDB - cannot activate main %s storage", type));
return -2;
}
+ gridSto->SetMirrorSEs(fgkMirrorSEs.Data());
gridIds = gridSto->GetQueryCDBList();
if (!dirList) return kTRUE;
- if (dirList->GetEntries() < 3)
+ if (dirList->GetEntries() < 3) // to be changed to 4?
{
delete dirList;
return kTRUE;
}
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);
dynamic_cast<AliPreprocessor*> (fPreprocessorMap.GetValue(fCurrentDetector));
if (!aPreprocessor)
{
- Log("SHUTTLE", Form("ContinueProcessing - %s: no preprocessor registered", fCurrentDetector.Data()));
- return kFALSE;
+ Log("SHUTTLE", Form("ContinueProcessing - %s: no preprocessor registered", fCurrentDetector.Data()));
+ return kFALSE;
}
AliShuttleLogbookEntry::Status entryStatus =
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));
{
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();
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();
}
SendAlive();
// check connection, in case connect
- if (!Connect(3))
+ if (!Connect(4))
return;
TString sqlQuery;
sqlQuery = Form("select count(*) from %s where shuttle_done=0", fConfig->GetShuttlelbTable());
- TSQLResult* aResult = fServer[3]->Query(sqlQuery);
+ TSQLResult* aResult = fServer[4]->Query(sqlQuery);
if (!aResult) {
AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
return;
entries.SetOwner(1);
// check connection, in case connect
- if (!Connect(3)) return kFALSE;
+ if (!Connect(4)) return kFALSE;
TString sqlQuery;
sqlQuery = Form("select * from %s %s order by run", fConfig->GetShuttlelbTable(), whereClause);
- TSQLResult* aResult = fServer[3]->Query(sqlQuery);
+ TSQLResult* aResult = fServer[4]->Query(sqlQuery);
if (!aResult) {
AliError(Form("Can't execute query <%s>!", sqlQuery.Data()));
return kFALSE;
}
// 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;
//
// check connection, in case connect
- if (!Connect(3))
+ if (!Connect(4))
return 0;
TString sqlQuery;
sqlQuery.Form("select * from %s where run=%d", fConfig->GetDAQlbTable(), run);
- TSQLResult* aResult = fServer[3]->Query(sqlQuery);
+ TSQLResult* aResult = fServer[4]->Query(sqlQuery);
if (!aResult) {
Log("SHUTTLE", Form("Can't execute query <%s>!", sqlQuery.Data()));
return 0;
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)
TString whereClause = Form("run=%d and detector=\"%s\" and fileId=\"%s\"",
GetCurrentRun(), detector, id);
- if (system == kDAQ)
+ if (system == kDAQ || system == kDQM)
{
whereClause += Form(" and DAQsource=\"%s\"", source);
}
}
TString sourceName = "";
- if (system == kDAQ)
+ if (system == kDAQ || system == kDQM)
{
sourceName = "DAQsource";
} else if (system == kHLT)
TString dbHost, dbUser, dbPass, dbName;
- if (system < 3) // FXS db servers
+ if (system < 4) // FXS db servers
{
dbHost = Form("mysql://%s:%d", fConfig->GetFXSdbHost(system), fConfig->GetFXSdbPort(system));
dbUser = fConfig->GetFXSdbUser(system);
}
fServer[system] = TSQLServer::Connect(dbHost.Data(), dbUser.Data(), dbPass.Data());
- if (!fServer[system] || !fServer[system]->IsConnected()) {
- if(system < 3)
+ if (!fServer[system] || !fServer[system]->IsConnected()) {
+ if(system < 4)
{
AliError(Form("Can't establish connection to FXS database for %s",
AliShuttleInterface::GetSystemName(system)));
case kHLT:
aResult = fServer[kHLT]->GetTables(dbName.Data());
break;
+ case kDQM:
+ aResult = fServer[kDQM]->GetTables(dbName.Data());
+ break;
default:
- aResult = fServer[3]->GetTables(dbName.Data());
+ aResult = fServer[4]->GetTables(dbName.Data());
break;
}
Bool_t result = kTRUE;
- for (UInt_t system=0; system<3; system++)
+ for (UInt_t system=0; system<4; system++)
{
if(!fFXSCalled[system]) continue;
const char* source = ((TObjString*) aFXSarray->At(1))->GetName();
TString whereClause;
- if (system == kDAQ)
+ if (system == kDAQ || system == kDQM)
{
whereClause = Form("where run=%d and detector=\"%s\" and fileId=\"%s\" and DAQsource=\"%s\";",
GetCurrentRun(), fCurrentDetector.Data(), fileId, source);
TString detName(detector);
- for (UInt_t system=0; system<3; system++)
+ for (UInt_t system=0; system<4; system++)
{
// check connection, in case connect
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))
//
// check connection, in case connect
- if(!Connect(3)){
+ if(!Connect(4)){
Log("SHUTTLE", "UpdateShuttleLogbook - Couldn't connect to DAQ Logbook.");
return kFALSE;
}
// Query execution
TSQLResult* aResult;
- aResult = dynamic_cast<TSQLResult*> (fServer[3]->Query(sqlQuery));
+ aResult = dynamic_cast<TSQLResult*> (fServer[4]->Query(sqlQuery));
if (!aResult) {
Log("SHUTTLE", Form("UpdateShuttleLogbook - Can't execute query <%s>", sqlQuery.Data()));
return kFALSE;
if (system == kDAQ) sys="DAQ";
else if (system == kDCS) sys="DCS";
else if (system == kHLT) sys="HLT";
+ else if (system == kDQM) sys="DQM";
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 "
// Receives the trigger configuration from the DAQ logbook for the current run
// check connection, if needed reconnect
- if (!Connect(3))
+ if (!Connect(4))
return 0;
TString sqlQuery;
sqlQuery.Form("SELECT configFile FROM logbook_trigger_config WHERE run = %d", GetCurrentRun());
- TSQLResult* result = fServer[3]->Query(sqlQuery);
+ TSQLResult* result = fServer[4]->Query(sqlQuery);
if (!result)
{
Log("SHUTTLE", Form("ERROR: Can't execute query <%s>!", sqlQuery.Data()));
// Receives the CTP time parameters from the DAQ logbook for the current run
// check connection, if needed reconnect
- if (!Connect(3))
+ if (!Connect(4))
return 0;
TString sqlQuery;
sqlQuery.Form("SELECT alignmentFile FROM logbook_trigger_config WHERE run = %d", GetCurrentRun());
- TSQLResult* result = fServer[3]->Query(sqlQuery);
+ TSQLResult* result = fServer[4]->Query(sqlQuery);
if (!result)
{
Log("SHUTTLE", Form("ERROR: Can't execute query <%s>!", sqlQuery.Data()));
// Receives the trigger detector mask from DAQ logbook
// check connection, if needed reconnect
- if (!Connect(3))
+ if (!Connect(4))
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);
+ TSQLResult* result = fServer[4]->Query(sqlQuery);
if (!result)
{
Log("SHUTTLE", Form("ERROR: Can't execute query <%s>!", sqlQuery.Data()));
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
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()));
+ // 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;
}
- 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;
+ 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;
}
- 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 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()
{
// Getting ltuFineDelay1, ltuFineDelay2, ltuBCDelay for detector det from logbook_detectors table in logbook
//
- if (!Connect(3))
+ if (!Connect(4))
return 0;
TString sqlQuery;
sqlQuery.Form("select LTUFineDelay1, LTUFineDelay2, LTUBCDelayAdd from logbook_detectors WHERE run_number = %d and detector = \"%s\";", GetCurrentRun(),det);
- TSQLResult* result = fServer[3]->Query(sqlQuery);
+ TSQLResult* result = fServer[4]->Query(sqlQuery);
if (!result){
Log("SHUTTLE","ERROR: No result found for the LTU configuration query");
return 0x0;