From 6ce1677836473fd44355f6079a76819b296b696d Mon Sep 17 00:00:00 2001 From: jniedzie Date: Fri, 10 Oct 2014 11:24:55 +0200 Subject: [PATCH] Bug in storage manager making possible to delete permanent event fixed --- .../AliStorageClientThread.cxx | 84 +++++++++++++++---- .../alistoragemanager/AliStorageDatabase.cxx | 60 ++++++++++--- .../alistoragemanager/AliStorageDatabase.h | 1 + .../AliStorageServerThread.cxx | 79 ++++++++--------- 4 files changed, 159 insertions(+), 65 deletions(-) diff --git a/MONITOR/alistoragemanager/AliStorageClientThread.cxx b/MONITOR/alistoragemanager/AliStorageClientThread.cxx index 55f2c32ff46..215410300fa 100644 --- a/MONITOR/alistoragemanager/AliStorageClientThread.cxx +++ b/MONITOR/alistoragemanager/AliStorageClientThread.cxx @@ -281,22 +281,18 @@ Long64_t AliStorageClientThread::GetSizeOfAllChunks() void AliStorageClientThread::CollectData() { AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance(); - if(eventManager->CreateSocket(EVENTS_SERVER_SUB)) - { - fConnectionStatus=STATUS_OK; - } - else - { - fConnectionStatus=STATUS_ERROR; - } + if(eventManager->CreateSocket(EVENTS_SERVER_SUB)){fConnectionStatus=STATUS_OK;} + else{fConnectionStatus=STATUS_ERROR;} int chunkNumber=0; int previousChunkNumber=-1; int eventsInChunk=0; int previousRunNumber=-1; AliESDEvent *event = NULL; -// TTree *tree = NULL; - + vector eventsToUpdate; + struct eventStruct currentEvent; + + while(!gClientQuit) { event = eventManager->GetEvent(EVENTS_SERVER_SUB); @@ -353,6 +349,17 @@ void AliStorageClientThread::CollectData() delete fCurrentFile; fCurrentFile=0; } + for(unsigned int i=0;iUpdateEventPath(eventsToUpdate[i], + Form("%s/run%d/chunk%d.root", + fStoragePath.c_str(), + event->GetRunNumber(), + chunkNumber-1)); + } + eventsToUpdate.clear(); + + fCurrentStorageSize=GetSizeOfAllChunks(); CheckCurrentStorageSize(); @@ -360,14 +367,23 @@ void AliStorageClientThread::CollectData() previousChunkNumber = chunkNumber; } - - if(0 != fCurrentFile->WriteObject(event,Form("event%d",event->GetEventNumberInFile())))//if event was written to file + + //create new directory for this run + TDirectory *currentRun; + if((currentRun = fCurrentFile->mkdir(Form("run%d",event->GetRunNumber())))) + { + cout<<"CLIENT -- creating new directory for this run"<cd(); + } + else + { + cout<<"CLIENT -- opening existing directory for this run"<cd(Form("run%d",event->GetRunNumber())); + } + + if(0 != event->Write(Form("event%d",event->GetEventNumberInFile()))) + //fCurrentFile->WriteObject(event,Form("event%d",event->GetEventNumberInFile())))//if event was written to file { - fDatabase->InsertEvent(event->GetRunNumber(), - event->GetEventNumberInFile(), - (char*)event->GetBeamType(), - event->GetMultiplicity()->GetNumberOfTracklets(),Form("%s/run%d/chunk%d.root",fStoragePath.c_str(),event->GetRunNumber(),chunkNumber)); - eventsInChunk++; if(eventsInChunk == fNumberOfEventsInFile)//if max events number in file was reached @@ -385,6 +401,40 @@ void AliStorageClientThread::CollectData() { fSavingStatus=STATUS_ERROR; } + + // save to event file as well: + + TFile *eventFile = new TFile(Form("%s/run%d/event%d.root", fStoragePath.c_str(),event->GetRunNumber(),eventsInChunk),"recreate"); + + if((currentRun = eventFile->mkdir(Form("run%d",event->GetRunNumber())))) + { + cout<<"CLIENT -- creating new directory for this run"<cd(); + } + else + { + cout<<"CLIENT -- opening existing directory for this run"<cd(Form("run%d",event->GetRunNumber())); + } + + if(0 == event->Write(Form("event%d",event->GetEventNumberInFile())) && + fSavingStatus!=STATUS_ERROR){fSavingStatus=STATUS_ERROR;} + else + { + eventFile->Close(); + delete eventFile; + fDatabase->InsertEvent(event->GetRunNumber(), + event->GetEventNumberInFile(), + (char*)event->GetBeamType(), + event->GetMultiplicity()->GetNumberOfTracklets(), + Form("%s/run%d/event%d.root",fStoragePath.c_str(), + event->GetRunNumber(), + eventsInChunk)); + + currentEvent.runNumber = event->GetRunNumber(); + currentEvent.eventNumber = event->GetEventNumberInFile(); + eventsToUpdate.push_back(currentEvent); + } delete event;event=0; //delete tree; } diff --git a/MONITOR/alistoragemanager/AliStorageDatabase.cxx b/MONITOR/alistoragemanager/AliStorageDatabase.cxx index cc394013918..606b92d475a 100644 --- a/MONITOR/alistoragemanager/AliStorageDatabase.cxx +++ b/MONITOR/alistoragemanager/AliStorageDatabase.cxx @@ -100,16 +100,52 @@ bool AliStorageDatabase::MarkEvent(struct eventStruct event) { TSQLResult* res; res = fServer->Query(Form("UPDATE %s SET permanent = 1 WHERE run_number = %d AND event_number = %d;",fTable.c_str(),event.runNumber,event.eventNumber)); - if(res) { - delete res; - return 1; - } - else { - delete res; - return 0; - } + if(!res) + { + cout<<"DATABASE -- couldn't update permanent flag"<Query(Form("UPDATE %s SET file_path = '%s' WHERE run_number = %d AND event_number = %d;",fTable.c_str(),Form("%s/permEvents.root",fStoragePath.c_str()), event.runNumber,event.eventNumber)); + if(!res) + { + cout<<"DATABASE -- couldn't update file's path. Unsetting permanent flag"<Query(Form("UPDATE %s SET permanent = 0 WHERE run_number = %d AND event_number = %d;",fTable.c_str(),event.runNumber,event.eventNumber)); + delete res; + return 0; + } + else + { + cout<<"DATABASE -- event marked"<Query(Form("UPDATE %s SET file_path = '%s' WHERE run_number = %d AND event_number = %d;",fTable.c_str(),newPath,event.runNumber,event.eventNumber)); + if(!res) + { + cout<<"DATABASE -- couldn't update file's path"< AliStorageDatabase::GetList(struct listRequestStruct list) { TSQLResult *result = fServer->Query(Form("SELECT * FROM %s WHERE run_number >= %d AND run_number <= %d AND event_number >= %d AND event_number <= %d AND multiplicity >= %d AND multiplicity <= %d AND (permanent = %d OR permanent = %d) AND (system = '%s' OR system = '%s') ORDER BY run_number,event_number;", @@ -164,7 +200,11 @@ AliESDEvent* AliStorageDatabase::GetEvent(struct eventStruct event) return NULL; } AliESDEvent *data; - tmpFile->GetObject(Form("event%d;1",event.eventNumber),data); + tmpFile->cd(Form("run%d",event.runNumber)); + data = (AliESDEvent*)gDirectory->Get(Form("event%d;1",event.eventNumber)); + + + // tmpFile->GetObject(Form("event%d;1",event.eventNumber),data); return data; } @@ -261,7 +301,7 @@ AliESDEvent* AliStorageDatabase::GetPrevEvent(struct eventStruct event) struct eventStruct AliStorageDatabase::GetOldestEvent() { - TSQLResult *result = fServer->Query(Form("SELECT * FROM %s ORDER BY run_number,event_number;",fTable.c_str())); + TSQLResult *result = fServer->Query(Form("SELECT * FROM %s WHERE permanent = 0 ORDER BY run_number,event_number;",fTable.c_str())); TSQLRow *row; struct eventStruct oldestEvent = {0,0}; diff --git a/MONITOR/alistoragemanager/AliStorageDatabase.h b/MONITOR/alistoragemanager/AliStorageDatabase.h index 2ca23743036..dfc92d822c5 100644 --- a/MONITOR/alistoragemanager/AliStorageDatabase.h +++ b/MONITOR/alistoragemanager/AliStorageDatabase.h @@ -22,6 +22,7 @@ public: char *filePath); //more parameters of the event can be added to this method bool MarkEvent(struct eventStruct event); + bool UpdateEventPath(struct eventStruct event,const char *newPath); void RemoveEvent(struct eventStruct event); void RemoveEventsWithPath(std::string path); std::string GetFilePath(struct eventStruct event); diff --git a/MONITOR/alistoragemanager/AliStorageServerThread.cxx b/MONITOR/alistoragemanager/AliStorageServerThread.cxx index 34b2bcd71bb..73545a808c4 100644 --- a/MONITOR/alistoragemanager/AliStorageServerThread.cxx +++ b/MONITOR/alistoragemanager/AliStorageServerThread.cxx @@ -134,7 +134,10 @@ bool AliStorageServerThread::MarkEvent(struct eventStruct event) cout<<"SERVER -- couldn't open temp file"<Get(Form("event%d",event.eventNumber)); + + tmpFile->cd(Form("run%d",event.runNumber)); + + AliESDEvent *eventToMark = (AliESDEvent*)gDirectory->Get(Form("event%d",event.eventNumber)); if(!eventToMark) { cout<<"SERVER -- couldn't find such event"<GetEventNumberInFile()<mkdir(Form("run%d",event.runNumber)))) - { - cout<<"SERVER -- creating new directory for this run"<cd(); - } - else - { - cout<<"SERVER -- opening existing directory for this run"<cd(Form("run%d",event.runNumber)); - } + //create new directory for this run + TDirectory *currentRun; + if((currentRun = permFile->mkdir(Form("run%d",event.runNumber)))) + { + cout<<"SERVER -- creating new directory for this run"<cd(); + } + else + { + cout<<"SERVER -- opening existing directory for this run"<cd(Form("run%d",event.runNumber)); + } - //try to add record to the database - if(!fDatabase->MarkEvent(event)) - { - cout<<"SERVER -- could not mark event in the database"<MarkEvent(event)) + { + cout<<"SERVER -- could not mark event in the database"<Write(Form("event%d",event.eventNumber)); - permFile->Close(); - tmpFile->Close(); + eventToMark->Write(Form("event%d",event.eventNumber)); + permFile->Close(); + tmpFile->Close(); - if(tmpFile){delete tmpFile;} - if(eventToMark){delete eventToMark;} - if(permFile){delete permFile;} -// if(currentRun)delete currentRun;//this line crashes if there is no permanent file yet - return true; + if(tmpFile){delete tmpFile;} + if(eventToMark){delete eventToMark;} + if(permFile){delete permFile;} + // if(currentRun)delete currentRun;//this line crashes if there is no permanent file yet + return true; } -- 2.43.0