Implementing the exponential retry when putting an object in the OCDB. The function...
authorzampolli <zampolli@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 18 Aug 2011 09:01:36 +0000 (09:01 +0000)
committerzampolli <zampolli@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 18 Aug 2011 09:01:36 +0000 (09:01 +0000)
only in case the storage is an AliCDBGrid (on alien). In the other cases, a message is printed.
This is to make the method as general as possible (the user does not need to know a priori the
type of storage).

Example to use it:

        TGrid::Connect("alien://");
AliCDBManager* man = AliCDBManager::Instance();
//man->SetDefaultStorage("alien://folder=/alice/cern.ch/user/z/zampolli/"); // example for Gird storage
        man->SetDefaultStorage("local:///Users/zampolli"); // example for local storage
AliCDBStorage* sto = man->GetDefaultStorage();  // or: AliCDBStorage* sto = man->GetStorage("alien://folder=/alice/cern.ch/user/z/zampolli/");
sto->SetRetry(2,10);

STEER/CDB/AliCDBDump.cxx
STEER/CDB/AliCDBDump.h
STEER/CDB/AliCDBGrid.cxx
STEER/CDB/AliCDBGrid.h
STEER/CDB/AliCDBLocal.cxx
STEER/CDB/AliCDBLocal.h
STEER/CDB/AliCDBStorage.cxx
STEER/CDB/AliCDBStorage.h

index 512aece..4ea87f4 100644 (file)
@@ -805,6 +805,14 @@ Int_t AliCDBDump::GetLatestSubVersion(const char* path, Int_t run, Int_t version
 
 }
 
+//_____________________________________________________________________________
+void AliCDBDump::SetRetry(Int_t nretry, Int_t totsec) {
+
+       // Function to set the exponential retry for putting entries in the OCDB
+
+       AliInfo("This function sets the exponential retry for putting entries in the OCDB - to be used ONLY for AliCDBGrid --> returning without doing anything");
+       return;
+} 
 
 /////////////////////////////////////////////////////////////////////////////////////////////////
 //                                                                                             //
index 4c54ae6..4a56c5a 100644 (file)
@@ -28,6 +28,7 @@ public:
        virtual Int_t GetLatestVersion(const char* path, Int_t run);
        virtual Int_t GetLatestSubVersion(const char* path, Int_t run, Int_t version=-1);
        virtual Bool_t IdToFilename(const AliCDBId& id, TString& filename) const;
+       virtual void SetRetry(Int_t nretry, Int_t totsec);
 
 protected:
 
index c8ccb48..766f359 100644 (file)
@@ -29,6 +29,7 @@
 #include <TList.h>
 #include <TObjArray.h>
 #include <TObjString.h>
+#include <TMath.h>
 #include <TRegexp.h>
 
 #include "AliLog.h"
@@ -220,6 +221,17 @@ Bool_t AliCDBGrid::IdToFilename(const AliCDBId& id, TString& filename) const {
 }
 
 //_____________________________________________________________________________
+void AliCDBGrid::SetRetry(Int_t nretry, Int_t totsec) {
+
+       // Function to set the exponential retry for putting entries in the OCDB
+
+       const Double_t klog2 = TMath::Log(2.);
+       fNretry = nretry;
+       fRetrySeconds = TMath::Max(TMath::Exp(TMath::Log(totsec)-nretry*klog2),1.);
+} 
+
+
+//_____________________________________________________________________________
 Bool_t AliCDBGrid::PrepareId(AliCDBId& id) {
 // prepare id (version) of the object that will be stored (called by PutEntry)
 
@@ -718,13 +730,25 @@ Bool_t AliCDBGrid::PutEntry(AliCDBEntry* entry) {
        // specify SE to filename
        if (fSE != "default") fullFilename += Form("?se=%s",fSE.Data());
 
+       Int_t nsleep =1;
        // open file
-       TFile *file = TFile::Open(fullFilename,"CREATE");
-       if(!file || !file->IsWritable()){
-               AliError(Form("Can't open file <%s>!", filename.Data()));
-               if(file && !file->IsWritable()) file->Close(); delete file; file=0;
-               return kFALSE;
-       }
+       TFile *file=0;
+       Printf("fNretry = %d, fRetrySeconds = %d",fNretry,fRetrySeconds);
+       for(Int_t i=0; i<=fNretry; ++i) {
+               AliDebug(2, Form("Putting the file in the OCDB: Retry n. %d",i));
+               file = TFile::Open(fullFilename,"CREATE");
+               if(!file || !file->IsWritable()){
+                       AliError(Form("Can't open file <%s>!", filename.Data()));
+                       if(file && !file->IsWritable()) file->Close(); delete file; file=0;
+                       if(i==fNretry) return kFALSE;
+                       else sleep(fRetrySeconds*nsleep);
+               } 
+               else {
+                       AliDebug(2, " Successful!");
+                       break;
+               }
+               nsleep*=2;
+       }
 
        file->cd();
 
index c8815f3..a41d0db 100644 (file)
@@ -26,6 +26,7 @@ public:
        virtual Int_t  GetLatestVersion(const char* path, Int_t run);
        virtual Int_t  GetLatestSubVersion(const char* path, Int_t run, Int_t version);
        virtual Bool_t IdToFilename(const AliCDBId& id, TString& filename) const;
+       virtual void SetRetry(Int_t nretry, Int_t totsec);
 
 protected:
 
index b9651e9..7b63b9b 100644 (file)
@@ -980,6 +980,16 @@ AliCDBStorage* AliCDBLocalFactory::Create(const AliCDBParam* param) {
 
        return NULL;
 }
+//_____________________________________________________________________________
+void AliCDBLocal::SetRetry(Int_t nretry, Int_t totsec) {
+
+       // Function to set the exponential retry for putting entries in the OCDB
+
+       AliInfo("This function sets the exponential retry for putting entries in the OCDB - to be used ONLY for AliCDBGrid --> returning without doing anything");
+       return;
+} 
+
+
 
 /////////////////////////////////////////////////////////////////////////////////////////////////
 //                                                                                             //
index 3113d47..8edc8ea 100644 (file)
@@ -25,6 +25,7 @@ public:
        virtual Int_t  GetLatestVersion(const char* path, Int_t run);
        virtual Int_t  GetLatestSubVersion(const char* path, Int_t run, Int_t version=-1);
        virtual Bool_t IdToFilename(const AliCDBId& id, TString& filename) const;
+       virtual void SetRetry(Int_t nretry, Int_t totsec);
 
 protected:
 
index 9112ec6..bfa7ad6 100644 (file)
@@ -36,7 +36,9 @@ fMetaDataFilter(0),
 fSelections(),
 fURI(),
 fType(),
-fBaseFolder()
+fBaseFolder(),
+fNretry(0),
+fRetrySeconds(0)
 {
 // constructor
 
index d8c3fcf..1b4fcd5 100644 (file)
@@ -100,6 +100,7 @@ public:
 
        virtual Int_t GetLatestVersion(const char* path, Int_t run)=0;
        virtual Int_t GetLatestSubVersion(const char* path, Int_t run, Int_t version=-1)=0;
+       virtual void SetRetry(Int_t nretry, Int_t totsec) = 0;
 
 protected:
 
@@ -124,6 +125,8 @@ protected:
        TString fURI;           // storage URI;
        TString fType;    //! Local, Grid: base folder name - Dump: file name
        TString fBaseFolder;    //! Local, Grid: base folder name - Dump: file name
+       Short_t    fNretry;              // Number of retries in opening the file
+        Short_t    fRetrySeconds;        // Seconds for first retry
 
 private:
        AliCDBStorage(const AliCDBStorage & source);