// Fixed file system locations for the different DB's
#ifdef USE_RDM
-const char *kFifo = "/tmp/alimdc.fifo";
-const char *kRawDBFS[2] = { "/tmp/mdc1", "/tmp/mdc2" };
-const char *kTagDBFS = "/tmp/mdc1/tags";
-const char *kRunDBFS = "/tmp/mdc1/meta";
-const char *kRFIOFS = "rfio:/castor/cern.ch/user/r/rdm";
-const char *kCastorFS = "castor:/castor/cern.ch/user/r/rdm";
-const char *kRootdFS = "root://localhost//tmp/mdc1";
-const char *kAlienHost = "alien://aliens7.cern.ch:15000/?direct";
-const char *kAlienDir = "/alice_mdc/DC";
+const char* const kFifo = "/tmp/alimdc.fifo";
+const char* const kRawDBFS[2] = { "/tmp/mdc1", "/tmp/mdc2" };
+const char* const kTagDBFS = "/tmp/mdc1/tags";
+const char* const kRunDBFS = "/tmp/mdc1/meta";
+const char* const kRFIOFS = "rfio:/castor/cern.ch/user/r/rdm";
+const char* const kCastorFS = "castor:/castor/cern.ch/user/r/rdm";
+const char* const kRootdFS = "root://localhost//tmp/mdc1";
+const char* const kAlienHost = "alien://aliens7.cern.ch:15000/?direct";
+const char* const kAlienDir = "/alice_mdc/DC";
#else
-const char *kFifo = "/tmp/alimdc.fifo";
-const char *kRawDBFS[2] = { "/data1/mdc", "/data2/mdc" };
-const char *kTagDBFS = "/data1/mdc/tags";
-const char *kRunDBFS = "/data1/mdc/meta";
-const char *kRFIOFS = "rfio:/castor/cern.ch/lcg/dc5";
-const char *kCastorFS = "castor:/castor/cern.ch/lcg/dc5";
-const char *kRootdFS = "root://localhost//tmp/mdc1";
-const char *kAlienHost = "alien://aliens7.cern.ch:15000/?direct";
-const char *kAlienDir = "/alice_mdc/DC";
+const char* const kFifo = "/tmp/alimdc.fifo";
+const char* const kRawDBFS[2] = { "/data1/mdc", "/data2/mdc" };
+const char* const kTagDBFS = "/data1/mdc/tags";
+const char* const kRunDBFS = "/data1/mdc/meta";
+const char* const kRFIOFS = "rfio:/castor/cern.ch/lcg/dc5";
+const char* const kCastorFS = "castor:/castor/cern.ch/lcg/dc5";
+const char* const kRootdFS = "root://localhost//tmp/mdc1";
+const char* const kAlienHost = "alien://aliens7.cern.ch:15000/?direct";
+const char* const kAlienDir = "/alice_mdc/DC";
#endif
// Maximum size of tag db files
// raw data object, otherwise a private copy will be made.
fNSubEvents = 0;
- fEvtHdr = new AliRawEventHeader;
+ fEvtHdr = 0;
fEqpHdr = 0;
fRawData = 0;
fSubEvents = 0;
}
+//______________________________________________________________________________
+AliRawEventHeader *AliRawEvent::GetHeader()
+{
+ // Get event header part of AliRawEvent.
+
+ if (!fEvtHdr)
+ fEvtHdr = new AliRawEventHeader;
+
+ return fEvtHdr;
+}
+
//______________________________________________________________________________
AliRawEquipmentHeader *AliRawEvent::GetEquipmentHeader()
{
ds->cd();
// Write stats also in the bookkeeping RunDB
- AliRunDB *rundb = new AliRunDB;
+ AliRunDB *rundb = new AliRunDB(kTRUE);
rundb->Update(this);
rundb->UpdateRDBMS(this);
rundb->UpdateAliEn(this);
}
//______________________________________________________________________________
-Bool_t AliRawDB::FSHasSpace(const char *fs)
+Bool_t AliRawDB::FSHasSpace(const char *fs) const
{
// Check for at least fMaxSize bytes of free space on the file system.
// If the space is not available return kFALSE, kTRUE otherwise.
}
//______________________________________________________________________________
-const char *AliRawDB::GetFileName()
+const char *AliRawDB::GetFileName() const
{
// Return filename based on hostname and date and time. This will make
// each file unique. Also makes sure (via FSHasSpace()) that there is
{
// Create a new raw DB.
+ const Int_t kMaxRetry = 200;
+ const Int_t kMaxSleep = 1; // seconds
+ const Int_t kMaxSleepLong = 10; // seconds
+ Int_t retry = 0;
+
again:
+ if (gAliMDC && gAliMDC->StopLoop())
+ return kFALSE;
+
const char *fname = GetFileName();
- if (!fname) return kFALSE;
+ if (!fname) {
+ Error("Create", "error getting raw DB file name");
+ return kFALSE;
+ }
+
+ retry++;
- fRawDB = TFile::Open(fname, "RECREATE",
- Form("ALICE MDC%d raw DB", kMDC), fCompress);
+ fRawDB = TFile::Open(fname, GetOpenOption(),
+ Form("ALICE MDC%d raw DB", kMDC), fCompress,
+ GetNetopt());
if (!fRawDB) {
- Error("Create", "did not find right plugin to open file");
+ if (retry < kMaxRetry) {
+ Warning("Create", "failure to open file, sleeping %d %s before retrying...",
+ kMaxSleep, kMaxSleep==1 ? "second" : "seconds");
+ gSystem->Sleep(kMaxSleep*1000);
+ goto again;
+ }
+ Error("Create", "failure to open file %s after %d tries", fname, kMaxRetry);
return kFALSE;
}
if (fRawDB->IsZombie()) {
fRawDB->GetErrno() == 1027) { // SESYSERR
fRawDB->ResetErrno();
delete fRawDB;
- Warning("Create", "file is zombie, sleeping 10 seconds before retrying...");
- gSystem->Sleep(10000); // sleep 10 seconds before retrying
+ Warning("Create", "file is a zombie (no space), sleeping %d %s before retrying...",
+ kMaxSleepLong, kMaxSleepLong==1 ? "second" : "seconds");
+ gSystem->Sleep(kMaxSleepLong*1000); // sleep 10 seconds before retrying
goto again;
}
- Error("Create", "error opening raw DB");
+ Error("Create", "file %s is zombie", fname);
+ fRawDB->ResetErrno();
+ delete fRawDB;
fRawDB = 0;
+ if (retry < kMaxRetry) {
+ Warning("Create", "file is a zombie, sleeping %d %s before retrying...",
+ kMaxSleep, kMaxSleep==1 ? "second" : "seconds");
+ gSystem->Sleep(kMaxSleep*1000);
+ goto again;
+ }
+ Error("Create", "failure to open file %s after %d tries", fname, kMaxRetry);
return kFALSE;
}
}
//______________________________________________________________________________
-const char *AliRawRFIODB::GetFileName()
+const char *AliRawRFIODB::GetFileName() const
{
// Return filename based on hostname and date and time. This will make
// each file unique. Also the directory will be made unique for each
}
//______________________________________________________________________________
-const char *AliRawCastorDB::GetFileName()
+const char *AliRawCastorDB::GetFileName() const
{
// Return filename based on hostname and date and time. This will make
// each file unique. Also the directory will be made unique for each
}
//______________________________________________________________________________
-const char *AliRawRootdDB::GetFileName()
+const char *AliRawRootdDB::GetFileName() const
{
// Return filename based on hostname and date and time. This will make
// each file unique. Also the directory will be made unique for each
}
//______________________________________________________________________________
-const char *AliRawNullDB::GetFileName()
+const char *AliRawNullDB::GetFileName() const
{
// Return /dev/null as filename.
}
//______________________________________________________________________________
-const char *AliTagDB::GetFileName()
+const char *AliTagDB::GetFileName() const
{
// Return filename based on hostname and date and time. This will make
// each file unique. The tags will be stored in the /data1/tags directory.
}
//______________________________________________________________________________
-const char *AliTagNullDB::GetFileName()
+const char *AliTagNullDB::GetFileName() const
{
// Return /dev/null as filename.
//______________________________________________________________________________
-AliRunDB::AliRunDB()
+AliRunDB::AliRunDB(Bool_t noLocalDB)
{
// Open run database, and get or create tree.
+ fRunDB = 0;
+
+ if (noLocalDB) return;
+
// Get hostname
char hostname[64], filename[64];
const char *fs = kRunDBFS;
{
// Add stats object to database.
+ if (!stats || !fRunDB) return;
+
TDirectory *ds = gDirectory;
fRunDB->cd();
{
// Add stats object to central MySQL DB.
+ if (!stats) return;
+
char sql[4096];
char bt[25], et[25];
{
// Record file in AliEn catalog.
+ if (!stats) return;
+
TGrid *g = TGrid::Connect(kAlienHost, "");
TString lfn = kAlienDir;
+ TDatime dt;
+
+ // make a subdirectory for each day
+ lfn += "/adc-";
+ lfn += dt.GetDate();
+
+ // check if directory exists, if not create it
+ Grid_ResultHandle_t res;
+ if (!(res = g->OpenDir(lfn))) {
+ // directory does not exist, create it
+ if (g->Mkdir(lfn, kTRUE) == -1) {
+ Error("UpdateAliEn", "cannot create directory %s", lfn.Data());
+ lfn = kAlienDir;
+ }
+ }
+ if (res) g->CloseResult(res);
+
lfn += "/";
lfn += gSystem->BaseName(stats->GetFileName());
- //printf("AliEn: AddFile(%s, %s, %d)\n", lfn.Data(), stats->GetFileName(),
- // (int)stats->GetFileSize());
+ Int_t result = g->AddFile(lfn, stats->GetFileName(),
+ (int)stats->GetFileSize());
- g->AddFile(lfn, stats->GetFileName(), (int)stats->GetFileSize());
+ if (result == -1) {
+ Error("UpdateAliEn", "error adding file to AliEn catalog");
+ printf("AliEn: AddFile(%s, %s, %d)\n", lfn.Data(), stats->GetFileName(),
+ (int)stats->GetFileSize());
+ }
delete g;
}
{
// Close run database.
- fRunDB->Close();
+ if (fRunDB) fRunDB->Close();
delete fRunDB;
}
//----------------- Use SIGUSR1 to interupt endless loop -----------------------
class AliMDCInterruptHandler : public TSignalHandler {
-private:
- AliMDC *fMDC; // alimdc to signal
public:
AliMDCInterruptHandler(AliMDC *mdc) : TSignalHandler(kSigUser1, kFALSE), fMDC(mdc) { }
- Bool_t Notify() { fMDC->SetStopLoop(); return kTRUE; }
+ Bool_t Notify() {
+ Info("Notify", "received a SIGUSR1 signal");
+ fMDC->SetStopLoop();
+ return kTRUE;
+ }
+private:
+ AliMDC *fMDC; // alimdc to signal
+
+ AliMDCInterruptHandler(const AliMDCInterruptHandler &);
+ void operator=(const AliMDCInterruptHandler &);
};
//______________________________________________________________________________
// Process input stream
#ifdef USE_EB
- while (!ebEor()) {
+ Int_t eorFlag = 0;
+ while (!(eorFlag = ebEor())) {
struct iovec *ebvec;
if ((ebvec = ebGetNextEvent()) == (void *)-1) {
Error("Run", "error getting next event (%s)", ebGetLastError());
}
return 1;
}
+ ALIDEBUG(3)
+ header.Dump();
// If we were in looping mode stop directly after a SIGUSR1 signal
if (StopLoop()) {
- Info("Run", "SIGUSR1, processed %d events", fNumEvents);
+ Info("Run", "Stopping loop, processed %d events", fNumEvents);
break;
}
// If there is less data for this event than the next sub-event
// header, something is wrong. Skip to next event...
if (toRead < header.HeaderSize()) {
+ ALIDEBUG(1) {
+ Warning("Run",
+ "header size (%d) exceeds number of bytes to read (%d)\n",
+ header.HeaderSize(), toRead);
+ header.Dump();
+ }
if ((status = DumpEvent(toRead)) != toRead) {
if (status == 0)
break;
}
// Loop over all sub-events... (LDCs)
+ Int_t nsub = 1;
while (toRead > 0) {
- Int_t nsub = 1;
#ifdef USE_EB
ebdata = (char *)ebvec[nsub].iov_base;
#endif
return 1;
}
+ ALIDEBUG(3)
+ subHeader.Dump();
+
toRead -= subHeader.HeaderSize();
#ifdef USE_EB
// Make sure raw data less than left over bytes for current event
if (rawSize > toRead) {
+ ALIDEBUG(1) {
+ Warning("Run", "raw data size (%d) exceeds number of bytes "
+ "to read (%d)\n", rawSize, toRead);
+ subHeader.Dump();
+ }
if ((status = DumpEvent(toRead)) != toRead) {
if (status == 0)
break;
if (rawdb->FileFull()) {
printf("Written raw DB at a rate of %.1f MB/s\n",
- Float_t(fMaxFileSize / timer.RealTime() / 1000000.));
+ rawdb->GetBytesWritten() / timer.RealTime() / 1000000.);
- // Write stats object to raw db, run db and MySQL
+ // Write stats object to raw db, run db, MySQL and AliEn
stats->WriteToDB(rawdb);
delete stats;
- if (!rawdb->NextFile()) return 1;
+ if (!rawdb->NextFile()) {
+ Error("Run", "error opening next raw data file");
+ return 1;
+ }
printf("Filling raw DB %s\n", rawdb->GetDBName());
stats = new AliStats(rawdb->GetDBName(), fCompress, fUseFilter);
}
printf("Written raw DB at a rate of %.1f MB/s\n",
- Float_t(fMaxFileSize / timer.RealTime() / 1000000.));
+ rawdb->GetBytesWritten() / timer.RealTime() / 1000000.);
// Write stats to raw db and run db and delete stats object
stats->WriteToDB(rawdb);
}
#endif
+#ifdef USE_EB
+ // Print eor flag
+ if (eorFlag) {
+ Info("Run", "event builder reported end of run (%d)", eorFlag);
+ }
+#endif
+
return 0;
}