searching also the possible specific OCDB storages when querying objects
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 10 Sep 2010 11:30:44 +0000 (11:30 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 10 Sep 2010 11:30:44 +0000 (11:30 +0000)
make use of caching in CDBManager, only load objects directly from the storage if there is a newer version
this accounts for https://savannah.cern.ch/bugs/?57740

HLT/rec/AliHLTMiscImplementation.cxx
HLT/rec/AliHLTMiscImplementation.h

index 8d2fa5f..7047fe4 100644 (file)
@@ -111,12 +111,35 @@ int AliHLTMiscImplementation::GetCDBRunNo() const
 AliCDBEntry* AliHLTMiscImplementation::LoadOCDBEntry(const char* path, int runNo, int version, int subVersion) const
 {
   // see header file for function documentation
-  AliCDBStorage* store = AliCDBManager::Instance()->GetDefaultStorage();
+  AliCDBManager* man = AliCDBManager::Instance();
+  if (!man) return NULL;
+
+  const char* uri=man->GetURI(path);
+  if (!uri) return NULL;
+
+  AliCDBStorage* store = AliCDBManager::Instance()->GetStorage(uri);
   if (!store) {
     return NULL;
   }
+
+  TString strUri=store->GetURI();
+  bool bIsGrid=strUri.BeginsWith("alien://");
+
   if (version<0) version = store->GetLatestVersion(path, runNo);
-  if (subVersion<0) subVersion = store->GetLatestSubVersion(path, runNo, version);
+
+  // OCDB objects on GRID have no sub version
+  if (subVersion<0 && !bIsGrid) subVersion = store->GetLatestSubVersion(path, runNo, version);
+  AliCDBEntry* entry=man->Get(path, runNo, version, subVersion);
+  if (entry) {
+    // there seems to be a problem with the caching of objects in the CDBManager
+    // regardless what version is specified it returns the object from the cache
+    AliCDBId id=entry->GetId();
+    if (id.GetVersion()==version &&
+       id.GetSubVersion()==subVersion) {
+      // entry in the cache has the correct version
+      return entry;
+    }
+  }
   return store->Get(path, runNo, version, subVersion);
 }
 
@@ -152,6 +175,8 @@ int AliHLTMiscImplementation::CheckOCDBEntries(const TMap* const pMap) const
       pStorage=AliCDBManager::Instance()->GetDefaultStorage();
     }
 
+    // FIXME: this will fail as soon as we have several specific storages
+    // access to the internal mapping information for specific storages is needed
     if (pStorage->GetLatestVersion(pEntry->GetName(), runNo)<0) {
       AliHLTLogging log;
       log.Logging(kHLTLogError, "CheckOCDBEntries", "CDB handling", "can not find required OCDB object %s for run number %d in storage %s", pEntry->GetName(), runNo, pStorage->GetURI().Data());
@@ -226,6 +251,12 @@ AliHLTUInt32_t AliHLTMiscImplementation::GetEventType(AliRawReader* rawReader) c
   return eventHeader->Get("Type");
 }
 
+const char* AliHLTMiscImplementation::GetBeamTypeFromGRP() const
+{
+  // get beam type from GRP
+  return NULL;
+}
+
 Double_t AliHLTMiscImplementation::GetBz()
 {
   // Returns Bz.
index 8946458..66feaae 100644 (file)
@@ -37,6 +37,7 @@ class AliHLTMiscImplementation : public AliHLTMisc
 
   AliHLTUInt32_t GetTimeStamp(AliRawReader* rawReader) const;
   AliHLTUInt32_t GetEventType(AliRawReader* rawReader) const;
+  const char* GetBeamTypeFromGRP() const;
 
   Double_t GetBz();
   Double_t GetBz(const Double_t *r);