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