]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Adding the possibility to specify SEs for mirroring when putting an object on AliEn
authorrgrosso <rgrosso@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 27 Aug 2012 15:40:57 +0000 (15:40 +0000)
committerrgrosso <rgrosso@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 27 Aug 2012 15:40:57 +0000 (15:40 +0000)
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/AliCDBManager.cxx
STEER/CDB/AliCDBManager.h
STEER/CDB/AliCDBStorage.cxx
STEER/CDB/AliCDBStorage.h

index ae2bf61fe6a46348d97dbf7ff54b67d18e1a3f1b..275b6747864dd14420ae3f8e7974798a81325172 100644 (file)
@@ -648,7 +648,7 @@ TList* AliCDBDump::GetEntries(const AliCDBId& queryId) {
 }
 
 //_____________________________________________________________________________
-Bool_t AliCDBDump::PutEntry(AliCDBEntry* entry) {
+Bool_t AliCDBDump::PutEntry(AliCDBEntry* entry, const char* mirrors) {
 // put an AliCDBEntry object into the database
 
        TDirectory::TContext context(gDirectory, fFile);
@@ -663,6 +663,10 @@ Bool_t AliCDBDump::PutEntry(AliCDBEntry* entry) {
                return kFALSE;
        }
 
+       TString mirrorsString(mirrors);
+       if(!mirrorsString.IsNull())
+               AliError("AliCDBDump storage cannot take mirrors into account.");
+
        AliCDBId& id = entry->GetId();
        
         if (!gDirectory->cd(id.GetPath())) {
index aeca641f7790305cd2f77a945492a084e27f9c06..a339f57f5ff3abd0f125aa2d1a94318a87af4c5d 100644 (file)
@@ -35,7 +35,7 @@ protected:
        virtual AliCDBEntry*    GetEntry(const AliCDBId& query);
        virtual AliCDBId*       GetEntryId(const AliCDBId& query);
         virtual TList*                 GetEntries(const AliCDBId& query);
-        virtual Bool_t                 PutEntry(AliCDBEntry* entry);
+        virtual Bool_t                 PutEntry(AliCDBEntry* entry, const char* mirrors="");
        virtual TList*          GetIdListFromFile(const char* fileName);
 
 private:
index 7b712820a8cb315649c2be6a885c718dc633b8bb..85d63b64e367e749ef5389389c0c091ec7fdf5f8 100644 (file)
@@ -709,7 +709,7 @@ TList* AliCDBGrid::GetEntries(const AliCDBId& queryId) {
 }
 
 //_____________________________________________________________________________
-Bool_t AliCDBGrid::PutEntry(AliCDBEntry* entry) {
+Bool_t AliCDBGrid::PutEntry(AliCDBEntry* entry, const char* mirrors) {
 // put an AliCDBEntry object into the database
 
        AliCDBId& id = entry->GetId();
@@ -731,35 +731,59 @@ Bool_t AliCDBGrid::PutEntry(AliCDBEntry* entry) {
        TDirectory* saveDir = gDirectory;
 
        TString fullFilename = Form("/alien%s", filename.Data());
+       TString seMirrors(mirrors);
        // specify SE to filename
-       if (fSE != "default") fullFilename += Form("?se=%s",fSE.Data());
+       // if a list of SEs was passed, set the first as SE for opening the file. The others will be used in cascade in case of
+       // failure in opening the file. The remaining will be used to create replicas.
+       TObjArray *arraySEs = seMirrors.Tokenize(',');
+       Int_t nSEs = arraySEs->GetEntries();
+       Int_t remainingSEs = 1;
+       if(nSEs == 0){
+           if (fSE != "default") fullFilename += Form("?se=%s",fSE.Data());
+       }else{
+           remainingSEs = nSEs;
+       }
 
-       Int_t nsleep = fInitRetrySeconds;
        // open file
        TFile *file=0;
        AliDebug(2, Form("fNretry = %d, fInitRetrySeconds = %d",fNretry,fInitRetrySeconds));
-       for(Int_t i=0; i<=fNretry; ++i) {
-               AliDebug(2, Form("Putting the file in the OCDB: Retry n. %d",i));
+       TString targetSE("");
+       while(remainingSEs>0){
+           if(nSEs!=0){
+               TObjString *target = (TObjString*) arraySEs->At(nSEs-remainingSEs);
+               targetSE=target->String();
+               if ( !(targetSE.BeginsWith("ALICE::") && targetSE.CountChar(':')==4) ) {
+                   AliError(Form("\"%s\" is an invalid storage element identifier.",targetSE.Data()));
+                   continue;
+               }
+               fullFilename.Remove(fullFilename.Last('?'));
+               fullFilename += Form("?se=%s",targetSE.Data());
+           }
+           Int_t remainingAttempts=fNretry;
+           Int_t nsleep = fInitRetrySeconds; // number of seconds between attempts. We let it increase exponentially
+           while(remainingAttempts > 0) {
+               AliDebug(2, Form("Putting the file in the OCDB - Attempt n. %d",fNretry-remainingAttempts+1));
                file = TFile::Open(fullFilename,"CREATE");
+               remainingAttempts--;
                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) {
-                               AliError(Form("After %d retries, failing putting the object in the OCDB - returning...",i));
-                               return kFALSE;
-                       }
-                       else {
-                               AliDebug(2,Form("Retry %d failed, sleeping for %d seconds",i,nsleep));
-                               sleep(nsleep);
-                       }
-               } 
-               else {
-                       AliDebug(2, " Successful!");
-                       break;
+                   AliError(Form("Can't open file <%s>!", filename.Data()));
+                   if(file && !file->IsWritable()) file->Close(); delete file; file=0;
+                   AliDebug(2,Form("Attempt %d failed, sleeping for %d seconds",fNretry-remainingAttempts+1,nsleep));
+                   if(remainingAttempts>0) sleep(nsleep);
+               }else{
+                   remainingAttempts=0;
                }
                nsleep*=fInitRetrySeconds;
+           }
+           remainingSEs--;
+           if(file) break;
+       }
+       if(!file){
+           AliError(Form("All %d attempts have failed on all %d SEs. Returning...",fNretry,nSEs));
+           return kFALSE;
        }
 
+
        file->cd();
 
        //SetTreeToFile(entry, file);
@@ -787,7 +811,25 @@ Bool_t AliCDBGrid::PutEntry(AliCDBEntry* entry) {
        }
 
        AliInfo(Form("CDB object stored into file %s", filename.Data()));
-       AliInfo(Form("Storage Element: %s", fSE.Data()));
+       if(nSEs==0)
+           AliInfo(Form("Storage Element: %s", fSE.Data()));
+       else
+           AliInfo(Form("Storage Element: %s", targetSE.Data()));
+
+       //In case of other SEs specified by the user, mirror the file to the remaining SEs
+       while(remainingSEs>0){
+           TString mirrorCmd("mirror ");
+           mirrorCmd += filename;
+           mirrorCmd += " ";
+           TObjString *target = (TObjString*) arraySEs->At(nSEs-remainingSEs);
+           TString mirrorSE(target->String());
+           mirrorCmd += mirrorSE;
+           AliDebug(5,Form("mirror command: \"%s\"",mirrorCmd.Data()));
+           AliInfo(Form("Mirroring to storage element: %s", mirrorSE.Data()));
+           gGrid->Command(mirrorCmd.Data());
+           remainingSEs--;
+       }
+
        return result;
 }
 //_____________________________________________________________________________
index 24f18da394f05f52b7262de7c9f2b6dcceeb5a55..155d1771547a4c32ae078e64dc3d68c075a0a8b7 100644 (file)
@@ -33,7 +33,7 @@ protected:
        virtual AliCDBEntry*    GetEntry(const AliCDBId& queryId);
        virtual AliCDBId*       GetEntryId(const AliCDBId& queryId);
        virtual TList*          GetEntries(const AliCDBId& queryId);
-       virtual Bool_t          PutEntry(AliCDBEntry* entry);
+       virtual Bool_t          PutEntry(AliCDBEntry* entry, const char* mirrors="");
        virtual TList*          GetIdListFromFile(const char* fileName);
 
 private:
index d3f046cc9b38e066ade4c8217c1b706225052dc9..d2ea6bbb7aa420ed88f7b615380e8758cf31f86e 100644 (file)
@@ -720,7 +720,7 @@ TList* AliCDBLocal::GetEntries(const AliCDBId& queryId) {
 }
 
 //_____________________________________________________________________________
-Bool_t AliCDBLocal::PutEntry(AliCDBEntry* entry) {
+Bool_t AliCDBLocal::PutEntry(AliCDBEntry* entry, const char* mirrors) {
 // put an AliCDBEntry object into the database
 
        AliCDBId& id = entry->GetId();
@@ -737,6 +737,10 @@ Bool_t AliCDBLocal::PutEntry(AliCDBEntry* entry) {
                return kFALSE;
        }
 
+       TString mirrorsString(mirrors);
+       if(!mirrorsString.IsNull())
+               AliError("AliCDBLocal storage cannot take mirrors into account.");
+
        // open file
        TFile file(filename, "CREATE");
        if (!file.IsOpen()) {
index 193eb3fdf20830ff8ff4da49b15b708a2d3a04e4..fc206efaf756b0bf51d248212b68699b2c05d8f3 100644 (file)
@@ -32,7 +32,7 @@ protected:
        virtual AliCDBEntry*    GetEntry(const AliCDBId& queryId);
        virtual AliCDBId*       GetEntryId(const AliCDBId& queryId);
         virtual TList*                 GetEntries(const AliCDBId& queryId);
-        virtual Bool_t                 PutEntry(AliCDBEntry* entry);
+        virtual Bool_t                 PutEntry(AliCDBEntry* entry, const char* mirrors="");
        virtual TList*          GetIdListFromFile(const char* fileName);
 
 private:
index e3065d1c56bb916a22c5af13a3a59cac164861bb..d9524b76936ec3d8951916b90e6b3de092ad02dc 100644 (file)
@@ -1217,13 +1217,13 @@ Bool_t AliCDBManager::Put(TObject* object, const AliCDBId& id, AliCDBMetaData* m
        } 
 
        AliCDBEntry anEntry(object, id, metaData);
-       return Put(&anEntry, type);
+       return Put(&anEntry, "", type);
 
 }
 
 
 //_____________________________________________________________________________
-Bool_t AliCDBManager::Put(AliCDBEntry* entry, DataType type){
+Bool_t AliCDBManager::Put(AliCDBEntry* entry, const char* mirrors, DataType type){
 // store an AliCDBEntry object into the database
 
        if(type == kPrivate && !fDefaultStorage) {
@@ -1276,7 +1276,7 @@ Bool_t AliCDBManager::Put(AliCDBEntry* entry, DataType type){
 
        AliDebug(2,Form("Storing object into storage: %s", aStorage->GetURI().Data()));
 
-       Bool_t result = aStorage->Put(entry, type);
+       Bool_t result = aStorage->Put(entry, mirrors, type);
 
        if(fRun >= 0) QueryCDB();
 
index 9ac4d58f7415036353f090929fc135b10c17bbb2..c1ae71ed43866e6b4e47d497168fcdbfbc1b5e7a 100644 (file)
@@ -89,7 +89,7 @@ class AliCDBManager: public TObject {
 
        Bool_t Put(TObject* object, const AliCDBId& id,
                        AliCDBMetaData* metaData, const DataType type=kPrivate);
-       Bool_t Put(AliCDBEntry* entry, DataType type=kPrivate);
+       Bool_t Put(AliCDBEntry* entry, const char* mirrors="", DataType type=kPrivate);
 
        void SetCacheFlag(Bool_t cacheFlag) {fCache=cacheFlag;}
        Bool_t GetCacheFlag() const {return fCache;}
index f36a9c7638162d0fb42dd29a698c6f406d7e8210..301f61f6f26c67ba12f6acd83986a6230d990f6f 100644 (file)
@@ -385,11 +385,11 @@ Bool_t AliCDBStorage::Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaDat
 
        AliCDBEntry anEntry(object, id, metaData);
 
-       return Put(&anEntry, type);
+       return Put(&anEntry, "", type);
 }
 
 //_____________________________________________________________________________
-Bool_t AliCDBStorage::Put(AliCDBEntry* entry, AliCDBManager::DataType type) {
+Bool_t AliCDBStorage::Put(AliCDBEntry* entry, const char* mirrors, AliCDBManager::DataType type) {
 // store an AliCDBEntry object into the database
 
        if (!entry){
@@ -423,7 +423,7 @@ Bool_t AliCDBStorage::Put(AliCDBEntry* entry, AliCDBManager::DataType type) {
                        return 0;
        }
 
-       return PutEntry(entry);
+       return PutEntry(entry,mirrors);
 }
 
 //_____________________________________________________________________________
index 30f844b987d4d00b77589395988316082a9807ba..72bab165746aa5e3ae20495965d150a33e00da33 100644 (file)
@@ -86,7 +86,7 @@ public:
 
        Bool_t Put(TObject* object, AliCDBId& id,  AliCDBMetaData* metaData,
                                AliCDBManager::DataType type=AliCDBManager::kPrivate);
-       Bool_t Put(AliCDBEntry* entry, AliCDBManager::DataType type=AliCDBManager::kPrivate);
+       Bool_t Put(AliCDBEntry* entry, const char* mirrors="", AliCDBManager::DataType type=AliCDBManager::kPrivate);
 
        virtual Bool_t IsReadOnly() const = 0;
        virtual Bool_t HasSubVersion() const = 0;
@@ -109,7 +109,7 @@ protected:
        virtual AliCDBEntry* GetEntry(const AliCDBId& query) = 0;
        virtual AliCDBId* GetEntryId(const AliCDBId& query) = 0;
        virtual TList* GetEntries(const AliCDBId& query) = 0;
-       virtual Bool_t PutEntry(AliCDBEntry* entry) = 0;
+       virtual Bool_t PutEntry(AliCDBEntry* entry, const char* mirrors="") = 0;
        virtual TList *GetIdListFromFile(const char* fileName)=0;
        virtual void   QueryValidFiles() = 0;
        void    LoadTreeFromFile(AliCDBEntry* entry) const;