73abe331 |
1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
3 | * * |
4 | * Author: The ALICE Off-line Project. * |
5 | * Contributors are mentioned in the code where appropriate. * |
6 | * * |
7 | * Permission to use, copy, modify and distribute this software and its * |
8 | * documentation strictly for non-commercial purposes is hereby granted * |
9 | * without fee, provided that the above copyright notice appears in all * |
10 | * copies and that both the copyright notice and this permission notice * |
11 | * appear in the supporting documentation. The authors make no claims * |
12 | * about the suitability of this software for any purpose. It is * |
13 | * provided "as is" without express or implied warranty. * |
14 | **************************************************************************/ |
15 | |
16 | /* |
17 | $Log$ |
18 | Revision 1.2 2005/09/13 08:41:15 byordano |
19 | default startTime endTime added |
20 | |
21 | Revision 1.4 2005/08/30 09:13:02 byordano |
22 | some docs added |
23 | |
24 | Revision 1.3 2005/08/29 21:15:47 byordano |
25 | some docs added |
26 | |
27 | */ |
28 | |
29 | // |
30 | // This class is the main manager for AliShuttle. |
31 | // It organizes the data retrieval from DCS and call the |
32 | // interface methods of AliCDBPreProcessor. |
33 | // For every detector in AliShuttleConfgi (see AliShuttleConfig), |
34 | // data for its set of aliases is retrieved. If there is registered |
35 | // AliCDBPreProcessor for this detector than it will be used |
36 | // accroding to the schema (see AliCDBPreProcessor). |
37 | // If there isn't registered AliCDBPreProcessor than the retrieved |
38 | // data is stored automatically to the undelying AliCDBStorage. |
39 | // For detSpec is used the alias name. |
40 | // |
41 | |
42 | #include "AliShuttle.h" |
43 | |
44 | #include "AliCDBManager.h" |
45 | #include "AliCDBStorage.h" |
46 | #include "AliCDBId.h" |
47 | #include "AliCDBPreProcessor.h" |
48 | #include "AliShuttleConfig.h" |
49 | #include "AliDCSClient.h" |
50 | #include "AliLog.h" |
51 | |
52 | #include <TObjString.h> |
53 | |
54 | ClassImp(AliShuttle) |
55 | |
56 | AliShuttle::AliShuttle(const AliShuttleConfig* config, |
57 | const char* cdbStorageURI, UInt_t timeout, Int_t retries): |
58 | fConfig(config), fStorage(NULL), fTimeout(timeout), fRetries(retries), |
59 | fCurrentRun(-1), fCurrentStartTime(0), fCurrentEndTime(0) |
60 | { |
61 | // |
62 | // config: AliShuttleConfig used |
63 | // cdbStorageURI: uri of the underlying AliCDBStorage |
64 | // timeout: timeout used for AliDCSClient connection |
65 | // retries: the number of retries in case of connection error. |
66 | // |
67 | |
68 | fStorage = AliCDBManager::Instance()->GetStorage(cdbStorageURI); |
69 | if (!fStorage) { |
70 | AliError(Form("Can't get valid storage object for %s!", |
71 | cdbStorageURI)); |
72 | } |
73 | } |
74 | |
75 | AliShuttle::AliShuttle(const AliShuttleConfig* config, |
76 | const AliCDBParam* param, UInt_t timeout, Int_t retries): |
77 | fConfig(config), fStorage(NULL), fTimeout(timeout), fRetries(retries), |
78 | fCurrentRun(-1), fCurrentStartTime(0), fCurrentEndTime(0) |
79 | { |
80 | // |
81 | // config: AliShuttleConfig used |
82 | // param: param of the underlying AliCDBStorage |
83 | // timeout: timeout used for AliDCSClient connection |
84 | // retries: the number of retries in case of connection error. |
85 | // |
86 | |
87 | fStorage = AliCDBManager::Instance()->GetStorage(param); |
88 | if (!fStorage) { |
89 | AliError(Form("Can't get valid storage object for %s!", |
90 | param->GetURI().Data())); |
91 | } |
92 | } |
93 | |
94 | AliShuttle::~AliShuttle() { |
95 | fPreProcessorMap.DeleteAll(); |
96 | } |
97 | |
98 | void AliShuttle::RegisterCDBPreProcessor(AliCDBPreProcessor* processor) { |
99 | // |
100 | // Registers new AliCDBPreProcessor. |
101 | // It uses GetName() for indentificator of the pre processor. |
102 | // The pre processor is registered it there isn't any other |
103 | // with the same identificator (GetName()). |
104 | // |
105 | |
106 | if (fPreProcessorMap.GetValue(processor->GetName())) { |
107 | AliWarning(Form("AliCDBPreProcessor %s is already registered!", |
108 | processor->GetName())); |
109 | return; |
110 | } |
111 | |
112 | fPreProcessorMap.Add(new TObjString(processor->GetName()), processor); |
113 | processor->SetShuttle(this); |
114 | } |
115 | |
116 | Bool_t AliShuttle::Store(const char* detector, const char* specType, |
117 | TObject* object, AliCDBMetaData* metaData) |
118 | { |
119 | if (!fStorage) { |
120 | AliError("Invalid storage object!"); |
121 | return kFALSE; |
122 | } |
123 | |
124 | AliCDBId id(AliCDBPath(detector, "DCS", specType), |
125 | GetCurrentRun(), GetCurrentRun()); |
126 | return fStorage->Put(object, id, metaData); |
127 | } |
128 | |
129 | void AliShuttle::Process(Int_t run, UInt_t startTime, UInt_t endTime) { |
130 | // |
131 | // Makes data retrieval for all detectors in the configuration. |
132 | // run: is the run number used |
133 | // startTime: is the run start time |
134 | // endTime: is the run end time |
135 | // |
136 | |
137 | TIter iter(fConfig->GetDetectors()); |
138 | TObjString* aDetector; |
139 | while ((aDetector = (TObjString*) iter.Next())) { |
140 | Process(run, startTime, endTime, aDetector->String()); |
141 | } |
142 | } |
143 | |
144 | void AliShuttle::Process(Int_t run, UInt_t startTime, UInt_t endTime, |
145 | const char* detector) |
146 | { |
147 | // |
148 | // Makes data retrieval just for one specific detector. |
149 | // Threre should be a configuration for this detector. |
150 | // run: is the run number used |
151 | // startTime: is the run start time |
152 | // endTime: is the run end time |
153 | // detector: detector for which the retrieval will be made |
154 | // |
155 | |
156 | AliInfo(Form("Retrieving values for %s, run %d", detector, run)); |
157 | |
158 | if (!fConfig->HasDetector(detector)) { |
159 | AliError(Form("There isn't any configuration for %s", |
160 | detector)); |
161 | return; |
162 | } |
163 | |
164 | fCurrentRun = run; |
165 | fCurrentStartTime = startTime; |
166 | fCurrentEndTime = endTime; |
167 | |
168 | TString host(fConfig->GetHost(detector)); |
169 | Int_t port = fConfig->GetPort(detector); |
170 | |
171 | AliCDBPreProcessor* aPreProcessor = |
172 | (AliCDBPreProcessor*) fPreProcessorMap.GetValue(detector); |
173 | |
174 | TIter iter(fConfig->GetAliases(detector)); |
175 | TObjString* anAlias; |
176 | |
177 | if (aPreProcessor) { |
178 | aPreProcessor->Initialize(run, startTime, endTime); |
179 | |
180 | TList valueSet; |
181 | while ((anAlias = (TObjString*) iter.Next())) { |
182 | Bool_t result = GetValueSet(host, port, |
183 | anAlias->String(), valueSet); |
184 | |
185 | aPreProcessor->Process(anAlias->String(), valueSet, |
186 | !result); |
187 | |
188 | valueSet.Delete(); |
189 | } |
190 | |
191 | aPreProcessor->Finalize(); |
192 | |
193 | } else { |
194 | AliCDBMetaData metaData; |
195 | metaData.SetProperty("StartTime", |
196 | new AliSimpleValue(startTime)); |
197 | metaData.SetProperty("EndTime", |
198 | new AliSimpleValue(endTime)); |
199 | metaData.SetComment("Automatically stored by AliShuttle!"); |
200 | |
201 | TList valueSet; |
202 | while ((anAlias = (TObjString*) iter.Next())) { |
203 | if (GetValueSet(host, port, anAlias->String(), |
204 | valueSet)) { |
205 | if (!Store(detector, anAlias->String(), |
206 | &valueSet, &metaData)) { |
207 | AliError(Form("Can't store %s for %s!", |
208 | anAlias->String().Data(), |
209 | detector)); |
210 | } |
211 | } |
212 | |
213 | valueSet.Delete(); |
214 | } |
215 | } |
216 | |
217 | fCurrentRun = -1; |
218 | fCurrentStartTime = 0; |
219 | fCurrentEndTime = 0; |
220 | } |
221 | |
222 | Bool_t AliShuttle::GetValueSet(const char* host, Int_t port, const char* alias, |
223 | TList& valueSet) |
224 | { |
225 | AliDCSClient client(host, port, fTimeout, fRetries); |
226 | if (!client.IsConnected()) { |
227 | return kFALSE; |
228 | } |
229 | |
230 | Int_t result = client.GetAliasValues(alias, |
231 | GetCurrentStartTime(), GetCurrentEndTime(), valueSet); |
232 | |
233 | if (result < 0) { |
234 | AliError(Form("Can't get '%s'! Reason: %s", |
235 | alias, AliDCSClient::GetErrorString(result))); |
236 | |
237 | if (result == AliDCSClient::fgkServerError) { |
238 | AliError(Form("Server error: %s", |
239 | client.GetServerError().Data())); |
240 | } |
241 | |
242 | return kFALSE; |
243 | } |
244 | |
245 | return kTRUE; |
246 | } |