]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MONITOR/MONITORzmq/AliStorageServerThread.cxx
adjusting verbosity if ITSSAPTracker
[u/mrichter/AliRoot.git] / MONITOR / MONITORzmq / AliStorageServerThread.cxx
1 #include "AliStorageServerThread.h"
2 #include "AliStorageTypes.h"
3 #include "AliESDEvent.h"
4
5 #include <iostream>
6 #include <fstream>
7
8 #include <TFile.h>
9 #include <TThread.h>
10
11 using namespace std;
12
13 AliStorageServerThread::AliStorageServerThread() :
14 fDatabase(0),
15 fStoragePath("")
16 {
17     fDatabase = new AliStorageDatabase();
18     
19     TThread::Lock();
20     //load parameters from config file
21     ifstream configFile (GetConfigFilePath());
22     if (configFile.is_open())
23     {
24         string line;
25         int from,to;
26         while(configFile.good())
27         {
28             getline(configFile,line);
29             from = line.find("\"")+1;
30             to = line.find_last_of("\"");
31             if(line.find("STORAGE_PATH=")==0){
32                 fStoragePath=line.substr(from,to-from);
33             }
34         }
35         if(configFile.eof()){configFile.clear();}
36         configFile.close();
37     }
38     else{cout<<"SERVER -- Unable to open config file"<<endl;}
39     TThread::UnLock();
40     
41     //start communication on socket
42     cout<<"Starting server's communication"<<endl;
43     StartCommunication();
44 }
45
46 AliStorageServerThread::~AliStorageServerThread()
47 {
48     cout<<"SERVER -- AliStorageServerThread destructor called";
49     if (fDatabase) {delete fDatabase;}
50     cout<<" --- OK"<<endl;
51 }
52
53 void AliStorageServerThread::StartCommunication()
54 {
55     AliStorageEventManager *eventManager = AliStorageEventManager::GetEventManagerInstance();
56     storageSockets socket = SERVER_COMMUNICATION_REP;
57     eventManager->CreateSocket(socket);
58     
59     struct serverRequestStruct *request;
60     
61     while(1)
62     {
63         cout<<"Server waiting for requests"<<endl;
64         request = eventManager->GetServerStruct(socket);
65         cout<<"Server received request"<<endl;
66         switch(request->messageType)
67         {
68             case REQUEST_LIST_EVENTS:
69             {
70                 cout<<"SERVER -- received request for list of events"<<endl;
71                 vector<serverListStruct> result = fDatabase->GetList(request->list);
72                 cout<<"SERVER -- got list from database"<<endl;
73                 eventManager->Send(result,socket);
74                 cout<<"SERVER -- list was sent"<<endl;
75                 break;
76             }
77             case REQUEST_GET_EVENT:
78             {
79                 TThread::Lock();
80                 AliESDEvent *event = fDatabase->GetEvent(request->event);
81                 TThread::UnLock();
82                 eventManager->Send(event,socket);
83                 delete event;
84                 break;
85             }
86             case REQUEST_GET_NEXT_EVENT:
87             {
88                 cout<<"NEXT EVENT request received"<<endl;
89                 AliESDEvent *event = fDatabase->GetNextEvent(request->event);
90                 eventManager->Send(event,socket);
91                 delete event;
92                 break;
93             }
94             case REQUEST_GET_PREV_EVENT:
95             {
96                 AliESDEvent *event = fDatabase->GetPrevEvent(request->event);
97                 eventManager->Send(event,socket);
98                 delete event;
99                 break;
100             }
101             case REQUEST_GET_LAST_EVENT:
102             {
103                 AliESDEvent *event = fDatabase->GetLastEvent();
104                 eventManager->Send(event,socket);
105                 delete event;
106                 break;
107             }
108             case REQUEST_GET_FIRST_EVENT:
109             {
110                 AliESDEvent *event = fDatabase->GetFirstEvent();
111                 eventManager->Send(event,socket);
112                 delete event;
113                 break;
114             }
115             case REQUEST_MARK_EVENT:
116             {
117                 struct eventStruct *markData  = &(request->event);
118                 eventManager->Send(MarkEvent(*markData),socket);
119                 break;
120             }
121             default:
122                 sleep(1);
123                 break;
124         }
125         
126     }
127 }
128
129 bool AliStorageServerThread::MarkEvent(struct eventStruct event)
130 {
131     string pathToFile = fDatabase->GetFilePath(event);
132     TFile *tmpFile = new TFile(pathToFile.c_str(),"read");
133     if(!tmpFile)
134     {
135         cout<<"SERVER -- couldn't open temp file"<<endl;
136         return false;
137     }
138     
139     tmpFile->cd(Form("run%d",event.runNumber));
140     
141     AliESDEvent *eventToMark = (AliESDEvent*)gDirectory->Get(Form("event%d",event.eventNumber));
142     if(!eventToMark)
143     {
144         cout<<"SERVER -- couldn't find such event"<<endl;
145         if(tmpFile){tmpFile->Close();delete tmpFile;}
146         return false;
147     }
148     cout<<"SERVER -- Marking event:"<<eventToMark->GetEventNumberInFile()<<endl;
149     
150     TFile *permFile = new TFile(Form("%s/permEvents.root",fStoragePath.c_str()),"update");//open/create perm file
151     
152     if(!permFile)
153     {
154         cout<<"SERVER -- Couldn't open perm file"<<endl;
155         if(tmpFile){tmpFile->Close();delete tmpFile;}
156         if(eventToMark){delete eventToMark;}
157         return false;
158     }
159     
160     //create new directory for this run
161     TDirectory *currentRun;
162     if((currentRun = permFile->mkdir(Form("run%d",event.runNumber))))
163     {
164         cout<<"SERVER -- creating new directory for this run"<<endl;
165         currentRun->cd();
166     }
167     else
168     {
169         cout<<"SERVER -- opening existing directory for this run"<<endl;
170         permFile->cd(Form("run%d",event.runNumber));
171     }
172     
173     //try to add record to the database
174     if(!fDatabase->MarkEvent(event))
175     {
176         cout<<"SERVER -- could not mark event in the database"<<endl;
177         if(tmpFile){delete tmpFile;}
178         if(eventToMark){delete eventToMark;}
179         if(permFile){delete permFile;}
180         return false;
181     }
182     
183     eventToMark->Write(Form("event%d",event.eventNumber));
184     permFile->Close();
185     tmpFile->Close();
186     
187     if(tmpFile){delete tmpFile;}
188     if(eventToMark){delete eventToMark;}
189     if(permFile){delete permFile;}
190     //  if(currentRun)delete currentRun;//this line crashes if there is no permanent file yet
191     return true;
192 }
193